我正在使用ADODB从VBA查询SQL Server。我的所有表都有RowVersion (时间戳/varbinary)列。由于VBA不支持varbinary类型,因此我将RowVersion转换为来自SQL Server函数的字符串。一个简单的查询将如下所示:
sql = "SELECT NameValueListID, dbo.RowVersionToString(RowVersion) AS RowVersion FROM NameValueLists WHERE NameValueListID=1要将数据放到工作表中,我首先尝试了range.CopyFromRecordset。在我将上面的函数包含在sql调用中之前,这种方法一直有效。添加RowVersionToString函数会导致记录集返回一组随机的数据--行数比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, dbo.RowVersionToString(LastItemRowVersion) AS LastItemRowVersion FROM NameValueLists WHERE NameValueListID=1调用之后,记录集rs拥有所有数据,但是rsData的第一个varbinary列为"Empty“。顺序并不重要。在rsData数组中,只有最后一个varbinary列有值,其他列始终为“空”。
发布于 2021-10-16 01:39:31
我猜,如果你展示你的用户函数RowVersionToString.What的代码是RowVersionToString的参数定义,更多的可以回答你的问题?可能是参数"RowVersion“被解释为数据类型而不是列名称。
sql = "SELECT NameValueListID, dbo.RowVersionToString(NameValueLists.RowVersion) AS RowVersion, dbo.RowVersionToString(LastItemRowVersion) AS LastItemRowVersion FROM NameValueLists WHERE NameValueListID=1https://stackoverflow.com/questions/60456645
复制相似问题