在 vb6 中针对 SQL 服务器数据库在单个命令中执行多个 SQL 语句

Executing Multiple SQL statements in a single command against SQLServer Database in vb6

我正在尝试使用 ADODB 和 vb6 对 SQL 服务器数据库执行多个 SQL 语句。

当我打开记录集时,代码停止并显示以下错误代码:

运行-时间错误'3704': 对象关闭时不允许操作。

这是我的代码:

Dim sql As String
sql = "WITH " & vbCrLf & _
      "q AS" & vbCrLf & _
      "(SELECT Item_No, Unit_OldQuantity" & vbCrLf & _
      "FROM dbo.The_Units),  sequenced AS" & vbCrLf & _
      "(SELECT ROW_NUMBER() OVER (PARTITION BY Item_No ORDER BY Unit_OldQuantity DESC) AS sequence_id,*" & vbCrLf & _
      "From q)" & vbCrLf & _
      "SELECT Item_No , Unit_OldQuantity" & vbCrLf & _
      "into #tmpTable" & vbCrLf & _
      "From sequenced" & vbCrLf & _
      "Where sequence_id = 1" & vbCrLf & _
      "SELECT sum(The_ItemDetails.Item_Cost / #tmpTable.Unit_OldQuantity * The_ItemDetails.Item_Quantity) AS Total" & vbCrLf & _
      "FROM  The_Items INNER JOIN The_ItemDetails ON The_Items.Item_No = The_ItemDetails.Item_No INNER JOIN #tmpTable ON The_ItemDetails.Item_No = #tmpTable.Item_No" & vbCrLf & _
      "Where the_items.Item_kind = 0"


Dim connText As String
connText = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=AlmohasebSQL;Data Source=server-pc\SQLEXPRESS"
Db_Almohaseb.ConnectionString = connText
Db_Almohaseb.Open
Dim RS_ItemDetails As New ADODB.Recordset
RS_ItemDetails.Open sql, Db_Almohaseb, adOpenStatic, adLockOptimistic, adCmdText
Text1.Text = RS_ItemDetails.RecordCount

我可以 运行 任何其他 sql 语句使用相同的连接但不是这个。 我也可以 运行 在 .net 中使用此命令,但不能在 vb6 中使用。 现在我只需要知道为什么会这样,我的头撞在桌子上感到头晕目眩。 请有人对此有所了解。

谢谢

当你有一个 sql 语句有多个 sql 语句时,你需要使用 SET NOCOUNT ON,像这样:

sql = "SET NOCOUNT ON;" & _
      "WITH " & vbCrLf & _
      "q AS" & vbCrLf & _
      "(SELECT Item_No, Unit_OldQuantity" & vbCrLf & _
      "FROM dbo.The_Units),  sequenced AS" & vbCrLf & _
      "(SELECT ROW_NUMBER() OVER (PARTITION BY Item_No ORDER BY Unit_OldQuantity DESC) AS sequence_id,*" & vbCrLf & _
      "From q)" & vbCrLf & _
      "SELECT Item_No , Unit_OldQuantity" & vbCrLf & _
      "into #tmpTable" & vbCrLf & _
      "From sequenced" & vbCrLf & _
      "Where sequence_id = 1" & vbCrLf & _
      "SELECT sum(The_ItemDetails.Item_Cost / #tmpTable.Unit_OldQuantity * The_ItemDetails.Item_Quantity) AS Total" & vbCrLf & _
      "FROM  The_Items INNER JOIN The_ItemDetails ON The_Items.Item_No = The_ItemDetails.Item_No INNER JOIN #tmpTable ON The_ItemDetails.Item_No = #tmpTable.Item_No" & vbCrLf & _
      "Where the_items.Item_kind = 0"

删除“#”:

 #tmpTable.Unit_OldQuantity

应该是

 tmpTable.Unit_OldQuantity

我的问题唯一可用的解决方案是将语句移动到存储过程。 所以我检查目标数据库中是否存在该过程,如果不存在,我将创建该过程;否则,我将使用适当的参数执行该过程。 如果临时文件存在于数据库中,我还包含了检查临时文件的逻辑。