关于System.NullReferenceException 未将对象引用设置到对象的实例 报错 疑问!

kehua668 2009-12-02 03:36:34
我是用三层架构方法写的。
我是这样写的:
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.cs

public 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:


断点测试,发现每个参数值都有取到,就是不知道为什么最后报错!!
谁能帮我解决!!



...全文
242 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
kehua668 2009-12-02
  • 打赏
  • 举报
回复
我真笨,我知道原因了。
是存储过程里的参数,与DAL层里的参数不一致!
问题解决了,
太谢谢了!
感谢lsj_zrp!
kehua668 2009-12-02
  • 打赏
  • 举报
回复
我按照你的写法修改了一下,不报那个错了。
但是运行没有“添加成功”
断点测试说
"@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

lsj_zrp 2009-12-02
  • 打赏
  • 举报
回复
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;

}
你的存储过程没有定义输出参数

kehua668 2009-12-02
  • 打赏
  • 举报
回复
诶呀!什么意思呀!能否讲的通俗点!
小妹这方面基础比较薄弱!
zhujiazhi 2009-12-02
  • 打赏
  • 举报
回复
cmd.Parameters[RETURNVALUE]这个是null
ViewStates 2009-12-02
  • 打赏
  • 举报
回复
你这个地方全部都是IN参数,怎么会有返回值呢?

111,120

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧