我是用三层架构方法写的。
我是这样写的:
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:断点测试,发现每个参数值都有取到,就是不知道为什么最后报错!!
谁能帮我解决!!
我是这样写的:
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:断点测试,发现每个参数值都有取到,就是不知道为什么最后报错!!
谁能帮我解决!!
解决方案 »
- wcf服务在winform中寄宿,同时模拟客户端调用超时!?
- 关于 c#错误处理,比较深奥的问题,请高手解答?
- 一个.xls(excel 2003)中有几个sheet,我要把sheet1中一些格子的内容复制到sheet2中去,什么办法最简单?
- 是否可以直接对DataTable对象进行选择、投影或者连接的操作并生成一个新的DataTable对象
- 急!!C#中如何运行其它应用程序比如记事本,像VB中的Shell函数。
- C#窗体假死的解决方案!急!
- 忍者游戏
- 字符串合并及过滤
- 今天做了自己的Cache类.需要代码的请进.
- 是不是在linux上能运行c#?我在一个网站上看到下面的东西,请大家说说。
- 同时使用两个不同版本的的dll
- 请教下WINFORM界面问题??
{
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; }
你的存储过程没有定义输出参数
但是运行没有“添加成功”
断点测试说
"@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
是存储过程里的参数,与DAL层里的参数不一致!
问题解决了,
太谢谢了!
感谢lsj_zrp!