使用存储过程在c#中登录

时间:2010-05-31 03:38:53

标签: c# .net stored-procedures ado.net

如果我运行带有两个参数值的存储过程(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中什么都没得到; 有什么我想念的吗?

2 个答案:

答案 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语句将会处理那已经。