【问题标题】:Using db2 odbc parameters with Timestamp C#使用带有时间戳 C# 的 db2 odbc 参数
【发布时间】:2016-07-15 16:01:04
【问题描述】:

我正在尝试在 C# 中使用 ODbc 对 DB2 查询使用参数,但 Timestamp 字段给我带来了问题。我正在使用 DB2 Client 9.7 并且 updateDate 是 DateTime 类型。这是我的代码:

string commandString = "INSERT INTO DATABASENAME(USERNAME, UPDATE_DATE) VALUES ('?', TIMESTAMP_FORMAT('?', 'YYYY-MM-DD HH24:MI:SS'))";

OdbcConnection con = new OdbcConnection(conString);
OdbcCommand command = new OdbcCommand(commandString, con);

command.Parameters.AddWithValue("?username", userName);
command.Parameters.AddWithValue("?update_date", updateDate.ToString("yyyy-MM-dd HH:mm:ss"));

//execute the stuff
con.Open();
command.ExecuteNonQuery();
con.Close();

这是我收到的错误:

ERROR [42815] [IBM][CLI Driver][DB2] SQL0171N  The data type, length or value of the argument for the parameter in position "1" of routine "SYSIBM.TIMESTAMP_FORMAT" is incorrect. Parameter name: "".  SQLSTATE=42815

我还尝试使用 DB2 中包含的常规 TIMESTAMP() 函数,使用它接受的两种格式(例如 TIMESTAMP ('2016-10-20-12.00.00.000000') TIMESTAMP ('2016-10-20 12:00:00')),但这给了我这个错误:

ERROR [22007] [IBM][CLI Driver][DB2] SQL0180N  The syntax of the string representation of a datetime value is incorrect.  SQLSTATE=22007

有人知道我哪里出错了吗?

编辑:不用参数也可以,DB2不能用参数吗?

【问题讨论】:

  • 您将updateDate(一个 DateTime)转换为 C# 代码中的字符串,然后尝试将其转换回 SQL 语句中的时间戳。为什么不将参数作为 DateTime 提供?
  • @mustaccio 把我的参数改成这样? command.Parameters.AddWithValue("?update_date", updateDate);当我尝试这样做时,我收到“检测到无效的日期时间格式,指定了无效的字符串表示”的错误。在我的命令字符串中,我还将 updateDate 更改为常规参数而不是字符串?与“?”无论如何都没有运气。

标签: c# db2 odbc db2-luw


【解决方案1】:

我无法对此进行测试,但我认为您不应将参数标记括在引号中,它们是参数,而不是文字。你的陈述应该是这样的

string commandString = "INSERT INTO DATABASENAME(USERNAME, UPDATE_DATE) VALUES (?,?)";

然后你也不需要从DateTime到字符串到TIMESTAMP的双重转换:

command.Parameters.AddWithValue("?username", userName);
command.Parameters.AddWithValue("?update_date", updateDate);

【讨论】:

  • 当我尝试这个时,我得到了这个错误,我的字符串值对于允许的字符来说也不是太大。 ERROR [22001] [IBM][CLI Driver] CLI0109E String data right truncation. SQLSTATE=22001
  • 哎呀,我把参数分配的顺序搞砸了。那解决了它!谢谢!
  • @Esperento57 是的!感谢您的帮助
【解决方案2】:

可能是时间戳格式错误。

尝试做 updateDate.ToString("yyyy-MM-dd.HH.mm.ss.ffffff"));

【讨论】:

  • 我尝试了你的建议,也不得不将我的时间戳函数更改为:TIMESTAMP_FORMAT('?', 'YYYY-MM-DD HH24:MI:SS:NNNNNN')。我仍然收到“Arument 1 格式不正确”的原始错误消息。
【解决方案3】:

试试看:

string commandString =string.format("INSERT INTO DATABASENAME(USERNAME, UPDATE_DATE) VALUES ('{0}', '{1}')", userName, updateDate.ToString("yyyy-MM-dd.HH.mm.ss.ffffff"));

OdbcConnection con = new OdbcConnection(conString);
OdbcCommand command = new OdbcCommand(commandString, con);

//execute the stuff
con.Open();
command.ExecuteNonQuery();
con.Close();

【讨论】:

  • 它仍然给了我一个错误,但将它切换到updateDate.ToString("yyyy-MM-dd HH:mm:ss") 可以。为什么我不能使用参数来做到这一点?
  • 很高兴,它的工作,就像我认为问题是传递给 TIMESTAMP_FORMAT 的格式字符串的转换或者你如何传递你的参数
  • 谢谢!你知道为什么我不能使用参数来做同样的事情吗?
  • 可能是这样的语法: cmd.CommandText = "SELECT dec_col FROM MYTABLE WHERE dec_col > ? "; OdbcParameter p1 = cmd.CreateParameter(); p1.DbType = DbType.Decimal; p1.Value = 10.0; cmd.Parameters.Add(p1); IDataReader rdr = cmd.ExecuteReader();添加您的参数,正确修改类型和值。
  • 如果他不工作,请输入参数时间戳类型,如字符串或 Ansistring
【解决方案4】:
        string commandString = "INSERT INTO DATABASENAME(USERNAME, UPDATE_DATE) VALUES ('?','?')";

        OdbcConnection con = new OdbcConnection(conString);
        OdbcCommand command = new OdbcCommand(commandString, con);

        OdbcParameter p1 = command.CreateParameter();
        p1.DbType = DbType.AnsiString;
        p1.Value = userName;
        command.Parameters.Add(p1);

        OdbcParameter p2 = command.CreateParameter();
        p2.DbType = DbType.AnsiString;
        p2.Value = updateDate.ToString("yyyy-MM-dd HH:mm:ss");
        command.Parameters.Add(p2);


        con.Open();
        command.ExecuteNonQuery();
        con.Close();

【讨论】:

  • 仍然为 updateDate 提供相同的错误。我也尝试了所有涉及 Date 的 DBType。 ERROR [22007] [IBM][CLI Driver][DB2] SQL0180N The syntax of the string representation of a datetime value is incorrect. SQLSTATE=22007 ODbc 好像没有正确输入参数。
  • 是的 ODBC 有问题,我通常将 idb2command 与 c# .net 一起使用。如果您尝试使用此代码并 updateDate.ToString("yyyy-MM-dd.HH.mm.ss.ffffff")); ??
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-09
  • 1970-01-01
  • 1970-01-01
  • 2017-01-21
  • 2019-03-09
  • 2015-01-26
相关资源
最近更新 更多