我正在尝试使用Lazarus和SQLdb组件编写一个简单的SQLite应用程序。
我连接到数据库并填充了一个TDBGrid。问题是,所有文本字段显示值“(MEMO)”,而不是数据库中的字符串。
我连接到数据库并填充了一个TDBGrid。问题是,所有文本字段显示值“(MEMO)”,而不是数据库中的字符串。
DBGrid
的dgDisplayMemoText
属性。我不知道这篇文章的来源,但是我正在使用tdbgrid中的备忘录字段。bluish关于gettext事件的说法是正确的,以下是如何在代码中实现它:
创建一个名为MemoDifier的类:
MemoDifier = class
public
procedure DBGridOnGetText(Sender: TField; var aText: string;
DisplayText: boolean);
end;
procedure MemoDifier.DBGridOnGetText(Sender: TField; var aText: string;
DisplayText: boolean);
begin
if (DisplayText) then
aText := Sender.AsString;
end;
接下来在你的表单中点击tdbgrid控件,在对象检查器(Lazarus IDE)中,点击事件选项卡,向下滚动以找到OnPrepareCanvas事件。双击它以生成代码。然后修改代码以适应你的需要,例如你的tdbgrid控件的名称:
procedure Tmainui.TDBGrid1PrepareCanvas(sender: TObject;
DataCol: Integer; Column: TColumn; AState: TGridDrawState);
var
MemoFieldReveal: MemoDifier;
begin
if (DataCol = 1) then
begin
try
TDBGrid1.Columns.Items[0].Field.OnGetText := @MemoFieldReveal.DBGridOnGetText;
TDBGrid1.Columns.Items[1].Field.OnGetText := @MemoFieldReveal.DBGridOnGetText;
TDBGrid1.Columns.Items[2].Field.OnGetText := @MemoFieldReveal.DBGridOnGetText;
except
On E: Exception do
begin
ShowMessage('Exception caught : ' + E.Message);
end;
end;
end;
end;
虽然这是一个老问题,但我在寻找类似问题的解决方案时遇到了它,不同的是我是通过代码检索数据而不是使用DBGrid。当我使用DisplayText
或Text
方法检索字符串字段时,我得到的是“(memo)”而不是正确的值。
答案其实很简单... TSQLQuery类拥有一组名为AsXxx
的方法,可以根据数据类型获取数据。在这里,使用AsString来内联分配变量。
SQLQuery1.Open;
//some check to make sure there are fields
name:=SQLQuery1.Fields[1].AsString; //gives "English" for example
code:=SQLQuery1.Fields[2].DisplayText; //gives "(Memo) instead of "en"
SQLQuery1.Open;
//some check to make sure there are fields
with SQLQuery1.FieldDefs[1].DataType of
ftMemo: SQLQuery1.Fields[1].DisplayText; //gives "(Memo)"
ftString: name:=SQLQuery1.Fields[1].AsString; //gives "English" for example
...
end;
如果你在调试时查看数据类型,你会发现在SQLite中,任何文本都被视为ftMemo,而不是ftString,因为那里只有一种文本类型。
在 TDBGrid
中无法显示备忘字段。在表单中添加 TDBMemo
并将其连接到相同的 TDataSource
。在这种情况下,您将在备忘录中看到文本。
你也可以在SQL中简单地使用TRIM:
SELECT TRIM(myfield) as NewField
TMemoField.GetText
事件。如果是 Oracle 数据库,更改 Tquery 并放入 select 字符串 .... 将字段转换为 varchar2(100) 类型的字段 ....
我在MySQL和Tgrid中都有同样的问题,所以我希望答案也是相同的,因为它非常简单 :-)
假设s是导致问题的字段,那么不要写
SELECT s
编写
SELECT LEFT(s,200) AS s