Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Visual Basic Новый топик    Ответить
 Выполнить набор delete и insert запросов в одном String  [new]
mr_eas
Member

Откуда:
Сообщений: 4
Ребят, приветствую!

Подскажите пожалуйста:

Есть набор запросов к MyTABLE (Id int, Colm int) в MS SQL, значения которых сформировал со страницы и записал все в один String.

1) Не могу понять как отследить ошибку, если хоть один запрос не прошел.

Например ошибку с неверным типом данных во 2-ом insert.
В данном случае не ругается ни на что, хотя запрос не прошел в БД ...
Sub Connection()
Dim con As New ADODB.Connection
Dim strQ As String

On Error GoTo ErrorHandler
con.ConnectionString = "Provider=SQLNCLI10.1;Server=SRV-SQL;Database=MyDB;Trusted_Connection=yes;"
con.Open
con.BeginTrans

  strQ = "delete from MyTABLE where ID = 1 " 
  strQ = strQ + "insert into MyTABLE VALUES (1,1)"     
  'второй insert должен вернуть ошибку
  strQ = "delete from MyTABLE where ID = 2 "
  strQ = strQ + "insert into MyTABLE VALUES (2,'FAIL')"     

 con.Execute strQ, adCmdText
con.CommitTrans
con.Close
Set con = Nothing

Exit Sub
 
ErrorHandler:
 Debug.Print "Err: " & Err.Source & "-->" & Err.Description & "-->" & Err.Number
 con.RollbackTrans
    If Not con Is Nothing Then
        If con.State = adStateOpen Then con.Close
    End If
    Set con = Nothing 
End Sub

... хотя если подавать только один запрос, то он ругнется Err: Microsoft SQL Server Native Client 10.0-->Error converting data type varchar to numeric.-->-2147217913
  strQ = strQ + "insert into MyTABLE VALUES (2,'FAIL')"     

2) Или тут стоит выполнять execute отдельно для каждого запроса и откатываться в случае возникновения ошибки? Аукнется на производительности?!
3) Есть ли механизм пакетной отправки запросов в БД?
9 ноя 18, 15:21    [21729698]     Ответить | Цитировать Сообщить модератору
 Re: Выполнить набор delete и insert запросов в одном String  [new]
court
Member

Откуда:
Сообщений: 1796
mr_eas,

по коллекции Errors коннекшиона "пройдись" после выполнения
for each objErr in objConn.Errors
...
next


пс
автор
  strQ = "delete from MyTABLE where ID = 1 " 
  strQ = strQ + "insert into MyTABLE VALUES (1,1)"     
  'второй insert должен вернуть ошибку
  strQ = "delete from MyTABLE where ID = 2 "
  strQ = strQ + "insert into MyTABLE VALUES (2,'FAIL')"  

тут что-то не в порядке ...
или ; должна быть между запросами, или перевод каретки
А сейчас получается они "одной строкой" - сервер не мог такое выполнить ...
9 ноя 18, 15:30    [21729719]     Ответить | Цитировать Сообщить модератору
 Re: Выполнить набор delete и insert запросов в одном String  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 20636
mr_eas
Есть ли механизм пакетной отправки запросов в БД?
это и есть пакет.
Пока единственное, что меня смущает - отсутствие пробела перед вторым инсертом, не скажу сходу, насколько это критично в данном случае. Второй delete выполняется?
9 ноя 18, 15:30    [21729722]     Ответить | Цитировать Сообщить модератору
 Re: Выполнить набор delete и insert запросов в одном String  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 19434
Shocker.Pro
это и есть пакет.
А что мешает явно завершать запросы стандартной точкой с запятой? Можно тогда не думать о переводах строк... и пробелы перестанут смущать заодно.
9 ноя 18, 15:43    [21729759]     Ответить | Цитировать Сообщить модератору
 Re: Выполнить набор delete и insert запросов в одном String  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 20636
Akina
Shocker.Pro
это и есть пакет.
А что мешает явно завершать запросы стандартной точкой с запятой? Можно тогда не думать о переводах строк... и пробелы перестанут смущать заодно.
А я долгое время и не знал, что ";" можно применять в TSQL (в отличие от MySQL, где это обязательно). Всегда обходился пробелом/переводом строки
9 ноя 18, 15:47    [21729771]     Ответить | Цитировать Сообщить модератору
 Re: Выполнить набор delete и insert запросов в одном String  [new]
mr_eas
Member

Откуда:
Сообщений: 4
Shocker.Pro, court

сори! по поводу пробелов в конце строки с запросом не доглядел, там все норм в оригинале, это я тестовый пример тут от руки писал..
Так же я пробовал и ; в конце проставлять, все глухо по ошибкам(

По поводу коллекции Errors - статус в случае не верного запроса - adStatusOK, в Err пусто.

     
Dim rAffected As Long

 strQ = "delete from MyTABLE where ID = 2 "
 strQ = strQ + "insert into MyTABLE VALUES (2,'FAIL')"     

con.Execute strQ, rAffected, adCmdText

    Debug.Print "con.State: " & con.State
    Debug.Print "Err.Count: " & con.Errors.Count
    Debug.Print "rows Affected: " & rAffected & vbCrLf      
     
For Each E In con.Errors
     Debug.Print "Error.Description: " & E.Description
      Debug.Print "Error.Number: " & E.Number
      Debug.Print "Error.Source: " & E.Source
      Debug.Print "Error.SQLState: " & E.SqlState
      Debug.Print "Error.NativeError: " & E.NativeError
Next

вывод в таком случае
con.State: 1
Err.Count: 0
rows Affected: 0


если выполнять только не правильный запрос
strQ = strQ + "insert into MyTABLE VALUES (2,'FAIL')"     
con.Execute strQ, rAffected, adCmdText

то вывод :

con.State: 1
Err.Count: 1
rows Affected: 0

Error.Description: Error converting data type varchar to numeric.
Error.Number: -2147217913
Error.Source: Microsoft SQL Server Native Client 10.0
Error.SQLState: 22018
Error.NativeError: 8114
9 ноя 18, 16:00    [21729805]     Ответить | Цитировать Сообщить модератору
 Re: Выполнить набор delete и insert запросов в одном String  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 20636
а попробуй в самом начале запроса написать set nocount on
9 ноя 18, 16:04    [21729812]     Ответить | Цитировать Сообщить модератору
 Re: Выполнить набор delete и insert запросов в одном String  [new]
mr_eas
Member

Откуда:
Сообщений: 4
автор
а попробуй в самом начале запроса написать set nocount on


Помогло, спасибо!!
9 ноя 18, 16:39    [21729861]     Ответить | Цитировать Сообщить модератору
 Re: Выполнить набор delete и insert запросов в одном String  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 20636
mr_eas
Помогло, спасибо!!
Ага, рука теряет навык, сразу не вспомнил про этот нюанс. По идее, даже такая строка бы не сработала
"delete from MyTABLE where ID = 2  insert into MyTABLE VALUES (2,'FAIL')"

потому что delete намусорит в вывод
9 ноя 18, 17:06    [21729901]     Ответить | Цитировать Сообщить модератору
Все форумы / Visual Basic Ответить