Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用SMO更新数据库:超时_C#_Sql Server_Smo - Fatal编程技术网

C# 使用SMO更新数据库:超时

C# 使用SMO更新数据库:超时,c#,sql-server,smo,C#,Sql Server,Smo,我正在尝试使用包含大量GO语句的脚本更新MS SQL Server数据库。在我的开发机器上,这工作正常,脚本在大约2,5分钟内完成,并完成它应该做的事情,但在我的笔记本电脑上,我得到了一个超时。它发生在脚本的一部分(一批?)中,在我的开发机器上需要29秒,所以我猜这在我的笔记本电脑上需要超过60秒。我在脚本的这一部分中使用的表大约有60万行 但我在代码中设置了1800秒超时,在连接字符串中设置了1800秒(连接超时=1800)。1800这个数字并不重要,我刚刚把它提高到了一个很大的数字,看看这是

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

但我在代码中设置了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.
第二部分是瑞典语,大致翻译为:在操作完成或服务器没有响应之前发生超时。

有什么想法吗

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
对象。