Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.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 使用RowVersion查询SQL Server表_Sql Server_Excel_Vba - Fatal编程技术网

Sql server 使用RowVersion查询SQL Server表

Sql server 使用RowVersion查询SQL Server表,sql-server,excel,vba,Sql Server,Excel,Vba,我正在使用ADODB从VBA查询SQL Server。我所有的表都有RowVersion(timestamp/varbinary)列。由于VBA不支持varbinary类型,因此我将RowVersion从SQL Server函数转换为字符串。一个简单的查询如下所示: sql = "SELECT NameValueListID, dbo.RowVersionToString(RowVersion) AS RowVersion FROM NameValueLists WHERE NameValueL

我正在使用ADODB从VBA查询SQL Server。我所有的表都有RowVersion(timestamp/varbinary)列。由于VBA不支持varbinary类型,因此我将RowVersion从SQL Server函数转换为字符串。一个简单的查询如下所示:

sql = "SELECT NameValueListID, dbo.RowVersionToString(RowVersion) AS RowVersion FROM NameValueLists WHERE NameValueListID=1
sql = "SELECT NameValueListID, dbo.RowVersionToString(RowVersion) AS RowVersion,  dbo.RowVersionToString(LastItemRowVersion) AS LastItemRowVersion FROM NameValueLists WHERE NameValueListID=1
为了将数据放到工作表上,我首先尝试了range.CopyFromRecordset。这一直有效,直到我在sql调用中包含了上述函数。添加RowVersionString函数会导致记录集返回一组看似随机的数据——比excepted少的行和比我要求的少的列。我永远也想不到。然后,我使用rs.GetRows返回预期数据,我可以成功地使用range.value=rsData。下面是一个有效的示例调用

Private Sub Test_Scratch()
    Dim rs As ADODB.Recordset
    Dim sqlCmd As New ADODB.Command
    Dim sqlConnection As ADODB.Connection
    Dim sql As String
    Dim rsData() As Variant

    Set sqlConnection = New ADODB.Connection
    sqlConnection.Open ModSQL.GetConnectionStringByStage(wsSetup.Range("suAppStage"))

    sql = "SELECT NameValueListID, dbo.RowVersionToString(RowVersion) AS RowVersion FROM NameValueLists WHERE NameValueListID=1"
    Set sqlCmd.ActiveConnection = sqlConnection
    sqlCmd.CommandText = sql
    Set rs = sqlCmd.Execute

    rs.MoveFirst

    rsData = rs.GetRows
End Sub
然后,我在查询中添加了第二个varbinary列(它不是RowVersion,而是同一类型)。因此,sql将如下所示:

sql = "SELECT NameValueListID, dbo.RowVersionToString(RowVersion) AS RowVersion FROM NameValueLists WHERE NameValueListID=1
sql = "SELECT NameValueListID, dbo.RowVersionToString(RowVersion) AS RowVersion,  dbo.RowVersionToString(LastItemRowVersion) AS LastItemRowVersion FROM NameValueLists WHERE NameValueListID=1

调用后,记录集rs拥有所有数据,但rsData的第一个varbinary列为“Empty”。顺序不重要。只有最后一个varbinary列有一个值,另一个在rsData数组中总是“空的”。

为什么在查询中需要时间戳值?很好奇您想用它做什么。@SeanLange因为这是实现乐观并发的一种非常简单的方法。应用程序将读取具有该值的行。稍后,当它想以某种方式更新行时,它会在where子句中包含原始值。如果更新不影响行,则应用程序知道它在检索后已更改。我可以使用rowversion仅获取更改的行。所以我下载了一些记录,然后我可以得到最大Rowversion,然后得到新的/更新的记录,这些记录的Rowversion>maxRowVersionrsData是一个数组。具体如何将rsData导入Excel电子表格?我使用了SELECT NameValueListID、cast(RowVersion为bigint)、cast(LastItemRowVersion为bigint)和rsData(0,0)、rsData(1,0)、rsData(2,0)都有值