通过ODBC传递null

本文关键字:null 传递 ODBC 通过 | 更新日期: 2023-09-27 18:15:44

我在DB2中有一个存储过程,它接受Date作为参数。我用这段代码在c#中给它赋值

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

这个工作很好!然而,有时我想传递它为空,我不能让它工作。我试着

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

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

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

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

(p_myfield is null or LAST_UPDATE_DATE > p_myfield) 

通过ODBC传递null

对于一个可为空的datetime参数,这样的东西应该可以工作

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);
}

我遇到了以下几个错误:

  • 我无法将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个小时,并且即将发疯的catch 22"我不能使用命名参数,但我必须使用命名参数!"