关于调用SQL存储过程 25
这是我存储过程的代码:ALTERPROCEDUREPro_Login@LogErrornvarchar(15)output,@LoginIdnvarchar(15),@L...
这是我存储过程的代码:
ALTER PROCEDURE Pro_Login
@LogError nvarchar(15) output,
@LoginId nvarchar(15),
@LoginPwd nvarchar(15)
AS
set @LogError = 'login success'
………………(省略部分无意义的代码)
其中@LogError这个参数是个输出参数,我想通过调用这个存储过程来得到这个参数的值,于是乎我写了一下的类:
public string ExecuteScalar()
{
using (SqlConnection con = new SqlConnection(ConnectionString))
{
string r = null;
try
{
SqlCommand cmd = con.CreateCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "Pro_Login";
SqlParameter par = cmd.Parameters.Add("@LoginId", SqlDbType.NVarChar);
par.Direction = ParameterDirection.Input;
par.Value = "hhh";
SqlParameter par1 = cmd.Parameters.Add("@LoginPwd", SqlDbType.NVarChar);
par1.Direction = ParameterDirection.Input;
par1.Value = "22222";
SqlParameter par2 = cmd.Parameters.Add("@LogError", SqlDbType.NVarChar);
par2.Direction = ParameterDirection.Output;
con.Open();
cmd.ExecuteNonQuery();
r = Convert.ToString(par2.Value);
}
catch (System.Data.SqlClient.SqlException ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message);
}
finally
{
con.Close();
}
return r;
}
}
但是当项目运行到这个类的时候总是中断了,并且指着cmd.ExecuteNonQuery()这一段提示“String[2]: Size 属性具有无效大小值 0。”
这是什么意思,我这个类的代码写的是否正确?麻烦各位给小弟指点迷津,十分十分感谢~~!!
顺便一问,存储过程里面是否得在最后写上return @LogError?(我没写) 展开
ALTER PROCEDURE Pro_Login
@LogError nvarchar(15) output,
@LoginId nvarchar(15),
@LoginPwd nvarchar(15)
AS
set @LogError = 'login success'
………………(省略部分无意义的代码)
其中@LogError这个参数是个输出参数,我想通过调用这个存储过程来得到这个参数的值,于是乎我写了一下的类:
public string ExecuteScalar()
{
using (SqlConnection con = new SqlConnection(ConnectionString))
{
string r = null;
try
{
SqlCommand cmd = con.CreateCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "Pro_Login";
SqlParameter par = cmd.Parameters.Add("@LoginId", SqlDbType.NVarChar);
par.Direction = ParameterDirection.Input;
par.Value = "hhh";
SqlParameter par1 = cmd.Parameters.Add("@LoginPwd", SqlDbType.NVarChar);
par1.Direction = ParameterDirection.Input;
par1.Value = "22222";
SqlParameter par2 = cmd.Parameters.Add("@LogError", SqlDbType.NVarChar);
par2.Direction = ParameterDirection.Output;
con.Open();
cmd.ExecuteNonQuery();
r = Convert.ToString(par2.Value);
}
catch (System.Data.SqlClient.SqlException ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message);
}
finally
{
con.Close();
}
return r;
}
}
但是当项目运行到这个类的时候总是中断了,并且指着cmd.ExecuteNonQuery()这一段提示“String[2]: Size 属性具有无效大小值 0。”
这是什么意思,我这个类的代码写的是否正确?麻烦各位给小弟指点迷津,十分十分感谢~~!!
顺便一问,存储过程里面是否得在最后写上return @LogError?(我没写) 展开
3个回答
展开全部
存储过程有返回值么!
返回值也不是这的写了呀!
你的存储过程在SQL执行的时候有问题么!
没问题的话!这个提示就是你传的值有问题!
我这有个我写的执行调用的代码!
给你做个参考!
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
namespace ss
{
class u1
{
SqlConnection con;
SqlCommand cmd;
u1()
{
string conn = "Data Source=.;Initial Catalog=host;User ID=sa;Password=sa";
con = new SqlConnection(conn);
con.Open();
}
public void pr_cyxf(string us, string cy, int num)
{
cmd = new SqlCommand("pr_cyxf", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@us_idd",SqlDbType.VarChar,5,"us_idd");
cmd.Parameters["@us_idd"].Value = us;
cmd.Parameters.Add("@cy_idd",SqlDbType.VarChar,5,"cy_idd");
cmd.Parameters["@cy_idd"].Value = cy;
cmd.Parameters.Add("@cy_numm",SqlDbType.Int,4,"cy_numm");
cmd.Parameters["@cy_numm"].Value=num;
cmd.ExecuteNonQuery();
}
static void Main(string[] args)
{
u1 a = new u1();
a.cy_info("c205","鲍鱼",800);
a.con.Close();
}
}
还有存储过程的代码!
create proc pr_cyxf
@us_idd varchar(5),
@cy_idd varchar(5),
@cy_numm int
as
declare @us_id varchar(5),@cy_id varchar(5),@cy_num int
set @us_id=@us_idd
set @cy_id=@cy_idd
set @cy_num=@cy_numm
insert into cyxf values(@us_id,@cy_id,@cy_num)
go
返回值也不是这的写了呀!
你的存储过程在SQL执行的时候有问题么!
没问题的话!这个提示就是你传的值有问题!
我这有个我写的执行调用的代码!
给你做个参考!
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
namespace ss
{
class u1
{
SqlConnection con;
SqlCommand cmd;
u1()
{
string conn = "Data Source=.;Initial Catalog=host;User ID=sa;Password=sa";
con = new SqlConnection(conn);
con.Open();
}
public void pr_cyxf(string us, string cy, int num)
{
cmd = new SqlCommand("pr_cyxf", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@us_idd",SqlDbType.VarChar,5,"us_idd");
cmd.Parameters["@us_idd"].Value = us;
cmd.Parameters.Add("@cy_idd",SqlDbType.VarChar,5,"cy_idd");
cmd.Parameters["@cy_idd"].Value = cy;
cmd.Parameters.Add("@cy_numm",SqlDbType.Int,4,"cy_numm");
cmd.Parameters["@cy_numm"].Value=num;
cmd.ExecuteNonQuery();
}
static void Main(string[] args)
{
u1 a = new u1();
a.cy_info("c205","鲍鱼",800);
a.con.Close();
}
}
还有存储过程的代码!
create proc pr_cyxf
@us_idd varchar(5),
@cy_idd varchar(5),
@cy_numm int
as
declare @us_id varchar(5),@cy_id varchar(5),@cy_num int
set @us_id=@us_idd
set @cy_id=@cy_idd
set @cy_num=@cy_numm
insert into cyxf values(@us_id,@cy_id,@cy_num)
go
展开全部
SqlParameter par = cmd.Parameters.Add("@LoginId", SqlDbType.NVarChar, 15);
全部都加上大小限制,与你的参数大小对应.不加的话默认是1的字符吧?
存储过程没必要非要在最后return,过程嘛,可以没有返回值.
全部都加上大小限制,与你的参数大小对应.不加的话默认是1的字符吧?
存储过程没必要非要在最后return,过程嘛,可以没有返回值.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
给cmd添加参数时,不应该这样写,换种写法
SqlParameter[] pars =
{
new SqlParameter("@LoginId",SqlDbType.NVarChar,15),
new SqlParameter("@LoginPwd",SqlDbType.NVarChar,15),
new SqlParameter("@LogError",SqlDbType.NVarChar,15)
}
pars[0].value="hhh";
pars[1].value="222";
pars[2].Direction = ParameterDirection.Output;
cmd.Parameters.AddRange(pars);
con.Open();
cmd.ExecuteNonQuery();
SqlParameter[] pars =
{
new SqlParameter("@LoginId",SqlDbType.NVarChar,15),
new SqlParameter("@LoginPwd",SqlDbType.NVarChar,15),
new SqlParameter("@LogError",SqlDbType.NVarChar,15)
}
pars[0].value="hhh";
pars[1].value="222";
pars[2].Direction = ParameterDirection.Output;
cmd.Parameters.AddRange(pars);
con.Open();
cmd.ExecuteNonQuery();
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询