【问题标题】:how to create IDbDataParameter with null-able value?如何创建具有可空值的 IDbDataParameter?
【发布时间】:2010-11-15 07:17:36
【问题描述】:

我在参数列表中添加了一个空值,用于向表中插入值,该表接受一些空值。这是我的示例代码:

 bool sql = true;
 // ....
 List<IDbDataParameter> parameters = new List<IDbDataParmeter>();
 // adding values...
 object objVal = 1;
 parameters.Add(
    sql ? new SqlParameter("@colIntA", objVal) : 
          new OracleParamer(":colIntA", objVal));
 // this would not work, what should I add?
 objVal = string.Empty;
 parameters.Add(
    sql ? new SqlParameter("@colIntB", objVal) : 
          new OracleParamer(":colIntB", objVal));

不确定我是否使用了 db 特定的 DbNull 值,这也是 SQL 或 Oracle 特定的吗?

【问题讨论】:

    标签: c# sql oracle


    【解决方案1】:

    使用 DbNull.Value。这适用于任何与 ADO.NET 兼容的数据源(SQL 和 Oracle 提供程序),因为提供程序有责任知道在遇到 DbNull 值时该怎么做。

    【讨论】:

      【解决方案2】:

      您正试图将一个空字符串 ('') 分配给那里的一个 int 参数,所以是的,这是行不通的。

      要表示独立于数据库的空值,请使用DbNull.Value

       new SqlParameter("colIntB", DbNull.Value)
      

      (请注意,根据我对 Sqlparameters 的经验,我已经省略了“@”。我不确定您是否可以对 Oracle 的“:”执行相同的操作。)

      一个额外的提示:使用您的连接来创建命令,并使用命令来创建参数。这将根据底层连接的类型创建正确类的实例:

      IDbConnection conn = sql ? new SqlConnection(...) : new OracleConnection(...);
      
      // this will give you either an SqlCommand or an OracleCommand
      IDbCommand cmd = conn.CreateCommand();
      
      // this will give you either an SqlParameter or an OracleParameter
      IDbDataParameter param1 = cmd.CreateParameter();
      param1.ParameterName = "colIntB";
      param1.Value = objVal;
      
      cmd.Parameters.Add(param1);
      

      【讨论】:

      • 获取参数非常有趣的一点。如果我有一个参数列表,我可能需要创建一个循环来创建、设置名称、设置值和设置方向(如果需要)。谢谢!
      • David - 也看看我的 AddInputParameters 扩展方法。让事情变得非常简单:madprops.org/blog/…
      • 实际上在我的例子中创建参数的类中,没有 IdbConnection 也没有 IDbCommand 可用。我有一个用于创建 IDbDataParameter 集合的 SQLParameter 类。我确实有关于 sql 或 oracle 的信息。我可以创建一个虚拟连接并使用它获取参数吗?
      • 好的。 SqlConnection 和 OracleConnection 都有 new() CTOR。我想我可以将它作为虚拟连接来获取 IdbCommand,然后是 IdbDataParameter,我是对的还是会抛出异常?
      • 不,我不会创建虚拟连接。如果您在创建参数时不知道连接/命令详细信息,那么您当前的方法可能是最安全的。不能把命令传给创建参数的方法吗?
      猜你喜欢
      • 1970-01-01
      • 2014-10-11
      • 1970-01-01
      • 1970-01-01
      • 2017-01-20
      • 2018-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多