这里是我写的一个执行存储过程的方法的一部分
OracleCommand myCommand = new OracleCommand();
myCommand.Connection = myConnection;

//收集入参
for ( int i = 0; i< inParameter.Length ;i++)
{
OracleParameter p1 = new OracleParameter((string)inParameterName[i],OracleType.VarChar,100000);
p1.Direction=System.Data.ParameterDirection.Input;
p1.Value = (string)inParameter[i];
myCommand.Parameters.Add(p1);
} ArrayList outParameters = new ArrayList(); //收集出参
for ( int i = 0; i< outParameter.Length ;i++)
{
OracleParameter p2 = new OracleParameter((string)outParameterName[i], OracleType.VarChar,1000);
p2.Direction = System.Data.ParameterDirection.Output;
myCommand.Parameters.Add(p2);
outParameters.Add(p2);
}
myCommand.CommandType = System.Data.CommandType.StoredProcedure; myCommand.CommandText = storeName;
try
{
myCommand.ExecuteNonQuery(); //收集出参的值,放入一个 ArrayList 中去 
for ( int i=0;i<outParameters.Count;i++)
{
returns.Add( ((OracleParameter)outParameters[i]).Value.ToString().Trim() );
}
}
catch(Exception ee)
{
myCommand.Dispose();
myConnection.Close();
myConnection.Dispose();
returns[0] = ee.ToString() + ee.Source;
return returns;
}其中inParameterName[i]是存储过程中入参的名称,inParameter[i]是入参的值,问题如下:当我的inParameter[i]=""时,存储过程执行失败(该列允许为空)。只有将inParameter[i]改为" "时,才能执行成功。原因是什么呢。

解决方案 »

  1.   

    sqlserver 里允许为空的意思是,可以为null,null 和 "" 是两个不同的概念.
      

  2.   

    应该是这一句出了问题 
    p1.Value = (string)inParameter[i];inParameter[i]是什么类型?? 你给它赋"",就确定它是string了?
      

  3.   

    我连的是oracle数据库,当我插入到一个""值到允许为空的字段后,见:myCommand.Parameters.Add(p1);存储过程出错。见:myCommand.ExecuteNonQuery();
      

  4.   

    建议你在需要时为""时,传递的inParameter[i]=null
      

  5.   

    ===========================
    建议你在需要时为""时,传递的inParameter[i]=null
    ===========================
    我将p1.Value = (string)inParameter[i];改为p1.Value = (string)inParameter[i]==""?null:(string)inParameter[i];
    仍然出错
      

  6.   

    p1.Value = System.DBNull.Value 
    orcal没有用过,不太清楚,错了只当瞎说
      

  7.   

    用上面的例子试了下,应该是字符串转换造成的问题,如下:
    using System;
    namespace my
    {
    class stringTrim2 {
        public static void Main() {

    string str="";
    Console.Write((string)str);
     Console.Read();
        }
    }
    } //编译成功可能是inParameter[i]的类型造成了你的问题! 因为inParameter[i]是个不确定的类型,比如我在上述的示例中如果把string str="";改成 int str=5;就会出现编译不成功,但如果把Console.Write((string)str);这一句改成Console.Write(Convert.ToString(str));就一切OK了!建议在你的程序中把p1.Value = (string)inParameter[i];这一句改成
    p1.Value = Convert.ToString(inParameter[i]);
      

  8.   

    =======================
    p1.Value = System.DBNull.Value 
    ======================================================================
    p1.Value = Convert.ToString(inParameter[i]);
    =====================================
    都没有成功
    当p1.Value=""时,存储过程失败,当p1.Value=" "时,成功。字段允许为空。
    例如执行下面的sql语句就会成功
    INSERT INTO SELL_DETAIL
            (
            SELL_NO,
            CORPORATION_NO,
            VALIDITY,
            PHAM_NAME,
            SPEC,
            UNIT,
            UNIT_PRICE,
            QUANTITY,
            SELL_DATE
            )
          VALUES
            (
            '00010000200002',
            '0001',
            '0',
            '',
            '',
            '',
            '',
            '',
            to_date('2005-1-1','yyyy-mm-dd hh24:mi:ss')
            );
      

  9.   

    还没有解决啊,这样吧,最简单的,在存储过程里添加:if @param1 = ""
    set @param1 = null
      

  10.   

    如果改存储过程,那工作量非常的大。
    应该有方法为p1.Value 赋值吧
      

  11.   

    Try:
    p1.Value = (string)inParameter[i]==""?DBNull.Value:(string)inParameter[i];
      

  12.   

    问题解决:
    OracleParameter p1 = new OracleParameter((string)inParameterName[i],OracleType.VarChar,100000);
    改为
    OracleParameter p1 = new OracleParameter((string)inParameterName[i],OracleType.LongVarChar,32000);