这里是我写的一个执行存储过程的方法的一部分
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]改为" "时,才能执行成功。原因是什么呢。
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]改为" "时,才能执行成功。原因是什么呢。
p1.Value = (string)inParameter[i];inParameter[i]是什么类型?? 你给它赋"",就确定它是string了?
建议你在需要时为""时,传递的inParameter[i]=null
===========================
我将p1.Value = (string)inParameter[i];改为p1.Value = (string)inParameter[i]==""?null:(string)inParameter[i];
仍然出错
orcal没有用过,不太清楚,错了只当瞎说
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]);
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')
);
set @param1 = null
应该有方法为p1.Value 赋值吧
p1.Value = (string)inParameter[i]==""?DBNull.Value:(string)inParameter[i];
OracleParameter p1 = new OracleParameter((string)inParameterName[i],OracleType.VarChar,100000);
改为
OracleParameter p1 = new OracleParameter((string)inParameterName[i],OracleType.LongVarChar,32000);