私は、ストアドプロシージャの出力パラメータの断続的なNULL値を取得しています。私はそれがストアドプロシージャ内のNOLOCKと関係しているのだろうかと思います。それはほとんどの時間で動作し、断続的に失敗します。特に高負荷時。ほとんどの場合、期待する "y"または "n"が返されます。ここで高いトラフィックSQLテーブル断続的なNULL出力パラメータ
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
失敗した場合(nullを返す)、返されるべき内容は何ですか? YまたはNの状況、またはその両方に常に失敗しますか? –
ストアドプロシージャを見ると、if/elseがあり、値が何であっても設定されなければならないようです。人がまだ存在しない場合は、Usersテーブルに挿入することになっています。 – Robert
はい、問題は1つまたは別の状況でのみ発生するかどうかを判断しようとしています。どちらか一方の状況でしか起こらない場合は、解決するのがより簡単な問題です。 –