我正在尝试使用Lazarus和SQLdb组件编写一个简单的SQLite 3应用程序。
我已设法连接到数据库并填充TDBGrid
。问题是作为文本字段的所有列都显示值“(MEMO)”而不是数据库中的字符串。
答案 0 :(得分:1)
另一个选择
如果您使用的是TZConection,则在连接数据库时将此行添加到代码中
TZConnection).Properties.Add('Undefined_Varchar_AsString_Length=100');
答案 1 :(得分:1)
我找到了一个简单的解决方案:
必须启用dgDisplayMemoText
中的属性DBGrid
。
答案 2 :(得分:0)
正如在IRC上所说,您可能需要将查询的字段添加到表单中(以便为它们生成“字段”组件),然后实现TMemoField.GetText
事件。
查看是否在对象检查器中输入“fields”字段会调出一个编辑器来生成组件(在Zeos iirc中这样做)。
答案 3 :(得分:0)
备注字段无法显示在TDBGrid
中。将TDBMemo
添加到表单并将其连接到同一TDataSource
。在这种情况下,您将在备忘录中看到该文本。
答案 4 :(得分:0)
我忘记了这个的来源,但这就是我在tdbgrid中使用备注字段所做的事情。 关于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控件并在 Object Inspector (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;
变量MemoFieldReveal指向类MemoDifier。不要忘记修改索引(Items [x])以指向显示(MEMO)文本的tdbgrid项目/字段的索引号。
答案 5 :(得分:0)
我在MySQL和Tgrid中也一样,所以我希望答案是一样的,因为它非常简单: - )
假设s是导致问题的字段,而不是写
SELECT s
写
SELECT LEFT(s,200) AS s
答案 6 :(得分:0)
在一个相当古老的论坛帖子中,我找到了一个适合我的解决方案(德语/英语):
SqLite, Zeos und keine Textanzeige, im DbGrid steht (MEMO) - Zeoslib Portal
如果您将SQLite数据库中的字段类型从text
更改为varchar
,则文本会在TDBGrid
中按预期显示。
您可能知道,SQLite不允许您更改列的字段类型。因此,如果您已经在数据库中存储了有价值的数据,请使用本教程中描述的步骤
SQLite ALTER TABLE & How To Overcome Its Limitations
这是另一个选项
sqlite3 your.db .dump >your.sql
)s/\<text\>/varchar/
)sqlite3 your2.db <your.sql
)答案 7 :(得分:0)
一个看似简单的解决方案是使用VARCHAR(n)这样的列类型来限制字段中TEXT的长度,其中n是允许的最大字符数。
答案 8 :(得分:-1)
本文提供了一个解决方案:Displaying and editing MEMO fiels in Delphi's TDBGrid。
在这里,我总结了你要做的事情:
OnGetText = MyDataSetMyFieldGetText
添加到属于您的数据集的TMemoField
(此处为MyField
}(例如TTable
,此处命名为MyDataSet
})
.pas> 中的
interface
&gt; type
&gt;在表单定义中,添加
procedure MyDataSetMyFieldGetText(Sender: TField; var Text: string; DisplayText: Boolean);
中的
implementation
&gt;添加此方法
procedure TDM.WorkVisiteNoteGetText(Sender: TField; var Text: string; DisplayText: Boolean);
begin
Text := Copy(WorkVisiteNote.AsString, 1, 100);
end;