Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.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
Sql server Excel VBA:ODBC SQL server驱动程序查询超时已过期_Sql Server_Vba_Excel - Fatal编程技术网

Sql server Excel VBA:ODBC SQL server驱动程序查询超时已过期

Sql server Excel VBA:ODBC SQL server驱动程序查询超时已过期,sql-server,vba,excel,Sql Server,Vba,Excel,我在Excel 2016中使用了下面的VBA查询,该查询用于检查MS Sql存储过程,有时执行平稳并返回记录集,但更多情况下,我会收到错误[Microsoft][ODBC Sql Server Driver]查询超时 同时,当我们转到SSMS并执行查询时,它会毫无问题地运行 这假设问题是由Excel/VB引起的,而不是由SQL或查询本身引起的 搜索此错误会导致检查网络防火墙,但我们在其他没有防火墙的机器上进行了尝试,问题仍然存在 下面是VB代码: 公共子GetDataset2 Dim cn作为A

我在Excel 2016中使用了下面的VBA查询,该查询用于检查MS Sql存储过程,有时执行平稳并返回记录集,但更多情况下,我会收到错误[Microsoft][ODBC Sql Server Driver]查询超时

同时,当我们转到SSMS并执行查询时,它会毫无问题地运行

这假设问题是由Excel/VB引起的,而不是由SQL或查询本身引起的

搜索此错误会导致检查网络防火墙,但我们在其他没有防火墙的机器上进行了尝试,问题仍然存在

下面是VB代码:

公共子GetDataset2 Dim cn作为ADODB.Connection 作为对象的Dim cm 将rs设置为ADODB.Recordset Dim UID、PWD、DB作为字符串 UID=userId 密码 DB=192.168.1.1 Set cn=New ADODB.Connection Set cm=CreateObjectADODB.Command cm.CommandTimeout=0 cn.opendriver={sqlserver};服务器=&DB&;Database=myDatabaseName;可信_连接=否;超时=900;Uid=&Uid&;Pwd=&Pwd 设置rs=cn.ExecuteGet_dataset2'&FormatRangedateFrom,yyyy-mm-dd&','&FormatRangedateTo,yyyy-mm-dd&' 暗淡的光线和长的一样 '在A1列中查找最后一个非空单元格 lRow=Sheetsdata.CellsRows.Count,1.EndxlUp.Row lr=A&lRow+1 Sheetsdata.Rangelr.CopyFromRecordset rs的插入数据 cn.Close 端接头 如有任何建议,我们将不胜感激。
Joel

一个可能的解决方案是延长连接命令超时值。当前脚本的值设置为0。这可以增加。在SSMS中运行查询可以大致了解完成查询所需的时间。然后,相应地调整该值

    cm.CommandTimeout = 100

经过对这个问题的进一步思考和对我先前答案的评论,这里有一些补充点。对于BitAccesser,cn.CommandTimeout与Connection.CommandTimeout相同,因为最初提交的代码已经对cn对象进行了尺寸标注并将其设置为ADODB.Connection。另外值得注意的是ConnectionTimeout和CommandTimeout之间的区别。连接超时为网络级别,而命令超时为SQL Server级别。在本例中,即使实例化了ADODB.Command对象,也不会使用它。另一点与连接字符串有关。连接超时可以在连接字符串中引用,但通常不使用。连接将默认为15秒。因此,显式重置这些属性是值得的

    Cn.CommandTimeout = 50
    Cn.ConnectionTimeout = 50

在对各种代码更改进行了数周的测试之后,我们发现当将SQL调用更改为QueryTable方法而不是CopyFromRecordset方法时,它工作得很好

因此,如果将来有人需要,我将粘贴代码

Sub GetDataset3()

Dim cn As ADODB.Connection
Dim Rs As ADODB.Recordset
Dim UID, PWD, SRV As String
UID = "userId"
PWD = "passworD"
SRV = "192.168.1.1"

If Sheets("data").QueryTables.Count = 0 Then
     Sheets("data").Cells.Select
     Selection.ClearContents

     Dim Str As String 'adds backround query
     Str = ""
     For Each cell In Range("A1:A10").Cells
     Str = Str & Chr(10) & cell
    Next

      With Sheets("data").QueryTables.Add(Connection:="ODBC;UID=;PWD=;DRIVER=SQL 
        Server;SERVER=SRV", Destination:=Range("a2"))
        .CommandText = "select 1"
        'BackgroundQuery = True
        '.Refresh BackgroundQuery = True
        .FieldNames = False
        .AdjustColumnWidth = False
      End With
End If

 With Sheets("data").QueryTables(1)
   .Connection = "ODBC;DRIVER=SQL Server;SERVER=" & SRV & 
   ";database=myDatabaseName;UID=" & UID & ";Pwd=" & PWD & 
   ";Trusted_Connection=no;APP=Microsoft Office"
   .CommandText = ("Get_dataset2 '" & Range("dateFrom") & "' ,'" & 
    Range("dateTo") & "' ")
    BackgroundQuery = True
    .Refresh BackgroundQuery:=False

 End With

End Sub

您是否为SQL Server尝试了更新的ODBC驱动程序本机客户端xx或ODBC驱动程序xx?有可疑的日志数据吗?我将驱动程序更改为已安装的另一个版本{ODBC driver 13 for SQL Server},出现相同的错误。根据下面的文档,CommandTimeout=0表示没有限制。请尝试cn.CommandTimeout=0,因为Connection.CommandTimeout对命令没有影响。CommandTimeout或提供程序和数据源不支持我不熟悉ADODB,因此CommandTimeout=0无法像预期的那样工作?我刚刚阅读了上面链接中的文档,其中说连接和命令都有一个相互独立的CommandTimeout属性。在提供程序和数据源相同的文档中支持CommandTimeout如何。这会影响他的设置吗?经过进一步挖掘,我了解到我查询中的一个联合表在插入数据时正被其他用户使用。我怀疑当时表被锁定,导致查询超时。我还加上了NOLOCK,目前为止运气不好。