2

我是使用 Delphi 的数据库新手。实际上我需要使用firedac在gridview中显示所有表格及其数据。youtube 和 docwiki 上的几个视频教授了如何通过可视化组件访问数据库,即在表单上抛出 FDConnetion、FDTable、DataSource 等。

但我想以编程方式做同样的事情,以便我可以更多地专注于编码并将表单与业务逻辑分开。

这是我在访问 MSAccess 数据时在 C# 中所做的:

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 的第一次机会异常。带有消息“[FireDAC][Phys][SQLite] 错误:没有这样的表:STUDENTS”的异常类 ESQLiteNativeException。处理 Project1.exe (3836)

虽然表中存在相同的表名并使用可视化的 fireac 组件,但我可以看到数据网格很容易填充。

4

2 回答 2

1

您可以像使用 C# 一样:将您的TFDQuery实例分配为 VCL 网格的 DataSource!

将 a 添加TDataSource到表单,将其DataSet属性设置为 your TFDQuery,并将其分配给您的网格。

请参阅Delphi 官方文档和其他SO 问题

于 2014-09-29T12:51:42.630 回答
-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;

然后,您可以以编程方式创建 aTDataSource和 Grid 并以类似的方式将它们连接到代码中。您需要将 Connection 和 Query 对象移出对象的executeQuery方法,因为它们是局部变量,并且该方法之外的任何东西都无法访问它们。

请注意,Delphi 不像 C# 那样进行垃圾收集,因此代码会泄漏内存。

顺便说一句,您的代码似乎是一个对象方法,看起来您正在尝试创建一组知道如何加载和保存自己的业务对象。与其自己动手,不如通过查看现有框架之一(tiOPF、InstantObjects、mORMot 或 TMS Aurelius)来实现这一点,为您提供更好的服务。这些将使您能够专注于解决手头的问题,而不必担心创建、加载和保存对象的细节。

于 2014-09-29T12:40:52.220 回答