如何将 SQL 查询中的项目添加到 TListView
How to add items from an SQL query to a TListView
我想使用 for 循环将查询中的项目添加到 TListView 中。但是我从 ListViewShifts.Items.Add() 行收到一条错误消息,说 'Too many actual parameters' 。从查询中添加到列表的正确方法是什么?
Qry := TFDQuery.Create(DBConnection);
Qry.Connection := DBConnection;
Qry.SQL.Text := 'SELECT Count(10) FROM Bookings WHERE NurseNo=:nurseID;';
Qry.Params.ParamByName('nurseID').AsInteger := NurseID;
Qry.Active := True;
//Fill the list view with the shifts that have the nurses ID
for Count := 0 to 10 do
begin
ListViewShifts.Items.Add(Qry.Fields[Count].AsString);
end;
您需要考虑以下几点:
- 如果您的
ListViewShifts
变量是 TListView
,方法 ListViewShifts.Items.Add
不需要参数。这就是 Too many actual parameters
错误的原因。
- SQL 语句
SELECT Count(10) FROM Bookings WHERE NurseNo=:nurseID;
将 return 结果集只有一列。
- 如果你想获得前 10 行,那么你的语句可能应该是:
SELECT TOP(10) FROM Bookings WHERE NurseNo=:nurseID;
- 使用
First
、Eof
和 Next
数据集方法从结果集中获取记录。
下一个基本示例展示了如何在 TListView
:
中添加 10 项
procedure TMainForm.btnGet(Sender: TObject);
var
li: TListItem;
begin
Qry := TFDQuery.Create(DBConnection);
Qry.Connection := DBConnection;
Qry.SQL.Text := 'SELECT TOP(10) FROM Bookings WHERE NurseNo=:nurseID;';
Qry.Params.ParamByName('nurseID').AsInteger := NurseID;
Qry.Active := True;
Qry.First;
for Count := 1 to 10 do
begin
Qry.Next;
li := ListViewShifts.Items.Add;
li.Caption := Qry.Fields[0].AsString;
end;
(*
Qry.First;
while not Qry.Eof do begin
li := ListViewShifts.Items.Add;
li.Caption := Qry.Fields[0].AsString;
Qry.Next;
end;
*)
end;
VAR
SY1:INTEGER;
mydata:string;
begin
mydata:='mydatabasename';
qry_tables.Close;
qry_tables.SQL.Clear;
qry_tables.SQL.text:= 'SELECT TABLE_NAME NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = '+QuotedStr(mydata);
qry_tables.Open;
ListViewShifts.Clear;
for SY1 := 1 to qry_tables.RecordCount do
begin
ListViewShifts.Items.Add(qry_tables.FieldByName('NAME').TEXT);
qry_tables.NEXT;
end;
我用过mysql
我想使用 for 循环将查询中的项目添加到 TListView 中。但是我从 ListViewShifts.Items.Add() 行收到一条错误消息,说 'Too many actual parameters' 。从查询中添加到列表的正确方法是什么?
Qry := TFDQuery.Create(DBConnection);
Qry.Connection := DBConnection;
Qry.SQL.Text := 'SELECT Count(10) FROM Bookings WHERE NurseNo=:nurseID;';
Qry.Params.ParamByName('nurseID').AsInteger := NurseID;
Qry.Active := True;
//Fill the list view with the shifts that have the nurses ID
for Count := 0 to 10 do
begin
ListViewShifts.Items.Add(Qry.Fields[Count].AsString);
end;
您需要考虑以下几点:
- 如果您的
ListViewShifts
变量是TListView
,方法ListViewShifts.Items.Add
不需要参数。这就是Too many actual parameters
错误的原因。 - SQL 语句
SELECT Count(10) FROM Bookings WHERE NurseNo=:nurseID;
将 return 结果集只有一列。 - 如果你想获得前 10 行,那么你的语句可能应该是:
SELECT TOP(10) FROM Bookings WHERE NurseNo=:nurseID;
- 使用
First
、Eof
和Next
数据集方法从结果集中获取记录。
下一个基本示例展示了如何在 TListView
:
procedure TMainForm.btnGet(Sender: TObject);
var
li: TListItem;
begin
Qry := TFDQuery.Create(DBConnection);
Qry.Connection := DBConnection;
Qry.SQL.Text := 'SELECT TOP(10) FROM Bookings WHERE NurseNo=:nurseID;';
Qry.Params.ParamByName('nurseID').AsInteger := NurseID;
Qry.Active := True;
Qry.First;
for Count := 1 to 10 do
begin
Qry.Next;
li := ListViewShifts.Items.Add;
li.Caption := Qry.Fields[0].AsString;
end;
(*
Qry.First;
while not Qry.Eof do begin
li := ListViewShifts.Items.Add;
li.Caption := Qry.Fields[0].AsString;
Qry.Next;
end;
*)
end;
VAR
SY1:INTEGER;
mydata:string;
begin
mydata:='mydatabasename';
qry_tables.Close;
qry_tables.SQL.Clear;
qry_tables.SQL.text:= 'SELECT TABLE_NAME NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = '+QuotedStr(mydata);
qry_tables.Open;
ListViewShifts.Clear;
for SY1 := 1 to qry_tables.RecordCount do
begin
ListViewShifts.Items.Add(qry_tables.FieldByName('NAME').TEXT);
qry_tables.NEXT;
end;
我用过mysql