Показване на sqlite база данни в Delphi XE6 с помощта на firedac програмно

Аз съм нов в базата данни, използвайки Delphi. Всъщност трябва да покажа всички таблици и техните данни в мрежов изглед с помощта на firedac. Няколко видеоклипа в youtube и docwiki учат как да получите достъп до база данни чрез визуални компоненти, т.е. хвърляне на FDConnetion, FDTable, DataSource и т.н. във формуляра.

Но бих искал да направя същото програмно, за да мога да се съсредоточа повече върху кодирането и да отделя формата от бизнес логиката.

Ето какво направих в 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(); }
        }

Бих искал да направя подобно в delphi за 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] ГРЕШКА: няма такава таблица: STUDENTS“. Процес на Project1.exe (3836)

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


person Rabi Jayasawal    schedule 29.09.2014    source източник
comment
Какво сте опитвали досега? Опитахте ли да декларирате екземпляри на обекти и да ги създадете в код, както направихте в C#?   -  person Andy_D    schedule 29.09.2014
comment
Въпросът е редактиран. Моля те, погледни.   -  person Rabi Jayasawal    schedule 29.09.2014


Отговори (2)


Можете да направите същото като с C#: задайте вашето TFDQuery копие като DataSource на VCL мрежата!

Добавете TDataSource към формуляра, задайте неговото свойство DataSet на вашето TFDQuery и го присвойте на вашата мрежа.

Вижте официалната документация на Delphi и други SO въпроси.

person Arnaud Bouchez    schedule 29.09.2014
comment
Опитвал съм нещо подобно. връзка Но това не изглежда да е правилен начин, предполагам. между другото, моля, извинете моите нуб умения. - person Rabi Jayasawal; 30.09.2014

Можете да изпълните вашата 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 и Grid и да ги свържете в код по подобен начин. Ще трябва да преместите обектите Connection и Query извън метода executeQuery на вашия обект, тъй като те са локални променливи и няма да бъдат достъпни за нищо извън този метод.

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

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

person Andy_D    schedule 29.09.2014
comment
Вашият примерен код изпуска памет! променливите con и query не се освобождават. Това далеч не е добър референтен код за показване... :( BTW, OP изобщо не уточнява устойчивостта на обекта, а само запълва визуална мрежа. - person Arnaud Bouchez; 29.09.2014
comment
@ArnaudBouchez Прав си, кодът изпуска памет, но аз взех оригиналния код на OP и просто добавих необходимите стъпки, вместо да пренапиша всичко вместо него. Актуализирах отговора си, за да включа коментар относно изтичането на памет. - person Andy_D; 29.09.2014
comment
@Andy_D: Както виждам, работи с вашия код, но изглежда има проблеми с изтичането на памет. Извинете моите детски умения в Delphi, но не мога да освободя тези обекти за свързване и заявка с помощта на try..finally block. Показва диалогов прозорец за грешка при работа с invlaid указател. Между другото актуализирах кода си, моля, погледнете. - person Rabi Jayasawal; 30.09.2014
comment
@RabiJayasawal Не правете вашата връзка и заявки за локални променливи. Delphi има концепцията за Datamodules, която осигурява централна точка за вашите компоненти за достъп до данни. Вижте документацията за повече информация docwiki.embarcadero.com/RADStudio/XE6/en/Using_Data_Modules - person Andy_D; 30.09.2014
comment
Да, модулите за данни са най-добрият начин да го направите. Аз лично наистина го мразя, но така работи rad. - person Arnaud Bouchez; 02.10.2014
comment
@ArnaudBouchez или това е, или някакъв вид OPF (между другото, актуализирах отговора си, за да включва mORMot, тъй като го оставих извън списъка. Моите извинения, Арно! - person Andy_D; 02.10.2014