【问题标题】:How to set a NULL column value through an ADO query connected to a MySQL ODBC source in C++?如何通过连接到 C++ 中的 MySQL ODBC 源的 ADO 查询设置 NULL 列值?
【发布时间】:2021-04-23 17:40:27
【问题描述】:

给定一个给定的 MySQL 表

DESC tabl_foo;
--------------------------------
Field            Type         Null    Key    Default    Extra
-----------------------------------------------------------------
fooId            varchar(15)  NO      PRI    NULL
FooDate          date         YES     MUL    NULL

我需要更新给定行的FooDate。所以我尝试了这段代码:

query->SQL->Add("UPDATE tbl_foo SET FooDate = :FooDate WHERE fooId = :id"):

// both arguments are AnsiString
query->Parameters->FindParam("id")->Value = FoodId;
query->Parameters->FindParam("FooDate")->Value = FooDate; 

query->ExecSQL();

但是,这失败了

不正确的日期值:第 1 行 FooDate 的“”

原来FooDate可能是一个空字符串(或{ data:NULL }),而MySQL不喜欢这样。所以,我尝试设置Null()

if (FooDate.IsEmpty())
   query->Parameters->FindParam("FooDate")->Value = Null();
else
   query->Parameters->FindParam("FooDate")->Value = FooDate;

然后我得到这个错误:

参数对象定义不正确。提供的信息不一致或不完整。

应该为 MySQL NULL 设置什么值?

【问题讨论】:

  • 使用像'9999-01-01'这样的日期空日期总是复杂的
  • 只是为了检查一下 - 你每次都在Clear()'ing SQL 吗?把query->SQL->Add("UPDATE ...");换成query->SQL->Text = "UPDATE ...";会不会有同样的问题?
  • 你试过用Unassigned()代替Null()吗?
  • 会尝试 ...FindParam("FooDate")->Value = "NULL";
  • @Baxter 这将分配一个字符串值"NULL",而不是真正的NULL。如果该列不支持字符串,那将失败

标签: c++ mysql c++builder ado vcl


【解决方案1】:

要进行更新,系统需要知道参数的类型。它可以从你应用的变量中推断出类型,MySQL 可以为你做某些转换,但最好指定数据类型。

所以你需要的是这样的:

  if((pParam=query->Parameters->FindParam("FooDate"))!=NULL)
  {
    pParam->DataType=ftDate;
    if(FooDate.IsEmpty())
    {
      pParam->Value=Null();
    }
    else
    {
      pParam->Value=FooDate;
    }
  }

您可能希望将 FooDate 保留为 TDateTime,但您需要正确检测 NULL 日期。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-23
    • 1970-01-01
    • 2021-01-02
    • 1970-01-01
    相关资源
    最近更新 更多