将 db2 odbc 参数与时间戳 C# 结合使用
Using db2 odbc parameters with Timestamp C#
我正在尝试在 C# 中使用 ODbc 为 DB2 查询使用参数,但时间戳字段给我带来了问题。我使用的是 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.ToString("yyyy-MM-dd.HH.mm.ss.ffffff"));
试一试:
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();
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();
我无法对此进行测试,但我认为您不应将参数标记括在引号中,它们是参数,而不是文字。你的陈述应该看起来像
string commandString = "INSERT INTO DATABASENAME(USERNAME, UPDATE_DATE) VALUES (?,?)";
然后你也不需要从 DateTime
到字符串再到 TIMESTAMP
:
的双重转换
command.Parameters.AddWithValue("?username", userName);
command.Parameters.AddWithValue("?update_date", updateDate);
我正在尝试在 C# 中使用 ODbc 为 DB2 查询使用参数,但时间戳字段给我带来了问题。我使用的是 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.ToString("yyyy-MM-dd.HH.mm.ss.ffffff"));
试一试:
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();
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();
我无法对此进行测试,但我认为您不应将参数标记括在引号中,它们是参数,而不是文字。你的陈述应该看起来像
string commandString = "INSERT INTO DATABASENAME(USERNAME, UPDATE_DATE) VALUES (?,?)";
然后你也不需要从 DateTime
到字符串再到 TIMESTAMP
:
command.Parameters.AddWithValue("?username", userName);
command.Parameters.AddWithValue("?update_date", updateDate);