空字段不从空TEdit插入NULL

时间:2016-12-13 01:44:40

标签: mysql sql delphi

我将新的订单详细信息添加到我的数据库中的表中。 其中一列名为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但没有数据。

默认情况下,Nullemail设置为Null,因此不存在问题。

来自workbench的Screenie: enter image description here

那里的值之间应该有2个NULL,但它只是空的。

任何想法为什么?

使用Rad Studio 10 Seattle和dbExpress组件

修改

  • comenziQuery db
  • dbmodule 是保存数据库组件的TSQLQuery的名称
  • 数据集data module
  • comenziConnection TSimpleDataSet
  • 的名称

对于任何未来的读者,请同时阅读所有答案评论,那里有很棒的东西。

3 个答案:

答案 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 *组件。