2012-04-10 11 views
0

私は以下のように、ストアドプロシージャを呼び出すADO.Netコードがあります。ストアドプロシージャ内では、まずSELECTクエリを通して結果セットを取得し、その後に渡された@companyIdパラメータ値が存在しない場合はSELECTステートメントの後にRAISERRORを呼び出します。私は@companyIdの値で何度もこのコードのユニットテストを実行しましたので、RAISEERRORが呼び出されますが、ExecuteReaderへの呼び出しはエラーを表示しません。 この奇妙な逆直感的なことが起こっている理由は何ですか?非常にトリッキーなADO.Netの状況は、エラーをスローしませんが、する必要があります

sqlCmd = new SqlCommand("dbo.xyz_sp_Attributes_GetValues", new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["VHA_EDM_ConnectionString"].ConnectionString)); 
sqlCmd.CommandType = CommandType.StoredProcedure; 
sqlCmd.Parameters.AddWithValue("@attributeId", attributeId); 
sqlCmd.Parameters.AddWithValue("@companyId", companyId); 
sqlCmd.Parameters.AddWithValue("@attributeScope", "Company"); 
sqlCmd.Connection.Open(); 
SqlDataReader dr = sqlCmd.ExecuteReader(CommandBehavior.CloseConnection); 
while (dr.Read()) 
{ 
    attributeValue = dr["AttributeValue"].ToString(); 
} 

ストアドプロシージャのコードは、この場合

SELECT col1, col2, ... where CompanyId = @companyId and AttributeId = @attributeId 
if @companyId not exists (select companyId from Company where CompanyId = @companyId) 
begin 
set @errMessage = N'Invalid Company Error' 
RAISERROR (@errMessage, 16, 1) 
end 

答えて

1

以下のようなものであり、複数のレコードが返されがあります。最初のものは空白なので、何のエラーもありません。エラーを取得するには、NextRecordsetを呼び出す必要があります。

dr.NextResult(); // This will throw the error caused by RAISEERROR 

代わりにどのような場合には例外として処理する必要がありますRAISEERRORを呼び出すクライアントコードでエラーチェックを行うにははるかに簡単になります。

Catch a Sql Server RAISERROR at client side using SqlDataReader

+0

結果セットは1つだけ返されます。なぜ私は複数の結果セットを返すと言いますか? – Sunil

+0

あなたはそれをしていませんが、ADO.NETによってSPの結果が返される方法は2つのレコードセットになります。これに踏み込んだら、[SET NOCOUNT ON](http://stackoverflow.com/questions/1483732/set-nocount-on-usage) –

+0

Okを使用しないでください。私は今あなたを得る。あなたの非常に有益な返答をありがとう。 – Sunil

関連する問題