MSSQL存储过程代码
-----------------------------set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
goALTER proc [dbo].[InsertUser]
@UserName nvarchar(200),
@Password nvarchar(200),
@Act int output
as
begin
if exists(select * from administrator where username=@UserName)
begin
set @Act=1
insert into administrator (UserName,PassWord) values(@UserName,@Password)
end
else
set @Act=0
return @Act
end --------------------------
.NET代码
---------------------------------- SqlConnection conn = new SqlConnection(MyConfig.ConnString());
conn.Open();
string Sql = "exec insertuser '" + UserName + "','" + PassWord1 + "',0";
SqlCommand cmd = new SqlCommand(Sql, conn);
string Act = cmd.ExecuteScalar().ToString();
if (Act == "1")
{
MyStr.JsMsg("用户增加成功!");
}
else
{
MyStr.JsMsg("用户增加失败,用户名重复!");
}
conn.Close();
----------------
出现的错误信息:
“/”应用程序中的服务器错误。
未将对象引用设置到对象的实例。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。异常详细信息: System.NullReferenceException: 未将对象引用设置到对象的实例。源错误:行 51: string Sql = "exec insertuser '" + UserName + "','" + PassWord1 + "',0";
行 52: SqlCommand cmd = new SqlCommand(Sql, conn);
行 53: string Act = cmd.ExecuteScalar().ToString();
行 54: if (Act == "1")
行 55: {
源文件: e:\WebSite\hk-company.cn\WebAdmin\AdminUserAdd.aspx.cs 行: 53堆栈跟踪:[NullReferenceException: 未将对象引用设置到对象的实例。]
WebAdmin_AdminUserAdd.Page_Load(Object sender, EventArgs e) in e:\WebSite\hk-company.cn\WebAdmin\AdminUserAdd.aspx.cs:53
System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +15
System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +34
System.Web.UI.Control.OnLoad(EventArgs e) +99
System.Web.UI.Control.LoadRecursive() +47
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1061
版本信息: Microsoft .NET Framework 版本:2.0.50727.42; ASP.NET 版本:2.0.50727.42 --------------
请问兄弟们这个是咋会事?
-----------------------------set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
goALTER proc [dbo].[InsertUser]
@UserName nvarchar(200),
@Password nvarchar(200),
@Act int output
as
begin
if exists(select * from administrator where username=@UserName)
begin
set @Act=1
insert into administrator (UserName,PassWord) values(@UserName,@Password)
end
else
set @Act=0
return @Act
end --------------------------
.NET代码
---------------------------------- SqlConnection conn = new SqlConnection(MyConfig.ConnString());
conn.Open();
string Sql = "exec insertuser '" + UserName + "','" + PassWord1 + "',0";
SqlCommand cmd = new SqlCommand(Sql, conn);
string Act = cmd.ExecuteScalar().ToString();
if (Act == "1")
{
MyStr.JsMsg("用户增加成功!");
}
else
{
MyStr.JsMsg("用户增加失败,用户名重复!");
}
conn.Close();
----------------
出现的错误信息:
“/”应用程序中的服务器错误。
未将对象引用设置到对象的实例。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。异常详细信息: System.NullReferenceException: 未将对象引用设置到对象的实例。源错误:行 51: string Sql = "exec insertuser '" + UserName + "','" + PassWord1 + "',0";
行 52: SqlCommand cmd = new SqlCommand(Sql, conn);
行 53: string Act = cmd.ExecuteScalar().ToString();
行 54: if (Act == "1")
行 55: {
源文件: e:\WebSite\hk-company.cn\WebAdmin\AdminUserAdd.aspx.cs 行: 53堆栈跟踪:[NullReferenceException: 未将对象引用设置到对象的实例。]
WebAdmin_AdminUserAdd.Page_Load(Object sender, EventArgs e) in e:\WebSite\hk-company.cn\WebAdmin\AdminUserAdd.aspx.cs:53
System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +15
System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +34
System.Web.UI.Control.OnLoad(EventArgs e) +99
System.Web.UI.Control.LoadRecursive() +47
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1061
版本信息: Microsoft .NET Framework 版本:2.0.50727.42; ASP.NET 版本:2.0.50727.42 --------------
请问兄弟们这个是咋会事?
要对应的是select 返回的数据. 你的存储过程中没有这这句.如果要这么用.存储过程中加一句
select @Act
ExecuteScalar 是查询操作你sql语句是insert操作 所要用ExecuteNonQuery
防注入程序又不在这里 string UserName= MyStr.DelSql(Request.Form["WebUserName"]);
string PassWord1=MyStr.DelSql(Request.Form["WebPassWord1"]);
string PassWord2=MyStr.DelSql(Request.Form["WebPassWord2"]);
换成
Select @Act
ExecuteScalar 是查询操作
另外,LZ对输出参数和返回值的获取方法可能还不太了解
//输出参数
SqlParameter para = new SqlParameter("@Act", SqlDbType.Int);
para.Direction = ParameterDirection.Output;
comm.Parameters.Add(para);
//返回值
SqlParameter para1 = new SqlParameter();
para1.Direction = ParameterDirection.ReturnValue;
comm.Parameters.Add(para1);int i = comm.ExecuteNonQuery();//i为受影响的行数string Act = para.Value;//得到的输出参数值
string Act1 = para1.Value;//得到的返回值