我已经和它搏斗了好几天,并且通过StackOverflow和其他各种网站进行了大量挖掘。我实际上是在画一个空白。我试图从我的存储过程中获得一个结果。
这是我的存储过程:
ALTER PROC [dbo].[myHelper_Simulate]
@CCOID nvarchar(100), @RVal nvarchar OUTPUT
AS
DECLARE @UserID int
DECLARE @GUID uniqueidentifier
SELECT @UserID = UserID
FROM [User]
WHERE CCOID = @CCOID AND deleted = 0
SELECT @GUID = newid()
IF @UserID > 0
BEGIN
INSERT [Audit] ([GUID], Created, UserID, ActionType, Action, Level)
VALUES (@GUID, getdate(), @UserID, 'Authentication', 'Test Authentication', 'Success')
SELECT @RVal = 'http://www.ttfakedomain.com/Logon.aspx?id=' + CAST(@GUID AS nvarchar(50))
RETURN
END
ELSE
SELECT @RVal = 'Couldn''t find a user record for the CCOID ' + @CCOID
RETURN
GO
最初编写程序是为了打印出结果。我添加了@RVal
和RETURN
,试图将值传递回我的C#代码。
这是我的C#例程(svrConn
已经连接到数据库):
private void btnSimulate_MouseClick(object sender, MouseEventArgs e)
{
SqlCommand cmd = new SqlCommand();
cmd.Connection = svrConn;
object result = new object();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "[" + tDatabase + "].[dbo].myHelper_Simulate";
cmd.Parameters.Add(new SqlParameter("@CCOID", txtDUserCCOID.Text.Trim()));
cmd.Parameters.Add(new SqlParameter("@RVal", ""));
cmd.Parameters.Add(new SqlParameter("RETURN_VALUE", SqlDbType.NVarChar)).Direction = ParameterDirection.ReturnValue;
try
{
result = cmd.ExecuteScalar();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
if (result != null)
{
tString = result.ToString();
MessageBox.Show(tString);
}
}
问题是result
将返回null。我不确定这是由于存储过程还是我如何设置参数并调用ExecuteScalar
。
答案 0 :(得分:3)
SP return values是整数,用于错误代码。正确的方法是使用OUTPUT
参数。您正在SP中正确分配它,您不需要返回语句。
在C#代码中检查执行后的值。使用ExecuteNonQuery
,因为SP没有结果集。
var rval = new SqlParameter("@RVal", SqlDbType.NVarChar);
rval.Direction = ParameterDirection.Output;
cmd.Parameters.Add(rval);
cmd.ExecuteNonQuery();
result = rval.Value;
答案 1 :(得分:1)
不需要返回参数或输出参数。 ExecuteScalar返回结果集第一行的第一列。所以只需选择要返回的文本,就像这样......
IF @UserID > 0
BEGIN
INSERT [Audit] ([GUID], Created, UserID, ActionType, Action, Level)
VALUES (@GUID, getdate(), @UserID, 'Authentication', 'Test Authentication', 'Success')
SELECT 'http://www.ttfakedomain.com/Logon.aspx?id=' + CAST(@GUID AS nvarchar(50))
END
ELSE
SELECT 'Couldn''t find a user record for the CCOID ' + @CCOID
RETURN
答案 2 :(得分:0)
试
private void btnSimulate_MouseClick(object sender, EventArgs e) {
using (SqlConnection con = svrConn) {
using (SqlCommand cmd = new SqlCommand("myHelper_Simulate", con)) {
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@CCOID", SqlDbType.VarChar).Value = txtDUserCCOID.Text.Trim();
var output = new SqlParameter("@RVal", SqlDbType.VarChar);
output.Direction = ParameterDirection.Output;
cmd.Parameters.Add(output);
con.Open();
cmd.ExecuteNonQuery();
}
}
}