Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Выполнить набор delete и insert запросов в одном String / 9 сообщений из 9, страница 1 из 1
09.11.2018, 15:21
    #39730653
mr_eas
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнить набор delete и insert запросов в одном String
Ребят, приветствую!

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

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

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

Например ошибку с неверным типом данных во 2-ом insert.
В данном случае не ругается ни на что, хотя запрос не прошел в БД ...
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
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
Код: vbnet
1.
  strQ = strQ + "insert into MyTABLE VALUES (2,'FAIL')"     


2) Или тут стоит выполнять execute отдельно для каждого запроса и откатываться в случае возникновения ошибки? Аукнется на производительности?!
3) Есть ли механизм пакетной отправки запросов в БД?
...
Рейтинг: 0 / 0
09.11.2018, 15:30
    #39730667
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнить набор delete и insert запросов в одном String
mr_eas,

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



пс
автор
Код: vbnet
1.
2.
3.
4.
5.
  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')"  


тут что-то не в порядке ...
или ; должна быть между запросами, или перевод каретки
А сейчас получается они "одной строкой" - сервер не мог такое выполнить ...
...
Рейтинг: 0 / 0
09.11.2018, 15:30
    #39730670
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнить набор delete и insert запросов в одном String
mr_easЕсть ли механизм пакетной отправки запросов в БД? это и есть пакет.
Пока единственное, что меня смущает - отсутствие пробела перед вторым инсертом, не скажу сходу, насколько это критично в данном случае. Второй delete выполняется?
...
Рейтинг: 0 / 0
09.11.2018, 15:43
    #39730696
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнить набор delete и insert запросов в одном String
Shocker.Proэто и есть пакет.А что мешает явно завершать запросы стандартной точкой с запятой? Можно тогда не думать о переводах строк... и пробелы перестанут смущать заодно.
...
Рейтинг: 0 / 0
09.11.2018, 15:47
    #39730705
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнить набор delete и insert запросов в одном String
AkinaShocker.Proэто и есть пакет.А что мешает явно завершать запросы стандартной точкой с запятой? Можно тогда не думать о переводах строк... и пробелы перестанут смущать заодно.А я долгое время и не знал, что ";" можно применять в TSQL (в отличие от MySQL, где это обязательно). Всегда обходился пробелом/переводом строки
...
Рейтинг: 0 / 0
09.11.2018, 16:00
    #39730722
mr_eas
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнить набор delete и insert запросов в одном String
Shocker.Pro, court

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

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

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
     
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


если выполнять только не правильный запрос
Код: vbnet
1.
2.
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
...
Рейтинг: 0 / 0
09.11.2018, 16:04
    #39730727
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнить набор delete и insert запросов в одном String
а попробуй в самом начале запроса написать set nocount on
...
Рейтинг: 0 / 0
09.11.2018, 16:39
    #39730759
mr_eas
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнить набор delete и insert запросов в одном String
автора попробуй в самом начале запроса написать set nocount on

Помогло, спасибо!!
...
Рейтинг: 0 / 0
09.11.2018, 17:06
    #39730778
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнить набор delete и insert запросов в одном String
mr_easПомогло, спасибо!!Ага, рука теряет навык, сразу не вспомнил про этот нюанс. По идее, даже такая строка бы не сработала
Код: vbnet
1.
"delete from MyTABLE where ID = 2  insert into MyTABLE VALUES (2,'FAIL')"


потому что delete намусорит в вывод
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Выполнить набор delete и insert запросов в одном String / 9 сообщений из 9, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]