0

以下のように、ストアド プロシージャを呼び出す ADO.Net コードがあります。ストアド プロシージャ内では、最初に SELECT クエリを使用して結果セットを取得し、次にRAISERROR、渡された @companyId パラメーター値が存在しない場合は SELECT ステートメントを呼び出した後に取得します。@companyId の値を使用してこのコードで単体テストを何度も実行したため、呼び出されましたが、エラーをスローするRAISEERROR呼び出しは見られません。この奇妙で直感に反することが起こっている理由は何ですか?ExecuteReader

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
4

1 に答える 1

1

この場合、複数のレコードセットが返されます。最初のものは空であるため、エラーは発生しません。エラーを取得するには、NextRecordset を呼び出す必要があります。

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

いずれにしても例外として処理する必要がある RAISEERROR を呼び出す代わりに、クライアント コードでエラー チェックを行う方がはるかに簡単です。

SqlDataReader を使用して、クライアント側で Sql Server RAISERROR をキャッチします。

于 2012-04-10T22:03:34.677 に答える