通过ODBC传递null

时间:2013-05-29 08:12:20

标签: c# db2 odbc

我在DB2中有一个存储过程,它接受Date作为参数。 我使用此代码在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中的MY SQL看起来像这样

(p_myfield is null or LAST_UPDATE_DATE > p_myfield) 

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分: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值,则会生成错误。有关详细信息,请参阅here

请原谅我的懒惰,没有显示正确的错误处理或其他任何事情。我一直试图弄清楚如何修复这个错误,现在进行了6个小时,并且即将疯狂地抓住“我不能使用命名参数,但我必须使用命名参数!”的捕获22。 p>