2011-08-12 9 views
2

私は、ストアドプロシージャの出力パラメータの断続的な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 
+0

失敗した場合(nullを返す)、返されるべき内容は何ですか? YまたはNの状況、またはその両方に常に失敗しますか? –

+0

ストアドプロシージャを見ると、if/elseがあり、値が何であっても設定されなければならないようです。人がまだ存在しない場合は、Usersテーブルに挿入することになっています。 – Robert

+0

はい、問題は1つまたは別の状況でのみ発生するかどうかを判断しようとしています。どちらか一方の状況でしか起こらない場合は、解決するのがより簡単な問題です。 –

答えて

1

私の推測では、@existsに値が割り当てられる前に例外が発生していることです。私はあることを私のキャッチを変更したい:

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

+0

例外は捕捉されず、そこで指定した行までは失敗しません。ELMAHのログがあり、try/catch/finallyの後の行が失敗した行です。 – Robert

+0

ELMAHは、デフォルトの動作を変更しないかぎり、未処理の例外を記録します。 Catchループのため、発生した例外は処理され、ログに記録されません。あなたはまたあなたが得ている何の例外を投稿することができますか? –

+0

Jeff私はあなたが言っていることを見ています。保存されたprocは例外をスローする必要があります。上記の「Martin Smith」のコメントを見ると、ストアドプロシージャはスレッドセーフではないと言われています。私はそこに重複したユーザー名を挿入しようとしていることを賭けて喜んでいる。私は彼にそれを解決する方法を尋ねるつもりです。 – Robert

0

私はそれがストアドプロシージャの実装とは関係ありませんと思います。 ストアドプロシージャから@exists変数に故意にnullを返すと、 "cmd.Parameters [" @ exists "]。Value"がC#ではnullになりません。 代わりに有効なオブジェクトである 'System.DBNull'になります。メソッドを呼び出すことができます。

これは質問への直接的な回答ではありませんが、それは絞り込むのに役立ちます。

関連する問題