私は以下のように、ストアドプロシージャを呼び出す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つだけ返されます。なぜ私は複数の結果セットを返すと言いますか? – Sunil
あなたはそれをしていませんが、ADO.NETによってSPの結果が返される方法は2つのレコードセットになります。これに踏み込んだら、[SET NOCOUNT ON](http://stackoverflow.com/questions/1483732/set-nocount-on-usage) –
Okを使用しないでください。私は今あなたを得る。あなたの非常に有益な返答をありがとう。 – Sunil