Delphi / ADO: какие компоненты? TADODataSet и TADOCommand или TADOQuery? - PullRequest
4 голосов
/ 01 июня 2010

Согласно http://www.delphigroups.info/2/3/181838.html

Предпочтительным подходом для компонентов ADO является использование TADODataSet и TADOCommand.TADOQuery (и TADOTable и TADOStoredProc) предоставлены для совместимости.

Используйте TADODataSet для SQL, который возвращает наборы результатов, и TADOCommand для SQL, который не делает.

Я не знаю, n00bкто собирается кодировать много вещей ADO.Является ли приведенное выше утверждение правильным?


PS. Есть ли какая-нибудь хорошая программа для Windows с открытым исходным кодом, которая позволит мне визуализировать и исследовать содержимое моих баз данных?

Какие компоненты я должен использовать для чего-то, что возвращает / не возвращаетрезультат?

Ответы [ 5 ]

7 голосов
/ 01 июня 2010

Это утверждение верно. TADODataset и TADOCommand являются прямыми интерфейсами с собственными объектами ADO и могут выполнять все задачи, выполняемые остальными тремя, которые существуют для облегчения портирования приложения, написанного для BDE (Borland Database Engine), реализуя аналогичный интерфейс - они в конечном итоге вызывают первые два.

4 голосов
/ 01 июня 2010

И я пойду в полуоппозицию! ; -)

В некоторых случаях TADOQuery прекрасно подходит для обеих заданий. Если ваш запрос приведет к данным, используйте TADOQuery.Acvite := True, Если вам нужно выполнить обновление \ вставить \ удалить, используйте TADOQuery.ExecSQL.

Например, вы можете написать запрос в UPDATE \ INSERT и выбрать запись и сделать это в одном компоненте вместо введения двух.

DECLARE @ID int, @Mode int, @SomeValue varchar(20)

SET @ID = :ID
SET @Mode = :Mode
SET @SomeValue = :SomeValue 

IF (@Mode = 1) //INSERT
BEGIN
  INSERT INTO dbo.YourTable(ID, SomeColumn) VALUES(@ID, @SomeValue)
END ELSE
IF (@Mode = 2) //UPDATE
BEGIN
  UPDATE dbo.YourTable SET SomeValue = @SomeValue WHERE ID = @ID
END ELSE
IF (@Mode = 3) //DELETE
BEGIN
  DELETE FROM dbo.YourTable WHERE ID = @ID
END ELSE
IF (@Mode = 4) //SELECT
BEGIN
  IF (@ID = -1) //SELECT ALL
  BEGIN
    SELECT * FROM dbo.YourTable
  END ELSE
  BEGIN
    SELECT * FROM dbo.YourTable WHERE ID = @ID
  END
END

Просто пример, написанный сейчас. Я надеюсь, вы поняли идею.

3 голосов
/ 01 июня 2010

У вас есть 2 различных классификации здесь в зависимости от природы объекта SQL (TADOTable, TADOQuery и TADOStoredProc) или действия / результата (TADODataSet и TADOCommand) .
Исторический подход Delphi - больше 1-го, в то время как ADO по природе больше 2-го.

Оба могут быть полезны в зависимости от того, что вы хотите сделать.

Я рекомендую вам прочитать справку Delphi по компонентам ADO.
Например, вы найдете полезные заметки, такие как: «ADOdb.TADODataSet и SQLExpr.TSQLDataSet имеют свойство CommandType, которое позволяет указать, представляют ли они таблицу, запрос или хранимую процедуру. Имена свойств и методов наиболее похожи на наборы данных типа запроса, хотя TADODataSet позволяет указывать индекс как набор данных типа таблицы. "

Если вы уверены, что придерживаетесь ADO и вам никогда не нужно менять и переносить на другие уровни данных, тогда идёт по "маршруту ADO" с TADODataSet и TADOCommand .
Вы получите большую часть ADO и вам будет легче использовать документы и примеры MS.

3 голосов
/ 01 июня 2010

Какую базу данных вы используете. SqlBuddy - это IDE с открытым исходным кодом для изучения базы данных.

1 голос
/ 13 февраля 2019

SELECT операторов

Для выдачи операторов DQL, которые возвращают набор данных (например, SELECT)

  • TADOQuery

    qry.Sql.Text := 'SELECT * FROM Users WHERE Name = :username';
    qry.Parameters.ParamByName('username').Value := 'ian';
    qry.Open;
    
  • TADODataSet

    ds.CommandText := 'SELECT * FROM Users WHERE Name = :username';
    ds.Parameters.ParamByName('username').Value := 'ian';
    ds.Open;
    
  • TADOCommand

    cmd.CommandText := 'SELECT * FROM Users WHERE Name = :username';
    cmd.Parameters.ParamByName('username').Value := 'ian';
    rs: _Recordset;
    rs := cmd.Execute;
    

    ADOCommand вернет собственный ADO IRecordset. Вы можете напрямую использовать интерфейс Recordset (это не так сложно) или обернуть его в дружественный класс-оболочку Delphi:

    ds.Recordset := rs;
    

    или

    qry.Recordset := rs;
    

операторы INSERT, UPDATE, DELETE

Для выдачи операторов DML, которые не возвращают набор данных (например, INSERT, UPDATE, DELETE)

  • TADOQuery

    qry.Sql.Text := 'DELETE FROM Users WHERE Name = :username';
    qry.Parameters.ParamByName('username').Value := 'ian';
    qry.ExecuteOptions := [eoExecuteNoRecords];
    qry.ExecSql;
    
  • TADOCommand

    cmd.CommandText := 'DELETE FROM Users WHERE Name = :username';
    cmd.Parameters.ParamByName('username').Value := 'ian';
    cmd.ExecuteOptions := [eoExecuteNoRecords];
    cmd.Execute;
    
  • TADODataSet : не может быть сделано. TADODataSet сгенерирует исключение, если оператор не возвращает набор данных

    ds.CommandText := 'DELETE FROM Users WHERE Name = :username';
    ds.Parameters.ParamByName('username').Value := 'ian';
    ds.ExecuteOptions := [eoExecuteNoRecords];
    ds.Open; // <-- Exception: "CommandText does not return a result set"
    

Форма диаграммы

| Component   | Issue command | Return rows |
|-------------|---------------|-------------| 
| TADODataSet |  No           |  Yes        |
| TADOCommand |  Yes          |  Yes¹       |
| TADOQuery   |  Yes          |  Yes        |

¹ Recordset interface

Иерархия наследования

  • ТСотропепЬ
    • TADOCommand (рядом с собственным доступом ADO)
    • TDataSet (модель базового набора данных Delphi)
      • TCustomADODataSet (представление ADO как DataSet)
        • TADODataSet (не может выдать DML)
        • TADOQuery (может выдавать DML и DQL)
      • TCustomClientDataSet (отображение таблиц в памяти как набора данных)
      • TBDEDataSet (отображение BDE в качестве DataSet)
      • TCustomSQLDataSet (отображение dbExpress в качестве DataSet)

TADOCommand является ближайшим к металлу для выдачи необработанных запросов.

TADODataSet и TADOQuery использовать существующую объектную модель базы данных Delphi для предоставления источников данных ADO

TADODataSet может использоваться только для представления наборов данных

TADOQuery - мастер на все руки, который может делать все.

...