Delphi - Query.Open vs Query.ExecSQL - PullRequest
       48

Delphi - Query.Open vs Query.ExecSQL

0 голосов
/ 12 сентября 2018

У меня есть несколько вопросов ниже, чтобы было легче их определить, я выделю жирным шрифтом их и дам номер каждому вопросу (Q1, Q2, Q3 ...).

Допустим, у меня есть такая таблица:

Table Name : MyCustomer
Table Fields : CustID (varchar 10), CustName (varchar 10)

Текущие записи в таблице MyCustomer:

CustID | CustName
-----------------
C12345 | Bruce
C12346 | Tom

В Delphi мне нужно сделать выбор, а затем обновить.

Например, Query1.SQL.Text:

select CustID, CustName from MyCustomer where CustID = 'C12345'

update MyCustomer set CustName = 'Tom Riddle' where CustID = 'C12346'

Q1 - Для этого мне следует использовать Query1.Open или Query1.ExecSQL?

Поскольку в этом запросе есть оператор SELECT (который возвращает 1 запись), то я предполагаю, что мне нужно использовать:

Query1.Close;
Query1.Open;

Q2 - Таким образом, CustName успешно обновляется до Tom Riddle.Это правильный подход?

Но если я добавлю оператор, который перемещает курсор Query1, например:

Query1.Close;
Query1.Open;
Query1.Last; // <----- cause error

, я получу это сообщение об ошибке СЛЕДУЮЩИЙ раз, когда я выполню что-тоSQL Server:

DB-Library error 10038: Attempt to initiate a new SQL Server operation with results pending.

Q3 - Что означает это сообщение об ошибке?Что означают результаты в ожидании?Почему ожидаются результаты?

Q4 - Это нормально, если я использую Query1.ExecSQL, даже если из оператора SELECT возвращаются записи?(Мне не нужен доступ к записям, но я не могу удалить оператор SELECT из запроса).

Q5 - Из документации Embarcadero:

Примечание: не используйте ExecSQL для команд, которые возвращают данные.Они включают любое использование типа команды ctTable, запросов SELECT и хранимых процедур, которые возвращают курсор.Когда команда возвращает данные, используйте метод Open или задайте для свойства Active значение true.

В чем причина этой документации?А что если после инструкции SELECT есть INSERT / UPDATE / DELETE?

...