6

我在 DB2 中有一个存储过程,它接受 aDate作为参数。我使用此代码在 C# 中为其分配一个值

cmd.Parameters.Add("myfield", OdbcType.DateTime).Value = MyDate;

这很好用!但是有时我想将它传递给 null 并且我无法让它工作。我试过了

cmd.Parameters.Add("myfield", OdbcType.DateTime);

cmd.Parameters.Add("myfield", OdbcType.DateTime).Value =DBNull.Value

更新

我的 cmd.CommandText = "{ CALL foo.MY_PROC_NAME(?) }"

当我运行它时,它不返回任何行。SP中的我的SQL看起来像这样

(p_myfield is null or LAST_UPDATE_DATE > p_myfield) 
4

2 回答 2

1

像这样的东西应该适用于可为空的日期时间参数

DateTime? myfield

if (null==myfield)
{
 var nullableparam = new OdbcParameter("@myfield", DBNull.Value);
 nullableparam.IsNullable = true;
 nullableparam.OdbcType = OdbcType.DateTime;
 nullableparam.Direction = ParameterDirection.Input;
 cm.Parameters.Add(nullableparam);
}
else
{
 cm.Parameters.AddwithValue("@myfield",myfield);
}
于 2013-05-31T01:09:25.953 回答
1

我遇到了几个错误:

  • 我无法将 NULL 值直接传递给 Odbc
  • 命名参数似乎不起作用。

经过几个小时精疲力竭的故障排除,我终于想到了我是如何在不久前的一个 Java 项目中看到这样做的。我将代码更改为仅使用“?” 对于参数(这就是我在 Java 代码中看到的方式),然后确保按照我希望将参数添加到查询中的顺序将参数添加到 OdbcCommand 对象。就像魔术一样,它奏效了。

这是一个例子:

OdbcTransaction lTransaction = MyConnection.BeginTransaction();
object[] my_params = function_to_get_input();
toInsert = new OdbcCommand();
toInsert.CommandText = string.Format("INSERT INTO table_name (`col1`,`col2`,`col3`) VALUES (?, ?, ?), (?, ?, ?), (?, ?, ?);");
toInsert.Parameters.AddWithValue("val0", my_params[0]);
toInsert.Parameters.AddWithValue("val1", my_params[1]);
toInsert.Parameters.AddWithValue("val2", my_params[2]);
toInsert.Parameters.AddWithValue("val3", my_params[3]);
toInsert.Parameters.AddWithValue("val4", my_params[4]);
toInsert.Parameters.AddWithValue("val5", my_params[5]);
toInsert.Parameters.AddWithValue("val6", my_params[6]);
toInsert.Parameters.AddWithValue("val7", my_params[7]);
toInsert.Parameters.AddWithValue("val8", my_params[8]);
toInsert.Connection = MyConnection;
toInsert.Transaction = lTransaction;
toInsert.ExecuteNonQuery();
lTransaction.Commit();

这种方法可以重写,因此如果您愿意,您可以插入批量数据。如果您要插入批量数据,则必须限制使用一条 INSERT 语句插入的记录数。如果传输到服务器的数据量超过 MAX_ALLOWED_PACKET 值,则会产生错误。有关更多详细信息,请参见此处

请原谅我在此处未显示适当的错误处理或其他任何内容的懒惰。我一直在试图弄清楚如何解决这个错误持续了 6 个小时,并且即将因“我不能使用命名参数,但我必须使用命名参数!”的第 22 条问题而发疯。

于 2015-05-24T04:48:46.683 回答