我正在使用输出参数从我的数据库中获取值。
这是我的存储过程:
ALTER PROCEDURE [dbo].[sp_GetCustomerMainData]
-- Add the parameters for the stored procedure here
@Reference nvarchar(100),
@SubscriptionPIN nvarchar(100) OUTPUT,
@SignupDate nvarchar(100) OUTPUT,
@ProductCount int OUTPUT
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
SET @SubscriptionPIN = 'N/A'
SET @SignupDate = 'N/A'
SET @ProductCount = 0
-- Insert statements for procedure here
IF EXISTS(SELECT [SubscriptionPIN] FROM [Norton].[dbo].[Customers] WHERE [Reference] = @Reference)
BEGIN
SELECT TOP 1 @SubscriptionPIN = [SubscriptionPIN], @SignupDate = SignUpDate FROM [Norton].[dbo].[ProductList] WHERE [Reference] = @Reference
SET @ProductCount = (SELECT COUNT(*) FROM [Norton].[dbo].[ProductList] WHERE [Reference] = @Reference)
END
RETURN (@SubscriptionPIN)
RETURN (@SignupDate)
RETURN (@ProductCount)
END
我不确定最后的回报:
RETURN (@SubscriptionPIN)
RETURN (@SignupDate)
RETURN (@ProductCount)
另一方面,这是c#代码:
using (SqlConnection con = new SqlConnection(connectionInfo))
{
using (SqlCommand cmd = new SqlCommand("sp_GetCustomerMainData", con) { CommandType = CommandType.StoredProcedure })
{
cmd.Parameters.Add("@Reference", SqlDbType.NVarChar).Value = CustomerReferenceID;
SqlParameter SubscriptionPIN = new SqlParameter("@TheCustomerID", SqlDbType.NVarChar) { Direction = ParameterDirection.Output };
cmd.Parameters.Add(SubscriptionPIN);
SqlParameter SignupDate = new SqlParameter("@SignupDate", SqlDbType.NVarChar) { Direction = ParameterDirection.Output };
cmd.Parameters.Add(SignupDate);
SqlParameter ProductCount = new SqlParameter("@ProductCount", SqlDbType.Int) { Direction = ParameterDirection.Output };
cmd.Parameters.Add(ProductCount);
con.Open();
try
{
cmd.ExecuteNonQuery();
if (cmd.Parameters["@TheCustomerID"].Value.ToString() != "N/A")
{
aStatus.SubscriptionPIN = cmd.Parameters["@TheCustomerID"].Value.ToString();
aStatus.SignupDate = cmd.Parameters["@SignupDate"].Value.ToString();
aStatus.ProductCount = int.Parse(cmd.Parameters["@ProductCount"].Value.ToString());
aStatus.Result = "0: Reference ID Found";
}
else
{
aStatus.Result = "1: Reference ID does not exists";
return aStatus;
}
}
catch (SqlException sqlExc)
{
foreach (SqlError error in sqlExc.Errors)
{
aStatus.Result = string.Format("{0}: {1}", error.Number, error.Message);
return aStatus;
}
}
}
}
当我运行此代码时,我收到错误:
System.InvalidOperationException:String [1]:Size属性的无效大小为0 在System.Data.SqlClient.SqlParameter.Validate(Int32 index,Boolean isCommandProc)
在System.Data.SqlClient.SqlCommand.SetUpRPCParameters(_SqlRPC rpc,Int32 startCount,Boolean inSchema,SqlParameterCollection) 参数)
在System.Data.SqlClient.SqlCommand.BuildRPC(布尔inSchema,SqlParameterCollection参数,_SqlRPC& rpc)
在System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior,RunBehavior runBehavior,Boolean returnStream,Boolean 异步)
在System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,RunBehavior runBehavior,Boolean returnStream,String 方法,DbAsyncResult结果)
在System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result,String methodName,Boolean sendToPipe)
在System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
我不知道从存储过程发送许多输出参数的正确方法是什么,有人可以帮忙吗?
答案 0 :(得分:3)
您需要指定nvarchar
参数的最大长度:
SqlParameter SubscriptionPIN = new SqlParameter("@TheCustomerID", SqlDbType.NVarChar, 100) { Direction = ParameterDirection.Output };
cmd.Parameters.Add(SubscriptionPIN);
SqlParameter SignupDate = new SqlParameter("@SignupDate", SqlDbType.NVarChar, 100) { Direction = ParameterDirection.Output };
cmd.Parameters.Add(SignupDate);
从存储过程中删除return
语句。您无需为返回的输出参数执行任何操作。 (另外,您只能使用一个return
语句,并且只能返回整数值。您可以使用方向为ReturnValue
的参数来获取返回值。)
答案 1 :(得分:2)
在第一次RETURN“无条件退出查询或过程”后,程序执行结束。
考虑将两个值作为一个记录集返回
SELECT @SubscriptionPIN AS SubsPIN , @SignupDate AS SignUpDate, @ProductCount AS ProdCount
在程序结束时。
答案 2 :(得分:1)
>尝试将其工作正常用于多输出参数:
using (SqlConnection sqlConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["conStringEndicia"].ConnectionString)){
using (var sqlCmd = new SqlCommand("endicia.credentialLookup", sqlConnection))
{
sqlCmd.CommandType = System.Data.CommandType.StoredProcedure;
sqlCmd.Parameters.AddWithValue("@accountNumber", accountNumber);
SqlParameter outLogin = new SqlParameter("@login", SqlDbType.NVarChar, 100) { Direction = ParameterDirection.Output };
sqlCmd.Parameters.Add(outLogin);
SqlParameter outPassword = new SqlParameter("@password", SqlDbType.NVarChar, 100) { Direction = ParameterDirection.Output };
sqlCmd.Parameters.Add(outPassword);
sqlConnection.Open();
sqlCmd.ExecuteNonQuery();
string login, password;
login = outLogin.Value.ToString();
password = outPassword.Value.ToString();
}
}
答案 3 :(得分:0)
这是我尝试过的,它运作良好
**Stored Procedures**
STORED PROCEDURE 1
create procedure spLoginCount
@userid nvarchar(50),
@password nvarchar(50),
@count int out
as
Begin
select @count=count(userid) from users where userid=@userid and pswd=@password
End
**STORED PROCEDURE 2**
create procedure spLoginData
@userid nvarchar(50),
@usertype nvarchar(20) out,
@lastlogin nvarchar(100) out
as
Begin
select @usertype=usertype,@lastlogin=lastlogin from users where userid=@userid
End
**ASP.NET code which will get values of two output Parameters**....
protected void btnLogin_Click(object sender, EventArgs e)
{
string uid="", psw="";
uid = txtUserName.Text;
psw = txtPassword.Text;
string cs = ConfigurationManager.ConnectionStrings["DBCS"].ConnectionString;
using (SqlConnection scon = new SqlConnection(cs))
{
SqlCommand scmd = new SqlCommand("spLoginCount", scon);
scmd.CommandType = System.Data.CommandType.StoredProcedure;
scmd.Parameters.AddWithValue("@userid",uid);
scmd.Parameters.AddWithValue("@password", psw);
SqlParameter outparameter = new SqlParameter();
outparameter.ParameterName = "@count";
outparameter.SqlDbType = System.Data.SqlDbType.Int;
outparameter.Direction = System.Data.ParameterDirection.Output;
scmd.Parameters.Add(outparameter);
scon.Open();
scmd.ExecuteScalar();
string count = outparameter.Value.ToString();
if (count == "1")
{
SqlCommand scmd1= new SqlCommand("spLoginData", scon);
scmd1.CommandType = System.Data.CommandType.StoredProcedure;
scmd1.Parameters.AddWithValue("@userid", uid);
/*SqlParameter outUserType = new SqlParameter();
outUserType.ParameterName = "@usertype";
outUserType.SqlDbType = System.Data.SqlDbType.NText;
outUserType.Direction = System.Data.ParameterDirection.Output;
scmd1.Parameters.Add(outUserType);
*/
SqlParameter outUserType = new SqlParameter("@usertype", SqlDbType.NVarChar, 100) { Direction = ParameterDirection.Output };
scmd1.Parameters.Add(outUserType);
SqlParameter outLastLogin = new SqlParameter("@lastlogin", SqlDbType.NVarChar, 100) { Direction = ParameterDirection.Output };
scmd1.Parameters.Add(outLastLogin);
scmd1.ExecuteNonQuery();
scon.Close();
string usertype,lastlogin;
usertype = outUserType.Value.ToString();
lastlogin = outLastLogin.Value.ToString();
}
}
}
答案 4 :(得分:0)
SqlParameter SubscriptionPIN = new SqlParameter(" @TheCustomerID",SqlDbType.NVarChar,100){Direction = ParameterDirection.Output}; cmd.Parameters.Add(SubscriptionPIN); SqlParameter SignupDate = new SqlParameter(" @ SignupDate", DbType.String,100 ){Direction = ParameterDirection.Output}; cmd.Parameters.Add(SignupDate);
必须提供类型和尺寸