2015-10-14 1 views
0

Я пытаюсь выполнить несколько операторов SQL в базе данных SQL-сервера с помощью ADODB и vb6.Выполнение нескольких операторов SQL в одной команде для базы данных SQLServer в vb6

когда я открываю записей код останавливается со следующим кодом ошибки:

Ошибка выполнения «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. Прямо сейчас мне просто нужно знать, почему это происходит, и я чувствую себя неловко, ударяя головой о стол. , пожалуйста, может кто-то пролить свет на это.

Благодаря

+0

IMO, вам не нужны эти '' vbCrLf '' в 'sql', просто используйте простое пробел' '' ', и это изменение может быть полезным:' sql = "; WITH" ... ';) , –

+0

Спасибо за ввод, я действительно предпочитаю использовать vbCrLf, чтобы убедиться, что я не забыл пробел в любой строке; и это улучшает читаемость при отладке. Все сказанное не имеет никакого отношения к проблеме. –

ответ

0

Единственное доступное решение моей проблемы - переместить инструкции в хранимую процедуру. Итак, я проверяю, существует ли процедура в целевом db, если нет, я создам процедуру; else, я выполняю процедуру с правильными параметрами. Я также включил логику проверки файла temp, если он существует в db.

1

Если у вас есть 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" 
+0

близко, но без сигары, новое сообщение об ошибке после добавления nocount; option.Run-time error '-2147217887 (80040e21) «Операции с несколькими шагами OLE DB сгенерировали ошибки. Проверьте каждое значение статуса OLE DB, если оно доступно. Работа не была выполнена». –

0

Удалить "#":

#tmpTable.Unit_OldQuantity 

должно быть

tmpTable.Unit_OldQuantity 
+0

Хэш-знак используется здесь, чтобы указать, что это временная таблица. Это не является источником проблемы. Как я уже сказал в своем посте, тот же код отлично работает в Visual Studio 2010; но он не будет работать в VB6 и ADO2.8. –

 Смежные вопросы

  • Нет связанных вопросов^_^