Oracle的存储过程的定义CREATE OR REPLACE PROCEDURE PRC_USE_UPDATESTOCK(vpd_cd              IN VARCHAR2
                                               ,vitem_cd            IN VARCHAR2
                                               ,vslip_date          IN VARCHAR2
                                               ,vupdate_type        IN VARCHAR2
                                               ,vupdate_operator_cd IN VARCHAR2
                                               ,vreturn_cd          OUT NUMBER
                                               ,error_message       OUT VARCHAR2)
我在C#里的调用OracleConnection conn = OracleHelper.GetConnection();
OracleTransaction tx = null;
OracleCommand command = new OracleCommand(PROC_NAME,conn,tx);
command.CommandType=CommandType.StoredProcedure;
string errMessage = null;
conn.Open();
foreach (SlipTotalUpdate st in stockTotalUpdates)
{
command.Parameters.Add("vPD_CD",OracleType.VarChar).Value = st.PdCD;
command.Parameters.Add("vitem_cd",OracleType.VarChar).Value = st.ItemCD;
command.Parameters.Add("vslip_date",OracleType.VarChar).Value = st.SlipDate;
command.Parameters.Add("vupdate_type",OracleType.VarChar).Value = st.SlipKind;
command.Parameters.Add("vupdate_operator_cd",OracleType.VarChar).Value = st.EntryOperatorCD;
command.Parameters.Add("vreturn_cd",OracleType.Number);
command.Parameters.Add("error_message",OracleType.VarChar,200);
command.Parameters["vreturn_cd"].Direction = ParameterDirection.Output;
command.Parameters["error_message"].Direction = ParameterDirection.Output;
command.ExecuteNonQuery();
errMessage = command.Parameters["error_message"].Value.ToString();
}
现在的问题是.当我的输入类型的参数值为null时,.net构造的调用里就把这个值为null的参数给丢了.如:正常应该是PRC_USE_UPDATESTOCK(vpd_cd   ,vitem_cd  ,vslip_date  ,vupdate_type                                                ,vupdate_operator_cd    ,vreturn_cd  ,error_message )
可是假定vpd_cd=null时.
它会变成
PRC_USE_UPDATESTOCK
(vitem_cd  ,vslip_date  ,vupdate_type ,vupdate_operator_cd    ,vreturn_cd  ,error_message )就是少为我初始化了一个参数.请问有谁遇到过这种情况么??怎么解决呢??

解决方案 »

  1.   

    if(vpd_cd==null)
    {
        vpd_cd=DBNull.value;
    }
    C#里的null就是没有分配内存,什么也没有。而DBNull.value的意思你一定也猜到了^-^
      

  2.   

    判断一下,如果为空或null时,存入System.DBNull.value
      

  3.   

    if(st.PdCD!=null && st.PdCD.ToString()!="")
    {
             command.Parameters.Add("vPD_CD",OracleType.VarChar).Value = st.PdCD;
    }
    else
    {
             command.Parameters.Add("vPD_CD",OracleType.VarChar).Value = System.DBNull.value;
    }
      

  4.   

    为空的时候用"" 代替不是更好吗?数据库中填个null很不雅观吧。
    如:
    if(st.PdCD!=null && st.PdCD.ToString()!="")
    {
             command.Parameters.Add("vPD_CD",OracleType.VarChar).Value = st.PdCD;
    }
    else
    {
             command.Parameters.Add("vPD_CD",OracleType.VarChar).Value = "";
    }
      

  5.   

    charles_y(难得糊涂)  按你的说法也是要报错的.