9

C#のループ内にデータベースレコードを挿入しようとしています。

次のように値をハードコーディングすると機能します。

    string query3 = "INSERT INTO furniture (room_id,member_id) VALUES (222,333);";
    SqlCommand cmd3 = new SqlCommand(query3, sqlConnection3);
    sqlConnection3.Open();

    for (int i = 0; i < arrItemsPlanner.Length; i++)
    {
        try
            {
                cmd3.ExecuteNonQuery();
            }
            catch
            {
                return "Error: Item could not be saved";
            }
            finally
            {
                //Fail
            }
        }

しかし、パラメーター化されたクエリを使用すると、機能しません-次のようにパラメーター化されたクエリに値をハードコーディングしても、次のようになります。

    string query3 = "INSERT INTO furniture (room_id,member_id) VALUES (@room_id,333);";
    SqlCommand cmd3 = new SqlCommand(query3, sqlConnection3);
    sqlConnection3.Open();

    for (int i = 0; i < arrItemsPlanner.Length; i++)
    {
        try
            {
                cmd3.Parameters.Add("@room_id", System.Data.SqlDbType.Int);
                cmd3.Parameters["@room_id"].Value = 222;
                cmd3.ExecuteNonQuery();
            }
            catch
            {
                return "Error: Item could not be saved";
            }
            finally
            {
                //Fail
            }
        }

誰かが私がここで間違っているところを見ることができますか?

どうもありがとう!

4

7 に答える 7

6

コマンドのパラメータコレクションに何度も追加しているようです。反復ごとにクリアします。

また、問題が何であるかを確認できるように、実際の例外をスローすることをお勧めします。

于 2012-01-05T17:42:59.217 に答える
3

これはテストされていませんが、代替手段として機能するはずです。一度追加するだけで、その値を継続的に更新できます。

....
cmd3.Parameters.Add("@room_id", System.Data.SqlDbType.Int);

for (int i = 0; i < arrItemsPlanner.Length; i++)
{
    try
        {
            cmd3.Parameters["@room_id"].Value = 222;
            cmd3.ExecuteNonQuery();
        }
....

余談ですが、あなたSqlCommandusingあなたのSqlConnection. 完全なコードは表示されていないため、接続が実際にそのような方法で行われているかどうかはわかりません.

using (var conn = new SqlConnection(...))
using (var cmd = new SqlCommand(..., conn))
{

}
于 2012-01-05T17:46:14.310 に答える
1

あなたがしていることは、ループの繰り返しにパラメータを追加することです。以下のコードでは、パラメーターを 1 回追加し、単一のパラメーターの値を変更するだけです。これを試して:

string query3 = "INSERT INTO furniture (room_id,member_id) VALUES (@room_id,333);"; 
SqlCommand cmd3 = new SqlCommand(query3, sqlConnection3);
cmd3.Parameters.Add("@room_id", SqlDbType.Int);

sqlConnection3.Open(); 

for (int i = 0; i < arrItemsPlanner.Length; i++) 
{ 
    try 
        { 
            cmd3.Parameters["@room_id"].Value = 222; 
            cmd3.ExecuteNonQuery(); 
        } 
        catch 
        { 
            return "Error: Item could not be saved"; 
        } 
        finally 
        { 
            //Fail 
        } 
    } 
于 2012-01-05T17:44:31.833 に答える
1

はい、ループにパラメーターを追加しないでください。値を設定するだけです。

string query3 = "INSERT INTO furniture (room_id,member_id) VALUES (@room_id,333);";
SqlCommand cmd3 = new SqlCommand(query3, sqlConnection3);
sqlConnection3.Open();

cmd3.Parameters.Add("@room_id", System.Data.SqlDbType.Int);

for (int i = 0; i < arrItemsPlanner.Length; i++)
{
    try
        {
            cmd3.Parameters["@room_id"].Value = 222;
            cmd3.ExecuteNonQuery();
        }
        catch
        {
            return "Error: Item could not be saved";
        }
        finally
        {
            //Fail
        }
    }
于 2012-01-05T17:45:14.327 に答える
1
cmd3.Parameters.Add("room_id", System.Data.SqlDbType.Int);

// ループに追加し続けないでください

cmd3.Parameters["room_id"].Value = 222; 

SQL Server を使用する場合、パラメーター コレクションに @ は必要ありません

于 2012-01-05T17:45:45.153 に答える