高流量SQL表间歇性空输出参数

时间:2011-08-12 15:47:36

标签: sql sql-server tsql nolock output-parameter

我得到的存储过程的输出参数的间歇空值。我想知道它是否与存储过程中的NOLOCK有关。它大部分时间都在工作,它间歇性地失败了。特别是在高负荷下。大多数情况下,它会返回您期望的“y”或“n”。

 SqlConnection con = getCon();
 SqlCommand cmd = new SqlCommand("loginRecord", con);
 cmd.CommandType = CommandType.StoredProcedure;
 cmd.Parameters.Add(new SqlParameter("@username", username));
 cmd.Parameters.Add(new System.Data.SqlClient.SqlParameter("@exists", System.Data.SqlDbType.VarChar, 3, System.Data.ParameterDirection.Output, false, ((System.Byte)(0)), ((System.Byte)(0)), "", System.Data.DataRowVersion.Current, null));

 try
 {
     con.Open();
     cmd.ExecuteNonQuery();
 }
 catch (Exception ex)
 {
     Util.sendErrorEmail(ex.ToString());
}
finally
{
   con.Close();
}

 //The following line is the one that throws an "Object reference not set to an instance of an bject." exception
 string userExists = cmd.Parameters["@exists"].Value.ToString();

这是存储过程:

ALTER PROCEDURE [dbo].[loginRecord]
(
    @username nvarchar(100),
    @exists char(1) OUTPUT
)

AS
IF EXISTS(select username from Users WITH (NOLOCK) where username = @username)
    BEGIN
        set @exists='y'
    END
ELSE
    BEGIN
        set @exists='n'

        --insert user account--
        insert into Users (username, datejoined)
        values (@username, getdate())
    END
insert into Logins (username, logged)
values (@username, getdate())

GO

2 个答案:

答案 0 :(得分:1)

我的猜测是在为@exists分配值之前发生异常。我改变了我的观点:

Catch(Exception ex) { Util.sendErrorEmail(ex.ToString()); return; }

答案 1 :(得分:0)

我认为它与存储过程实现无关。 如果您故意为存储过程中的@exists变量返回null,则为“cmd.Parameters [”@ exists“]。值”在C#中不为null。 相反,它将是'System.DBNull',它是一个有效的对象,你可以调用方法。

这不是问题的直接答案,但它会帮助您缩小范围。