我是用三层架构方法写的。
我是这样写的:
SQLHelper.cs 页面内容
using System;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using System.ComponentModel;
using Common;namespace DAL
{
/// <summary>
/// SQLHelper类封装对SQL Server数据库的添加、删除、修改和选择等操作
/// </summary>
public class SQLHelper
{
/// 连接数据源
private SqlConnection myConnection = null;
private readonly string RETURNVALUE = "RETURNVALUE"; /// <summary>
/// 打开数据库连接.
/// </summary>
private void Open() 
{
// 打开数据库连接
if (myConnection == null) 
{
                myConnection = new SqlConnection(ConfigurationManager.AppSettings["SQLCONNECTIONSTRING"].ToString());

}
if(myConnection.State == ConnectionState.Closed)
{   
try
{
///打开数据库连接
myConnection.Open();
}
catch(Exception ex)
{
                    SystemError.CreateErrorLog(ex.Message);
}
finally
{
///关闭已经打开的数据库连接
}
}
} /// <summary>
/// 关闭数据库连接
/// </summary>
public void Close() 
{
///判断连接是否已经创建
if(myConnection != null)
{
///判断连接的状态是否打开
if(myConnection.State == ConnectionState.Open)
{
myConnection.Close();
}
}
} /// <summary>
/// 释放资源
/// </summary>
public void Dispose() 
{
// 确认连接是否已经关闭
if (myConnection != null) 
{
myConnection.Dispose();
myConnection = null;
}
}

/// <summary>
/// 执行存储过程
/// </summary>
/// <param name="procName">存储过程的名称</param>
/// <returns>返回存储过程返回值</returns>
public int RunProc(string procName) 
{
SqlCommand cmd = CreateProcCommand(procName, null);
try
{
///执行存储过程
cmd.ExecuteNonQuery();
}
catch(Exception ex)
{
///记录错误日志
SystemError.CreateErrorLog(ex.Message);
}
finally
{
///关闭数据库的连接
Close();
}

///返回存储过程的参数值
return (int)cmd.Parameters[RETURNVALUE].Value;
} /// <summary>
/// 执行存储过程
/// </summary>
/// <param name="procName">存储过程名称</param>
/// <param name="prams">存储过程所需参数</param>
/// <returns>返回存储过程返回值</returns>
public int RunProc(string procName, SqlParameter[] prams) 
{
SqlCommand cmd = CreateProcCommand(procName, prams);
try
{
///执行存储过程
cmd.ExecuteNonQuery();
}
catch(Exception ex)
{
///记录错误日志
SystemError.CreateErrorLog(ex.Message);
}
finally
{
///关闭数据库的连接
Close();
}

///返回存储过程的参数值
return (int)cmd.Parameters[RETURNVALUE].Value;  //这里报错
            }
....
DAL层的ASQL.cspublic class ASQL
    {
        public ASQL()
        { }
        /// <summary>
        /// 新增表单申请书
        /// </summary>
        /// <param name="A"></param>
        /// <returns></returns>
        public int Add_A(AModel Aorder)
        {
            
            SQLHelper sqlh = new SQLHelper();
            SqlParameter[] PalamList ={
                                         //sqlh.CreateInParam("@id",SqlDbType.Int,4,A.Id),
                                         //sqlh.CreateInParam("@xid", SqlDbType.Int,4,Aorder.Xid),
                                         sqlh.CreateInParam("@number",SqlDbType.VarChar,50,Aorder.Number),
                                         sqlh.CreateInParam("@A_td",SqlDbType.Char,10,Aorder.A_td),
                                         sqlh.CreateInParam("@A_date",SqlDbType.VarChar,50,Aorder.A_date),
                                         sqlh.CreateInParam("@A_th",SqlDbType.NVarChar,1000,Aorder.A_th),
                                         sqlh.CreateInParam("@A_why",SqlDbType.NVarChar,1000,Aorder.A_why),
                                         sqlh.CreateInParam("@A_sl",SqlDbType.Char,10,Aorder.A_sl),
                                         sqlh.CreateInParam("@A_mon",SqlDbType.Char,10,Aorder.A_mon),
                                         sqlh.CreateInParam("@A_qia",SqlDbType.Char,10,Aorder.A_qia),
                                         sqlh.CreateInParam("@A_tel",SqlDbType.VarChar,50,Aorder.A_tel),
                                         sqlh.CreateInParam("@A_cw",SqlDbType.Char,10,Aorder.A_cw),
                                         sqlh.CreateInParam("@A_usern",SqlDbType.Char,10,Aorder.A_usern)
                                        };
            try
            {
                return (sqlh.RunProc("A_insert", PalamList));
            }
            catch (Exception ex)
            {
                SystemError.CreateErrorLog(ex.Message);
                throw new Exception(ex.Message, ex); //这里报错
            }
        }
BLL层 /// <summary>
        /// 新增申请单
        /// </summary>
        /// <param name="A"></param>
        /// <returns></returns>
        public int Add_A(AModel Aorder)
        {
            ASQL Asql = new ASQL();
            return (Asql.Add_A(Aorder));
        }
页面层:
 protected void Button2_Click(object sender, EventArgs e)
        {
            if (Page.IsValid)
            {
                AModel Amodel = new AModel();
                Amodel.A_td = this.lab_A_td.Text;
                Amodel.A_date = this.YYSimpleCalendar1.Text;
                Amodel.Number = "A" + Common.StrHelper.GetRamCode();
                Amodel.A_usern = this.txtbox_usern.Text.Trim();
                Amodel.A_th = this.txtbox_th.Text.Trim();
                Amodel.A_why = this.txtbox_why.Text.Trim();
                Amodel.A_sl = this.txtbox_sl.Text.Trim();
                Amodel.A_mon = this.txtbox_fy.Text.Trim();
                Amodel.A_qia = this.txtbox_qia.Text.Trim();
                Amodel.A_cw = this.txtbox_cw.Text.Trim();
                Amodel.A_tel = this.txtbox_tel.Text.Trim();
                ABLL abll = new ABLL();
                if (abll.Add_A(Amodel) > 0)
                {
                    Response.Write("<script>alert('添加成功!');location.href='Get_User2.aspx';</script>");
                }
                 else
                {
                    Response.Write("<script>alert('添加失败!');location.href='Get_User2.aspx';</script>");
                }
                        }
        }
报错提示:
未将对象引用设置到对象的实例。 
行 129:
行 130: ///返回存储过程的参数值
行 131: return (int)cmd.Parameters[RETURNVALUE].Value;
行 132:           
行 133:
断点测试,发现每个参数值都有取到,就是不知道为什么最后报错!!
谁能帮我解决!!

解决方案 »

  1.   

    cmd.Parameters[RETURNVALUE]这个是null
      

  2.   

      public int RunProc(string procName, SqlParameter[] prams) 
            {
                int iReturn=0;
                SqlCommand cmd = CreateProcCommand(procName, prams);
                try
                {
                    ///执行存储过程
                   iReturn= cmd.ExecuteNonQuery();
                }
                catch(Exception ex)
                {
                    ///记录错误日志
                    SystemError.CreateErrorLog(ex.Message);
                    iReturn=-1;
                }
                finally
                {
                    ///关闭数据库的连接
                    Close();
                }
                
                ///返回存储过程的参数值
               // return (int)cmd.Parameters[RETURNVALUE].Value;  //这里报错
               return iReturn;        }
    你的存储过程没有定义输出参数
      

  3.   

    我按照你的写法修改了一下,不报那个错了。
    但是运行没有“添加成功”
    断点测试说
    "@A_date is not a parameter for procedure A_insert."
    难道是我的存储过程写错了?
    ---插入客户订单 
    CREATE PROCEDURE A_insert 

    @Number varchar(50),
    @Adate varchar(50),
    @Ath nvarchar(1000),
    @Awhy nvarchar(1000),
    @Asl char(10),
    @Amon char(10),
    @Aqia char(10),
    @Atel varchar(50),
    @Acw char(10),
    @Ausern char(10),
    @Atd char(10)

    AS
    INSERT INTO A 
    (number,A_date,A_th,A_why,A_sl,A_mon,A_qia,A_tel,A_cw,A_usern,A_td) 
    VALUES 
    (@Number,@Adate,@Ath,@Awhy,@Asl,@Amon,@Aqia,@Atel,@Acw,@Ausern,@Atd) 
    RETURN
    GO
      

  4.   

    我真笨,我知道原因了。
    是存储过程里的参数,与DAL层里的参数不一致!
    问题解决了,
    太谢谢了!
    感谢lsj_zrp!