使用SMO更新数据库:timeout

时间:2016-06-12 08:47:08

标签: c# sql-server smo

我正在尝试使用包含大量GO语句的脚本更新MS SQL Server数据库。在我的开发机器上,这工作正常,脚本在大约2.5分钟内完成并完成应该做的事情,但在我的笔记本电脑上我得到了超时。它发生在脚本的一部分(批处理?),在我的开发机器上需要29秒,所以我的猜测是我的笔记本电脑需要超过60秒。我在脚本的那部分工作的表有大约600 000行。

但我在代码中设置了1800秒超时,在连接字符串中设置了1800秒(连接超时= 1800)。 1800这个数字并不重要,我刚刚将它提升到一个巨大的数字,看看是否有助于这种情况。在我看来,单个批次的超时仍然是60秒?以下是执行脚本的代码:

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.

第二部分是瑞典语,大致转换为:在操作完成或服务器没有响应之前发生超时。

有什么想法吗?

修改:

尝试了以下代码,但结果是相同的......

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

0 个答案:

没有答案