如果我运行带有两个参数值的存储过程(admin,admin) (参数:admin,admin) 我收到以下消息:
Session_UID User_Group_Name Sys_User_Name ------------------------------------ -------------------------------------------------- - NULLAdministratorsNTMSAdmin No rows affected. (1 row(s) returned) @RETURN_VALUE = 0 Finished running [dbo].[p_SYS_Login].
要在c#中获取相同的消息,我使用了以下代码:
string strConnection = Settings.Default.ConnectionString;
using (SqlConnection conn = new SqlConnection(strConnection))
{
using (SqlCommand cmd = new SqlCommand())
{
SqlDataReader rdr = null;
cmd.Connection = conn;
cmd.CommandText = "p_SYS_Login";
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter paramReturnValue = new SqlParameter();
paramReturnValue.ParameterName = "@RETURN_VALUE";
paramReturnValue.SqlDbType = SqlDbType.Int;
paramReturnValue.SourceColumn = null;
paramReturnValue.Direction = ParameterDirection.ReturnValue;
cmd.Parameters.Add(paramReturnValue);
cmd.Parameters.Add(paramGroupName);
cmd.Parameters.Add(paramUserName);
cmd.Parameters.AddWithValue("@Sys_Login", "admin");
cmd.Parameters.AddWithValue("@Sys_Password", "admin");
try
{
conn.Open();
rdr = cmd.ExecuteReader();
string test = (string)cmd.Parameters["@RETURN_VALUE"].Value;
while (rdr.Read())
{
Console.WriteLine("test : " + rdr[0]);
}
}
catch (Exception ex)
{
string message = ex.Message;
string caption = "MAVIS Exception";
MessageBoxButtons buttons = MessageBoxButtons.OK;
MessageBox.Show(
message,
caption,
buttons,
MessageBoxIcon.Warning,
MessageBoxDefaultButton.Button1);
}
finally
{
cmd.Dispose();
conn.Close();
}
}
}
但我在SqlDataReader rdr中什么都没得到; 有什么我想念的吗?
答案 0 :(得分:0)
第0列Session_UID
的值为空,因为您已经显示,所以我认为这可能是您在此处没有得到任何内容的原因:
Console.WriteLine("test : " + rdr[0]);
但是作为一个旁边你可能会得到Null引用异常。
为什么不试试这个:
Console.WriteLine("Return Value: " + test);
while(rdr.Read()){
Console.WriteLine("test: " + rdr[0]+" " + rdr[1]+ " " + rdr[1]);
}
答案 1 :(得分:0)
如果您想要返回一个返回值但没有结果行,则不应使用.ExecuteReader()
而是使用.ExecuteNonQuery()
调用:
try
{
conn.Open();
object result = cmd.ExecuteNonQuery();
string test = (string)cmd.Parameters["@RETURN_VALUE"].Value;
conn.Close();
}
catch (Exception ex)
{
....
}
此外,由于您在SqlCommand
区块中有using....
,因此在您尝试的finally
区块中确实没有任何意义 - using
语句将会处理那已经。