なぜ第二のブロックスローする必要があり、{}ブロック)(以下に示すように(){}(SIC)ブロックを使用してを使用し、そしてCMD1を使用して、最初の範囲を超えて住んでいないと仮定しているがメッセージの例外SqlParameterは既に別のSqlParameterCollectionに含まれていますか? cmd1に添付されているパラメータ(SqlParameterCollection)を含むリソースやハンドルが、ブロックの最後に破棄されたときに解放されないことを意味しますか?SqlParameterは既に別のSqlParameterCollectionに含まれています - using(){}は不正ですか?
using (var conn = new SqlConnection("Data Source=.;Initial Catalog=Test;Integrated Security=True"))
{
var parameters = new SqlParameter[] { new SqlParameter("@ProductId", SqlDbType.Int) };
using(var cmd1 = new SqlCommand("SELECT ProductName FROM Products WHERE ProductId = @ProductId"))
{
foreach (var parameter in parameters)
{
cmd1.Parameters.Add(parameter);
}
// cmd1.Parameters.Clear(); // uncomment to save your skin!
}
using (var cmd2 = new SqlCommand("SELECT Review FROM ProductReviews WHERE ProductId = @ProductId"))
{
foreach (var parameter in parameters)
{
cmd2.Parameters.Add(parameter);
}
}
}
注:cmd1.Parameters.Clearをやっ()だけで使用して最初の()の最後の括弧の前に{}ブロックは例外(および可能恥ずかし)からあなたを救うでしょう。
あなたがオブジェクトを作成するには、次のスクリプトを使用することができます再現する必要がある場合:
CREATE TABLE Products(
ProductId int IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,
ProductName nvarchar(32) NOT NULL)
GO
CREATE TABLE ProductReviews(
ReviewId int IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,
ProductId int NOT NULL,
Review nvarchar(128) NOT NULL)
GO
ありがとうございました。私はそれが事実だと思った。それはまた、SqlParameterが、それが良いことであると確信していない廃棄オブジェクトに自身を関連付けることを意味します。 –
@JohnGathogo:関連付けが形成された後に処理されるオブジェクトに関連付けられています。確かに理想的ではありません。 –
他のメモ。最初の 'using'ブロックを終了する前に' Clear'を実行しなければなりませんでした。私の2番目の 'using'ブロックを入力すると、このエラーが発生しました。 – Snekse