2014-09-29 11 views
2

Я новичок в базе данных, используя Delphi. На самом деле мне нужно отобразить все таблицы и их данные в gridview с помощью firedac. Несколько видеороликов на youtube и docwiki рассказывают о том, как получить доступ к базе данных через визуальные компоненты, то есть бросить FDConnetion, FDTable, DataSource и т. Д. В форме.Показать базу данных sqlite в Delphi XE6, используя программно firedac

Но я хотел бы сделать то же самое программно, чтобы больше сосредоточиться на кодировании и отдельной форме из бизнес-логики.

Вот что я сделал в C# во время доступа к данным MSACCESS:

public void LoadUsersInfo() 
     { 

      try { 
       OleDbConnection Connection = new OleDbConnection();   
       Connection.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;DataSource=dbCyberNet.accdb;Persist Security Info=False;";   
       Connection.Open(); 
       OleDbCommand command = new OleDbCommand(); 
       command.Connection = Connection; 
       String query = "SELECT * FROM tblUsersInfo"; 
       command.CommandText = query; 

       OleDbDataAdapter adapter = new OleDbDataAdapter(command); 
       DataTable dt = new DataTable(); 
       adapter.Fill(dt); 
       dbGrid.DataSource = dt; 
      } 
      catch (Exception ex) { 
       MessageBox.Show("Error occured while loading users information . " + ex.Message.ToString()); 
      } 
      finally { Connection.Close(); } 
     } 

Я хотел бы сделать то же в Дельфах для SQLite базы данных. Вот что я пробовал (редактировал).

procedure TForm1.Button1Click(Sender: TObject); 
var 
    con: TFDConnection; 
    table: TFDTable; 
    ds: TDataSource; 
begin 
    con := TFDConnection.Create(nil); 
    con.LoginPrompt := False; 
    table := TFDTable.Create(nil); 
    table.TableName := 'Students'; 
    ds := TDataSource.Create(nil); 
    ds.DataSet := table; 

    try 
    con.Open('DriverID=SQLite;Database=‪studentsDB.sqlite;'); 
    table.Connection := con; 
    table.Active := True; 
    con.Connected := True; 
    DBGrid1.DataSource := ds; 
    finally 
    con.Close; 
    con.Free; 
    table.Free; 
    ds.Free; 
    end; 
end; 

Всякий раз, когда я запускаю этот код, появляется диалоговое окно с сообщением об ошибке: Первое случайное исключение в $ 759AF097. Класс исключений ESQLiteNativeException с сообщением '[FireDAC] [Phys] [SQLite] ОШИБКА: нет такой таблицы: СТУДЕНТЫ. Process Project1.exe (3836)

, в то время как одно и то же имя таблицы существует внутри таблицы и с использованием компонентов visual firedac, я вижу, что сетка данных заполняется легко.

+1

Что вы пробовали? Вы пытались объявить экземпляры объектов и создавать их в коде, как это было на C#? –

+0

Вопрос отредактирован. Пожалуйста, смотрите. –

ответ

-1

Вы можете выполнить свой Select запрос путем вызова Open метода в выборке, так что ваш код будет выглядеть следующим образом: -

procedure TStudents.executeQuery; 
var 
    con: TFDConnection; 
    query: TFDQuery; 
begin 
    con := TFDConnection.Create(nil); 
    query := TFDQuery.Create(con); 
    con.LoginPrompt := False; 
    con.Open('DriverID=SQLite;Database=studentsDB.sqlite;'); 
    query.Connection := con; 
    query.SQL.Text := 'SELECT * FROM Students'; 
    query.Open; 
    query.First; 
    While Not Query.EOF Do 
    Begin 
    // Populate your object or do whatever processing you like here. 
    Query.Next; 
    End; 
end; 

Вы можете программно создать TDataSource и сетку и крючок тех, в коде в подобный способ. Вам нужно будет перенести объекты Connection и Query из метода executeQuery вашего объекта, поскольку они являются локальными переменными и не будут доступны ни для чего вне этого метода.

Обратите внимание, что Delphi не собирает мусор, как C#, так как он стоит, код теряет память.

Как в стороне, ваш код выглядит как метод объекта, и похоже, что вы пытаетесь создать набор бизнес-объектов, которые знают, как загружать и сохранять себя. Вместо того, чтобы катиться самостоятельно, вам может быть лучше, если вы посмотрите на одну из существующих существующих фреймворков (tiOPF, InstantObjects, mORMot или TMS Aurelius). Это позволит вам сосредоточиться на решении проблемы, а не беспокоиться о мелочах создания, загрузки и сохранения объектов.

+1

Ваш образец кода пропускает память! переменные con и query не освобождаются. Это далеко не хороший ссылочный код, чтобы показать ... :(BTW, OP совсем не указывает на постоянство объекта, но только заполняет визуальную сетку. –

+0

@ArnaudBouchez Вы правы, код действительно течет памятью, но я взял исходный код OP и просто добавил необходимые шаги, а не переписал все это для него. Я обновил свой ответ, чтобы включить комментарий о утечке памяти. –

+0

@Andy_D: Как я вижу, он работает с вашим кодом, но, похоже, проблемы с утечкой памяти. Простите мои детские навыки в Delphi, но я не могу освободить эти объекты соединения и запроса, используя блок try..finally. Он отображает диалоговое окно с ошибкой операции invlaid pointer. Btw Я обновил свой код, пожалуйста, посмотрите. –

1

Вы можете сделать то же самое, что и с C#: присвойте свой экземпляр TFDQuery как источник данных сетки VCL!

Добавить TDataSource к форме, установить ее DataSet собственности на ваш TFDQuery и присвоить его вашей сетке.

См. the official Delphi documentation и другие SO questions.

+0

Я пробовал что-то вроде этого. [Link] (http: // pastebin.com/4g5UQYTv) Но это не похоже на правильный путь, я думаю. Кстати, извините мои навыки noob. –

Смежные вопросы