为什么这个 SQL INSERT 会在没有引发和异常的情况下失败?
Why is this SQL INSERT failing without raising and exception?
我在 Azure SQL 上插入 table 时遇到问题,它失败了 - 在使用 ExecuteNonQuery
命令受影响的行上返回 -1。
Table 看起来像这样:
代码是这样的:
private void SaveUrls(ArrayList alUrls)
{
int rows = 0;
this.Cursor = Cursors.WaitCursor;
foreach (string url in alUrls)
{
try
{
// INSERT INTO URLS (UrlHash,URLPath,DiscoveryDate,IsInProcessingQueue) VALUES('83B2DE6A8247D2F0C1F674DA0DC4E173230C541542D0A4852A8F83AC8A874D43E2A9335B3A505A50DBC735592D792E9A2564FF556EB3286C7F974A0EDE995F46','http://google.com/blog-entry-4835.html', getutcdate(), False)
// INSERT INTO URLS (UrlHash,URLPath,DiscoveryDate,DiscoveredById,IsInProcessingQueue) VALUES('83B2DE6A8247D2F0C1F674DA0DC4E173230C541542D0A4852A8F83AC8A874D43E2A9335B3A505A50DBC735592D792E9A2564FF556EB3286C7F974A0EDE995F46','http://google.com/blog-entry-4835.html', getutcdate(), 1006, False)
// INSERT INTO [dbo].[URLS] ([UrlId], [UrlHash], [URLPath], [DiscoveryDate], [DiscoveredById], [ProcessedDate], [ProcessedById], [IsInProcessingQueue], [JoinedProcessingQueueDate]) VALUES (1, N'83B2DE6A8247D2F0C1F674DA0DC4E173230C541542D0A4852A8F83AC8A874D43E2A9335B3A505A50DBC735592D792E9A2564FF556EB3286C7F974A0EDE995F46', N'http://google.com/blog-entry-4835.html', N'2015-03-05 22:44:18', 1006, NULL, NULL, 0, NULL)
// INSERT INTO URLS ([UrlId], [UrlHash], [URLPath], [DiscoveryDate], [DiscoveredById], [ProcessedDate], [ProcessedById], [IsInProcessingQueue], [JoinedProcessingQueueDate]) VALUES(N'83B2DE6A8247D2F0C1F674DA0DC4E173230C541542D0A4852A8F83AC8A874D43E2A9335B3A505A50DBC735592D792E9A2564FF556EB3286C7F974A0EDE995F46',N'http://google.com/blog-entry-4835.html',N'getutcdate()', 1006, ,,False,)
// INSERT INTO URLS ([UrlId], [UrlHash], [URLPath], [DiscoveryDate], [DiscoveredById], [ProcessedDate], [ProcessedById], [IsInProcessingQueue], [JoinedProcessingQueueDate]) VALUES(N'83B2DE6A8247D2F0C1F674DA0DC4E173230C541542D0A4852A8F83AC8A874D43E2A9335B3A505A50DBC735592D792E9A2564FF556EB3286C7F974A0EDE995F46',N'http://google.com/blog-entry-4835.html',N'getutcdate()', 1006, '','',False,'')
SqlCommand command = new SqlCommand("INSERT INTO URLS ([UrlId], [UrlHash], [URLPath], [DiscoveryDate], [DiscoveredById], [ProcessedDate], [ProcessedById], [IsInProcessingQueue], [JoinedProcessingQueueDate]) VALUES(N'" + HashPassword(url) + "',N'" + url + "',N'getutcdate()', 1006, '" + null+ "','" + null + "'," + false + ",'" + null + "')");
command.CommandType = CommandType.Text;
command.Connection = con;
rows += command.ExecuteNonQuery();
}
catch (SqlException sqle)
{
Log("SQL ERROR: SaveUrls " + sqle.Message);
}
Application.DoEvents();
}
this.Cursor = Cursors.Default;
Log("Seeded URLS Table with " + rows.ToString("N0") + " rows");
alUrls.Clear();
}
更新:
table 之间的关系如下:
更新 2:
- 没有异常产生
- 即使删除了 UrlId,插入也会失败。
您的 INSERT 语句指定了 UrlId
字段,但您提供的第一个值是散列。
INSERT INTO URLS ([UrlId], [UrlHash], [URLPath]...
应该是
INSERT INTO URLS ([UrlHash], [URLPath]...
此外,正如其他人在评论中所说,使用参数而不是构建 SQL 字符串!
答案是 varchar(128) 的 URLHash 列太小,无法容纳 128 个字符的字符串!
我不知道它是如何工作的,但是在删除约束并将 varchar(128) 更改为 nvarchar(256) 之后(不知道为什么它仍然是 varchar)我恢复了约束,嘿,它很快就起作用了。
我在 Azure SQL 上插入 table 时遇到问题,它失败了 - 在使用 ExecuteNonQuery
命令受影响的行上返回 -1。
Table 看起来像这样:
代码是这样的:
private void SaveUrls(ArrayList alUrls)
{
int rows = 0;
this.Cursor = Cursors.WaitCursor;
foreach (string url in alUrls)
{
try
{
// INSERT INTO URLS (UrlHash,URLPath,DiscoveryDate,IsInProcessingQueue) VALUES('83B2DE6A8247D2F0C1F674DA0DC4E173230C541542D0A4852A8F83AC8A874D43E2A9335B3A505A50DBC735592D792E9A2564FF556EB3286C7F974A0EDE995F46','http://google.com/blog-entry-4835.html', getutcdate(), False)
// INSERT INTO URLS (UrlHash,URLPath,DiscoveryDate,DiscoveredById,IsInProcessingQueue) VALUES('83B2DE6A8247D2F0C1F674DA0DC4E173230C541542D0A4852A8F83AC8A874D43E2A9335B3A505A50DBC735592D792E9A2564FF556EB3286C7F974A0EDE995F46','http://google.com/blog-entry-4835.html', getutcdate(), 1006, False)
// INSERT INTO [dbo].[URLS] ([UrlId], [UrlHash], [URLPath], [DiscoveryDate], [DiscoveredById], [ProcessedDate], [ProcessedById], [IsInProcessingQueue], [JoinedProcessingQueueDate]) VALUES (1, N'83B2DE6A8247D2F0C1F674DA0DC4E173230C541542D0A4852A8F83AC8A874D43E2A9335B3A505A50DBC735592D792E9A2564FF556EB3286C7F974A0EDE995F46', N'http://google.com/blog-entry-4835.html', N'2015-03-05 22:44:18', 1006, NULL, NULL, 0, NULL)
// INSERT INTO URLS ([UrlId], [UrlHash], [URLPath], [DiscoveryDate], [DiscoveredById], [ProcessedDate], [ProcessedById], [IsInProcessingQueue], [JoinedProcessingQueueDate]) VALUES(N'83B2DE6A8247D2F0C1F674DA0DC4E173230C541542D0A4852A8F83AC8A874D43E2A9335B3A505A50DBC735592D792E9A2564FF556EB3286C7F974A0EDE995F46',N'http://google.com/blog-entry-4835.html',N'getutcdate()', 1006, ,,False,)
// INSERT INTO URLS ([UrlId], [UrlHash], [URLPath], [DiscoveryDate], [DiscoveredById], [ProcessedDate], [ProcessedById], [IsInProcessingQueue], [JoinedProcessingQueueDate]) VALUES(N'83B2DE6A8247D2F0C1F674DA0DC4E173230C541542D0A4852A8F83AC8A874D43E2A9335B3A505A50DBC735592D792E9A2564FF556EB3286C7F974A0EDE995F46',N'http://google.com/blog-entry-4835.html',N'getutcdate()', 1006, '','',False,'')
SqlCommand command = new SqlCommand("INSERT INTO URLS ([UrlId], [UrlHash], [URLPath], [DiscoveryDate], [DiscoveredById], [ProcessedDate], [ProcessedById], [IsInProcessingQueue], [JoinedProcessingQueueDate]) VALUES(N'" + HashPassword(url) + "',N'" + url + "',N'getutcdate()', 1006, '" + null+ "','" + null + "'," + false + ",'" + null + "')");
command.CommandType = CommandType.Text;
command.Connection = con;
rows += command.ExecuteNonQuery();
}
catch (SqlException sqle)
{
Log("SQL ERROR: SaveUrls " + sqle.Message);
}
Application.DoEvents();
}
this.Cursor = Cursors.Default;
Log("Seeded URLS Table with " + rows.ToString("N0") + " rows");
alUrls.Clear();
}
更新:
table 之间的关系如下:
更新 2:
- 没有异常产生
- 即使删除了 UrlId,插入也会失败。
您的 INSERT 语句指定了 UrlId
字段,但您提供的第一个值是散列。
INSERT INTO URLS ([UrlId], [UrlHash], [URLPath]...
应该是
INSERT INTO URLS ([UrlHash], [URLPath]...
此外,正如其他人在评论中所说,使用参数而不是构建 SQL 字符串!
答案是 varchar(128) 的 URLHash 列太小,无法容纳 128 个字符的字符串!
我不知道它是如何工作的,但是在删除约束并将 varchar(128) 更改为 nvarchar(256) 之后(不知道为什么它仍然是 varchar)我恢复了约束,嘿,它很快就起作用了。