C# 如何创建具有可空值的IDbDataParameter?

C# 如何创建具有可空值的IDbDataParameter?,c#,sql,oracle,C#,Sql,Oracle,我在参数列表中添加了一个空值,用于向表中插入值,该表接受一些空值。以下是我的示例代码: bool sql = true; // .... List<IDbDataParameter> parameters = new List<IDbDataParmeter>(); // adding values... object objVal = 1; parameters.Add( sql ? new SqlParameter("@colIntA", objV

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

 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));
boolsql=true;
// ....
列表参数=新列表();
//正在添加值。。。
objectobjval=1;
参数。添加(
sql?新的SqlParameter(“@colIntA”,objVal):
新的OracleParamer(“:colIntA”,objVal));
//这行不通,我应该补充什么?
objVal=string.Empty;
参数。添加(
sql?新的SqlParameter(“@colIntB”,objVal):
新的OracleParamer(“:colIntB”,objVal));

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

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

您试图将空字符串(“”)分配给int参数,所以是的,这是行不通的

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

(请注意,根据我使用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扩展方法。使事情变得非常简单:实际上在我创建参数的类中,没有IdbConnection,也没有IDbCommand可用。我有一个SQLParameter类,用于创建IDbDataParameter的集合。我确实有关于sql或oracle的信息。我可以创建一个虚拟连接并使用它获取参数吗?好的。SqlConnection和OracleConnection都有新的()构造函数。我想我可以将它作为虚拟连接来获取IdbCommand,然后IdbDataParameter,我是对的还是会抛出异常?不,我不会创建虚拟连接。如果您在创建参数时不知道连接/命令的详细信息,那么您当前的方法可能是最安全的。不能将命令传递到创建参数的方法中吗?
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);