C# 使用SMO更新数据库:超时
我正在尝试使用包含大量GO语句的脚本更新MS SQL Server数据库。在我的开发机器上,这工作正常,脚本在大约2,5分钟内完成,并完成它应该做的事情,但在我的笔记本电脑上,我得到了一个超时。它发生在脚本的一部分(一批?)中,在我的开发机器上需要29秒,所以我猜这在我的笔记本电脑上需要超过60秒。我在脚本的这一部分中使用的表大约有60万行 但我在代码中设置了1800秒超时,在连接字符串中设置了1800秒(连接超时=1800)。1800这个数字并不重要,我刚刚把它提高到了一个很大的数字,看看这是否有助于解决这个问题。在我看来,单个批次的超时时间仍然是60秒?以下是执行脚本的代码:C# 使用SMO更新数据库:超时,c#,sql-server,smo,C#,Sql Server,Smo,我正在尝试使用包含大量GO语句的脚本更新MS SQL Server数据库。在我的开发机器上,这工作正常,脚本在大约2,5分钟内完成,并完成它应该做的事情,但在我的笔记本电脑上,我得到了一个超时。它发生在脚本的一部分(一批?)中,在我的开发机器上需要29秒,所以我猜这在我的笔记本电脑上需要超过60秒。我在脚本的这一部分中使用的表大约有60万行 但我在代码中设置了1800秒超时,在连接字符串中设置了1800秒(连接超时=1800)。1800这个数字并不重要,我刚刚把它提高到了一个很大的数字,看看这是
SqlConnection connection = new SqlConnection(_login.ConnectionString);
Server server = new Server(new ServerConnection(connection));
server.ConnectionContext.StatementTimeout = 1800;
server.ConnectionContext.ExecuteNonQuery(script);
以下是我得到的错误:
EXECUTE_ERROR:An exception occurred while executing a Transact-SQL statement or batch.
EXECUTE_ERROR:Timeout uppstod innan åtgärden slutfördes eller servern svarar inte.
第二部分是瑞典语,大致翻译为:在操作完成或服务器没有响应之前发生超时。
有什么想法吗
DECLARE @TaskId Int
DECLARE @CreatedById Int
DECLARE @CreatedAt DateTime2
DECLARE @AssignedToId int
DECLARE @AssignedById int
DECLARE @AssignedAt DateTime2
DECLARE @Count Int
SELECT @Count=1
DECLARE TaskLog_Cursor CURSOR FOR
SELECT Id, CreatedById, CreatedAt, AssignedToId, AssignedById, AssignedAt FROM Task
OPEN TaskLog_Cursor;
FETCH NEXT FROM TaskLog_Cursor INTO @TaskId, @CreatedById, @CreatedAt, @AssignedToId, @AssignedById, @AssignedAt
WHILE @@FETCH_STATUS = 0
BEGIN
-- Created by logs
INSERT INTO TaskLog (Id, TaskId, CreatedById, CreatedAt) VALUES(@Count, @TaskId, @CreatedById, @CreatedAt)
INSERT INTO TaskLogDetail (Id, TaskLogId, TaskLogActionId) VALUES (@Count, @Count, 0)
SELECT @Count=@Count + 1
-- Assigned to logs
if (not @AssignedToId is null AND not @AssignedById is null AND not @AssignedAt is null)
begin
INSERT INTO TaskLog (Id, TaskId, CreatedById, CreatedAt) VALUES(@Count, @TaskId, @AssignedById, @AssignedAt)
INSERT INTO TaskLogDetail (Id, TaskLogId, TaskLogActionId, FromId, ToId) VALUES (@Count, @Count, 8, null, @AssignedToId)
SELECT @Count=@Count + 1
end
FETCH NEXT FROM TaskLog_Cursor INTO @TaskId, @CreatedById, @CreatedAt, @AssignedToId, @AssignedById, @AssignedAt
END;
CLOSE TaskLog_Cursor;
DEALLOCATE TaskLog_Cursor;
GO
编辑:
尝试了以下代码,但结果相同
Server server = new Server();
server.ConnectionContext.ConnectionString = _login.ConnectionString;
server.ConnectionContext.Connect();
server.ConnectionContext.StatementTimeout = 1800;
server.ConnectionContext.ExecuteNonQuery(script);
编辑2:
好的,现在我至少知道Sql Server在哪里有问题了。我不知道为什么,因为这个SQL在我的开发机器上运行良好,大约在5秒钟内执行。在我的笔记本电脑上,硬盘速度更快,它几乎挂起。我没有耐心去看它花了多长时间来完成笔记本电脑。我知道最初的问题是关于超时的,我仍然需要解决这个问题,但这更重要。这一批怎么能在我的笔记本电脑上花这么多时间?有什么想法吗
DECLARE @TaskId Int
DECLARE @CreatedById Int
DECLARE @CreatedAt DateTime2
DECLARE @AssignedToId int
DECLARE @AssignedById int
DECLARE @AssignedAt DateTime2
DECLARE @Count Int
SELECT @Count=1
DECLARE TaskLog_Cursor CURSOR FOR
SELECT Id, CreatedById, CreatedAt, AssignedToId, AssignedById, AssignedAt FROM Task
OPEN TaskLog_Cursor;
FETCH NEXT FROM TaskLog_Cursor INTO @TaskId, @CreatedById, @CreatedAt, @AssignedToId, @AssignedById, @AssignedAt
WHILE @@FETCH_STATUS = 0
BEGIN
-- Created by logs
INSERT INTO TaskLog (Id, TaskId, CreatedById, CreatedAt) VALUES(@Count, @TaskId, @CreatedById, @CreatedAt)
INSERT INTO TaskLogDetail (Id, TaskLogId, TaskLogActionId) VALUES (@Count, @Count, 0)
SELECT @Count=@Count + 1
-- Assigned to logs
if (not @AssignedToId is null AND not @AssignedById is null AND not @AssignedAt is null)
begin
INSERT INTO TaskLog (Id, TaskId, CreatedById, CreatedAt) VALUES(@Count, @TaskId, @AssignedById, @AssignedAt)
INSERT INTO TaskLogDetail (Id, TaskLogId, TaskLogActionId, FromId, ToId) VALUES (@Count, @Count, 8, null, @AssignedToId)
SELECT @Count=@Count + 1
end
FETCH NEXT FROM TaskLog_Cursor INTO @TaskId, @CreatedById, @CreatedAt, @AssignedToId, @AssignedById, @AssignedAt
END;
CLOSE TaskLog_Cursor;
DEALLOCATE TaskLog_Cursor;
GO
您是在更新本地SQL Server数据库(在笔记本电脑上)还是远程数据库?我在这两种情况下都在更新本地SQL Server…我四处搜索,发现的唯一问题是这样的问题,例如。考虑到你的问题中添加一个更完整的例子。谢谢,我会看看这个链接是否会导致更多的事情……我没有能力去测试,但是我会尝试显式创建<代码> SqLink连接< /Cord>对象,设置<代码> StestMeTimeOut<<代码>然后使用刚刚创建的
SqlConnection
显式创建ServerConnection
对象。您是在更新本地SQL Server数据库(在笔记本电脑上)还是远程数据库?我在这两种情况下都在更新本地SQL Server…我已经四处搜索了,唯一出现的问题是这样的问题,例如。考虑到你的问题中添加一个更完整的例子。谢谢,我会看看这个链接是否会导致更多的事情……我没有能力去测试,但是我会尝试显式创建<代码> SqLink连接< /Cord>对象,设置<代码> StestMeTimeOut<<代码>然后使用刚才创建的SqlConnection
显式创建ServerConnection
对象。