【问题标题】:Null field not inserting NULL from empty TEdit空字段未从空 TEdit 插入 NULL
【发布时间】:2016-12-13 01:44:40
【问题描述】:

我将新订单详细信息添加到我的数据库中的表中。 其中一列名为email,在我创建的表单中,我在我的delphi应用程序和随后的db中添加新订单,我使用TEdits来传递数据。

这是代码:

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 值,则它显示为空 - 不为空,但也没有数据。

email 列在db 中默认设置为Null,所以这不是问题。

工作台屏幕截图:

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

有什么想法吗?

使用 Rad Studio 10 Seattle 和 dbExpress 组件


编辑

  • comenziQueryTSQLQuery
  • dbmodule 是包含数据库组件的data module 的名称
  • 数据集TSimpleDataSet
  • comenziConnectionTSQLConnection 的名称

对于任何未来的读者,请务必阅读 cmets 的所有答案,那里有很棒的东西。

【问题讨论】:

    标签: mysql sql delphi


    【解决方案1】:

    空字符串与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);
    

    【讨论】:

    • 通过添加另一个参数行并设置 .DataType:=ftString 然后将 .Clear 替换为 .Value:=Null; 来修复- 工作得很好。谢谢你:)
    • 如果你现在把它放入function NullIfEmpty(const s: string): Variant,你就有了可重用的代码。
    • 参数没有清除方法
    • @kobik 这就是我的想法,具体取决于组件。其他人将其添加到我的答案中,但我只是添加了 := NULL;,因为 OP 确实提到了这一点。我知道至少 ADO 有一个Clear 选项。
    • ADO 也没有 Clear
    【解决方案2】:

    您遇到的问题是由于使用了ParamByName( 'email' ).AsString,这会将电子邮件列设置为空白字符串。如果您希望它保持为空,我会使用这样的代码来清除参数,

    if Trim(addOrderForm.Edit4.Text) = '' then
      dbmodule.comenziQuery.Params.ParamByName('email').Clear
    else
      dbmodule.comenziQuery.Params.ParamByName('email').AsString := Trim(addOrderForm.Edit4.Text);
    

    【讨论】:

      【解决方案3】:

      您应该使用自动处理此类问题的 TDB* 组件。

      【讨论】:

      • 呃?标准 db-aware 组件将字段设置为 Null?
      • OP 并未暗示他们希望使用这些控件。就个人而言,我不怪他们。他们可能会让事情变得更容易,但他们的工作方式很糟糕而且过时了。我只使用TDBGrid,但我总是自己绘制单元格。
      • @JerryDodge:您能否提供更多有关您的评论的信息,因为这些组件是我的工作马匹。为什么它们过时了?什么是替代方案?这种类型的问题通常是当您必须处理 NULL 时,但这些组件处理得很好
      • 我看不到数据感知组件如何解决 OP 问题。我同意当您知道如何/何时使用它们时它们会更强大,但是 TDBEdit 不会像您建议的那样 自动 将空字符串保存为 null ...
      • @ChristineRoss,我什么都不混。我知道TDB* 组件是如何工作的。你的答案是you should use TDB* components which handle automatically such problems. 这根本不是真的。 OP 明确希望将空字符串保存为 NULL。如果您想根据您的 cmets 扩展您的答案,请这样做。
      猜你喜欢
      • 1970-01-01
      • 2014-02-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-31
      • 2023-04-05
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      相关资源
      最近更新 更多