以下是部分代码: 
private SqlCommand CreateProcCommand(string procName, SqlParameter[] prams)
        {
            Open();
            SqlCommand cmd = new SqlCommand(procName,myConnection);
            cmd.CommandType = CommandType.StoredProcedure;
            if(prams !=null)
            {
                foreach(SqlParameter parameter in prams)
                {
                    cmd.Parameters.Add(parameter);                }
            }
            cmd.Parameters.Add(              //这个是起什么作用的呢?
                new SqlParameter(RETURNVALUE,
                    SqlDbType.Int,4,ParameterDirection.ReturnValue,
                    false,0,0,string.Empty,DataRowVersion.Default,null));
            return cmd;
        }
  public int RunProc(string procName, SqlParameter[] prams)
        {
            SqlCommand cmd = CreateProcCommand(procName, prams);
            try
            {
                ///执行存储过程
                cmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                ///记录错误日志
                SystemError.SystemLog(ex.Message);
            }
            finally
            {
                ///关闭数据库的连接
                Close();
            }
            int nResult = (int)cmd.Parameters[RETURNVALUE].Value;
            ///返回存储过程的参数值
            return (int)cmd.Parameters[RETURNVALUE].Value;//当运行时,往数据库中添加记录,这段就出现错误“未将对象引用设置到对象的实例”。是什么原因呢?
        }这是个通用的数据库操作类。那个[RETURNVALUE]参数是否跟任何操作都没关系呢?还是我领会错误,可能在存储过程中有这个参数。(实例中的存储过程我打不开,所以猜的)。
谢谢各位参与,祝大家新年快乐!

解决方案 »

  1.   

    声明是
    private readonly string RETURNVALUE = "RETURNVALUE";
      

  2.   


    检查存储过程返回类型是否是int
     试试
    1.
    有没有这个:
    private readonly string RETURNVALUE = "RETURNVALUE"; 
    2.
    cmd.Parameters["ReturnValue"].Value
      

  3.   

    检查存储过程返回类型是否是int 
      试试 
    1. 
    有没有这个: 
    private   readonly   string   RETURNVALUE   =   "RETURNVALUE";   
    2. 
    cmd.Parameters["ReturnValue"].Value(以上的两个语句都有)catvv能否详细说下?
      

  4.   

    int   nResult = (int)cmd.Parameters[RETURNVALUE].Value; 
                          
    return (int)cmd.Parameters[RETURNVALUE].Value;这两句有点奇怪,既然在第一句就已经取得了输出参数的值,为什么还要用第二句呢?
      

  5.   

    这个也没有什么问题了,直接 return nResult就可以了.
    就像
    string[]  arr=s.split(',');
    之后明明可以写成
    string x=arr[0];
    非要再写一句
    string x=s.split(',');
    一样.楼主的问题,直接把存储过程一贴就知道哪有问题了.
      

  6.   

    string   x=s.split(',')[0]; 
    手误
      

  7.   

    int       nResult   =   (int)cmd.Parameters[RETURNVALUE].Value;   
                                                
    return   (int)cmd.Parameters[RETURNVALUE].Value; 这两句有点奇怪,既然在第一句就已经取得了输出参数的值,为什么还要用第二句呢?
    (这是我写错了 int       nResult   =   (int)cmd.Parameters[RETURNVALUE].Value;  我以前改的忘删除了。)
    我这个类是拷贝过来的,网上说是通用数据库类。存储过程看不到,所以我猜测RETURNVALUE参数,可能在存储过程中有声明。
      

  8.   

    从代码中可以看出RETURNVALUE在存储过程中是一个输出参数
      

  9.   

    以下是我找到的比较合适的答案:
    首先建立一个具有返回值的存储过程,作为示例,我就简单的建一个存储过程,如下:
    create proc test
    (
        @id        int
    )
    asdeclare @flag intselect * from person where id=@idif @@rowcount > 0
        set @flag=1
    else
        set @flag=0return @flag
    我们要在程序中获得这个返回值的方法如下:        [TestMethod]
            public void TestReturnValue()
            {
                Database db = DatabaseFactory.CreateDatabase();            DbCommand dbcomm = db.GetStoredProcCommand("test");            db.AddInParameter(dbcomm, "@id", DbType.Int32,1);
                //关键在这里,添加一个参数,类型为ReturnValue
                db.AddParameter(dbcomm, "@RETURN_VALUE", DbType.String, ParameterDirection.ReturnValue, "", DataRowVersion.Current, null);
                db.ExecuteNonQuery(dbcomm);            int testvalue = (int)dbcomm.Parameters["@RETURN_VALUE"].Value;            Assert.AreEqual(testvalue, 1);
            }希望大家发表些看法。