我将新的订单详细信息添加到我的数据库中的表中。
其中一列名为class AppComponent {
constructor() {
this.options = {
title : { text : 'simple chart' },
series: [{
data: [29.9, 71.5, 106.4, 129]
}],
lang: { thousandsSep: ',' }
};
}
options: Object;
}
,我创建的形式是为了在我的delphi应用程序中添加新订单,随后是db,我使用email
来传递数据。
这是代码:
TEdit
如果我在表单上留空procedure TForm2.actAddComandaExecute(Sender: TObject);
begin
if dbmodule.comenziConnection.Connected then
begin
if addOrderForm.ShowModal=mrok then
begin
dbmodule.comenziQuery.SQL.Clear;
dbmodule.comenziQuery.SQL.Add( 'insert into `r33758pi_tipotask`.`comenzi` ( stare, client, telefon, email, detalii, livrare, pret, user, status, observatii ) values ( :stare, :client, :telefon, :email, :detalii, :livrare, :pret, :user, :status, :observatii ) ' ) ;
dbmodule.comenziQuery.Params.ParamByName( 'stare' ).AsString := addOrderForm.ComboBoxEx1.Text ;
dbmodule.comenziQuery.Params.ParamByName( 'client' ).AsString := addOrderForm.Edit2.Text ;
dbmodule.comenziQuery.Params.ParamByName( 'telefon' ).AsString := addOrderForm.Edit3.Text ;
dbmodule.comenziQuery.Params.ParamByName( 'email' ).AsString := addOrderForm.Edit4.Text ;
dbmodule.comenziQuery.Params.ParamByName( 'detalii' ).AsString := addOrderForm.Edit5.Text ;
dbmodule.comenziQuery.Params.ParamByName( 'livrare' ).AsString := addOrderForm.ComboBoxEx6.Text ;
dbmodule.comenziQuery.Params.ParamByName( 'pret' ).AsString := addOrderForm.Edit7.Text ;
dbmodule.comenziQuery.Params.ParamByName( 'user' ).AsString := addOrderForm.ComboBoxEx8.Text ;
dbmodule.comenziQuery.Params.ParamByName( 'status' ).AsString := addOrderForm.ComboBoxEx9.Text ;
dbmodule.comenziQuery.Params.ParamByName( 'observatii' ).AsString := addOrderForm.Edit10.Text ;
dbmodule.comenziQuery.ExecSQL ;
end;
end;
end;
,则所有内容都会插入,但该订单的字段Edit4
没有email
值,但它显示为空 - 不是null但没有数据。
默认情况下,Null
列email
设置为Null
,因此不存在问题。
那里的值之间应该有2个NULL,但它只是空的。
任何想法为什么?
使用Rad Studio 10 Seattle和dbExpress组件
修改
db
TSQLQuery
的名称data module
TSimpleDataSet
对于任何未来的读者,请同时阅读所有答案评论,那里有很棒的东西。
答案 0 :(得分:8)
空字符串与NULL
字符串不同。谈到SQL,您需要了解其中的差异。
您需要添加某种逻辑来编写字符串值与空值,例如...
if addOrderForm.Edit5.Text <> '' then
dbmodule.comenziQuery.Params.ParamByName('detalii').AsString := addOrderForm.Edit5.Text
else
dbmodule.comenziQuery.Params.ParamByName('detalii').Value := NULL;
这样,如果编辑控件为空,则NULL
将写入表字段而不是空字符串。
根据建议,这可以进一步包含在一个常用功能中,以节省您编写大量代码的费用:
function NullIfEmpty(const S: string): Variant;
begin
if S <> '' then
Result := S
else
Result := NULL;
end;
然后像......一样使用它。
dbmodule.comenziQuery.Params.ParamByName('detalii'):=
NullIfEmpty(addOrderForm.Edit5.Text);
答案 1 :(得分:2)
您遇到的问题是使用ParamByName( 'email' ).AsString
,这会将电子邮件列设置为空字符串。如果你希望它保持为null,我会使用这样的代码来清除参数,
if Trim(addOrderForm.Edit4.Text) = '' then
dbmodule.comenziQuery.Params.ParamByName('email').Clear
else
dbmodule.comenziQuery.Params.ParamByName('email').AsString := Trim(addOrderForm.Edit4.Text);
答案 2 :(得分:-6)
您应该使用自动处理此类问题的TDB *组件。