1 (изменено: Mat Skywalker, 2012-03-27 20:04:53)

Тема: VBS: ADODB MSSQL Получение ответа сервера БД

Вопрос. Как получить от ADODB ответ сервера на выполнение например truncate table ?
Поясню. Выполняя запрос, результатом которого является набор данных я вижу результаты так:


Command_1="select barcode from bar"'Текст запроса
Set Record_1 =MSSQLConn.Execute(Command_1)'Выплняем запрос

While Not Record_1.EOF 'Перебираем результаты
    if isNull(Record_1.Fields(0).Value)  then' Что нибудь с ними вытворяем
	RecSet="NULL"
	Else
	RecSet=CStr(Record_1.Fields(0).Value)
	end if
Record_1.MoveNext' Идем к следующей записи
wend

Но! Если текст запроса вида

TRUNCATE TABLE BAR

То набора записей нет. А сообщение сервера есть. То есть мне надо не количество обработанных строк, а именно сообщение. Вот как его получить?

Автоматизирую торговлю. Не 1С

2

Re: VBS: ADODB MSSQL Получение ответа сервера БД

Сейчас сделано так:


...
		SQLConn.Execute SQLstr, rcount
		msgbox  Cstr(rcount)+ " Записей обработано"
...

Но это только для DELETE FROM
А вот для всего остального не ясно...

Автоматизирую торговлю. Не 1С

3

Re: VBS: ADODB MSSQL Получение ответа сервера БД

Событие ExecuteComplete поддерживается провайдером? Пробовали использовать?

4

Re: VBS: ADODB MSSQL Получение ответа сервера БД

Провайдер MSSQL
Это событие, как я понял, тоже возвращает количество обработанных строк.

Автоматизирую торговлю. Не 1С

5

Re: VBS: ADODB MSSQL Получение ответа сервера БД

Пробовали использовать?

6 (изменено: oshliaer, 2012-03-31 00:03:37)

Re: VBS: ADODB MSSQL Получение ответа сервера БД

Mat Skywalker пишет:

Это событие, как я понял, тоже возвращает количество обработанных строк.

Вопрос 1: и это все?
А что находится в pError, pCommand, pRecordset, pConnection?

Sub Test
   Set objConn = WScript.CreateObject("ADODB.Connection", "Connection_")
   ConnectString = "Provider=;"
   objConn.Open ConnectString
   Set objRecordset = objConn.Execute("exec DO_IT")
      objConn.Close
   Set objConn = Nothing
   Set objRecordset = Nothing
End Sub

Function Connection_ExecuteComplete(RecordsAffected, pError, adStatus, pCommand, pRecordset, pConnection)
   'перебрать RecordsAffected, pError, adStatus, pCommand, pRecordset, pConnection
End Function

Вопрос 2: а какое сообщение-то сервер отправляет? Что там находится?

я тут не за этим, чтобы вот

7

Re: VBS: ADODB MSSQL Получение ответа сервера БД

alexii пишет:

Пробовали использовать?

Да. Событие ExecuteComplete не наступает.

Автоматизирую торговлю. Не 1С

8 (изменено: BeS Yara, 2012-03-31 19:13:24)

Re: VBS: ADODB MSSQL Получение ответа сервера БД

Mat Skywalker пишет:

Но! Если текст запроса вида

TRUNCATE TABLE BAR

То набора записей нет. А сообщение сервера есть. То есть мне надо не количество обработанных строк, а именно сообщение. Вот как его получить?

Набора записей конечно нет - команда его не возвращает(т.к. очищает таблицу без подсчёта удалённых записей). Что до сообщения от сервера, то какое?!
"The command(s) completed successfully." в QA это просто интерпритация того что команда выполнена без ошибок и не более того. В ответ на команду не возвращающую значения сервер может только сказать выполнена ли команда с ошибками или нет. Если требуется убедиться в том что команда выполена успешно, то достаточно отследить ошибки объекта MSSQLConn после выполнения MSSQLConn.Execute(Command_1) - если нет ошибок, значит "The command(s) completed successfully.".


strSQL = "TRUNCATE TABLE BAR"
On Error Resume Next
MSSQLConn.Execute(strSQL)
If MSSQLConn.Errors.Count > 0 Then ' обработка ошибок SQL
 For Each E In MSSQLConn.Errors
  wscript.echo "SQL_Error: " & E.Description
 Next
End If
On Error Goto 0

Если и это не убеждает, то после "TRUNCATE TABLE BAR" можно сделать "SELECT count(*) FROM BAR" - если вернулось 0, то таблица очищена .

В любом случае, обработку возможных ошибок при выполнении запроса лучше добавить. Я бы вообще выполнение запроса вынес в отдельную процедуру для каждого типового случая - селект отдельно, делет отдельно, транкейт отдельно. В дальнейшем эти процедуры легко скопипастить в другой код для повторного использования .

Или я не совсем правильно понял что требуется сделать?

9 (изменено: oshliaer, 2012-04-01 14:36:36)

Re: VBS: ADODB MSSQL Получение ответа сервера БД

BeS Yara, солидарен, не могу одного понять, зачем делать проверку? Неужели случаи бывали? Одно дело пакетник или глобальное изменение контента и структуры.

Mat Skywalker пишет:

Да. Событие ExecuteComplete не наступает.

На код взглянуть можно?

Вот мой

Test
Sub Test
	Set objConn = WScript.CreateObject("ADODB.Connection", "Connection_")
	ConnectString = "Provider=SQLOLEDB.1;Persist Security Info=False;User Id=sa;Password=super_pass;Initial Catalog=test;Data Source=1C"
	
	objConn.Open ConnectString
	Set objRecordset = objConn.Execute("TRUNCATE TABLE tblTest")

	objConn.Close
	
	Set objConn = Nothing
	Set objRecordset = Nothing

End Sub

Function Connection_ExecuteComplete(RecordsAffected, pError, adStatus, pCommand, pRecordset, pConnection)
	MsgBox "yeah"
End Function
я тут не за этим, чтобы вот

10 (изменено: Mat Skywalker, 2012-04-01 07:13:02)

Re: VBS: ADODB MSSQL Получение ответа сервера БД

oshliaer пишет:

На код взглянуть можно?

Тот же самый код внутри HTA приложения.
Я понял уже, как надо делать с TRUNCATE, вы правы, там ответа как такого нет.
Были сомнения по поводу DBCC SRINKDATABASE, но оказалось, что у эта функция возвращает набор записей.

Меня немного смутило, что выполнение скрипта при помощи OSQL.EXE всегда выдает строку с результатом.

Автоматизирую торговлю. Не 1С