0

私のウィンドウ アプリケーションでは、一連の sqlcommands を実行する必要があります。すべての sql コマンドが正常に実行されれば問題ありませんが、2 番目または 3 番目のコマンドがエラーになると、1 番目のコマンドは実行されますが、2 番目と 3 番目のコマンドは実行されないため、大きな問題になります。ここでは、すべてのコマンドを実行するか、何も実行しないかを指定します。私のコードは次のとおりです。

SqlCommand cmd = new SqlCommand("CREATE TABLE [dbo].[" + textBox8.Text + "_stock]("
                        + "[date] [date] NOT NULL PRIMARY KEY CLUSTERED,"
                        + "[openingstock] [int] NOT NULL,"
                        + "[receipt] [int] NOT NULL,"
                        + "[totalstock] [int] NOT NULL,"
                        + "[sell] [int] NOT NULL,"
                        + "[closingstock] [int] NOT NULL,"
                        + ") ON [PRIMARY]", connectionsql);
                    cmd.ExecuteNonQuery();
                    cmd.Dispose();                  

                    SqlCommand cmd1 = new SqlCommand("insert into " + textBox8.Text + "_stock values(@date,0,0,0,0,0)", connectionsql);
                    cmd1.Parameters.AddWithValue("date", dateTimePicker3.Value);
                    cmd1.ExecuteNonQuery();
                    cmd1.Dispose();
                    cmd1.Parameters.Clear();

                    SqlCommand cmd2 = new SqlCommand("insert into rate values ('" + textBox12.Text + "','" + textBox8.Text + "_stock','" + double.Parse(textBox7.Text) + "','" + comboBox4.SelectedItem + "')", connectionsql);
                    int z = cmd2.ExecuteNonQuery();
                    cmd2.Dispose(); 
4

3 に答える 3

1

トランザクションは行く方法です。あなたの場合:

using (SqlConnection connectionsql= new SqlConnection(connectionString))
{
    connectionsql.Open();

    SqlTransaction transaction;

    // Start a local transaction.
    transaction = connectionsql.BeginTransaction("SampleTransaction");

    SqlCommand cmd = new SqlCommand("CREATE TABLE [dbo].[" + textBox8.Text + "_stock]("
        + "[date] [date] NOT NULL PRIMARY KEY CLUSTERED,"
        + "[openingstock] [int] NOT NULL,"
        + "[receipt] [int] NOT NULL,"
        + "[totalstock] [int] NOT NULL,"
        + "[sell] [int] NOT NULL,"
        + "[closingstock] [int] NOT NULL,"
        + ") ON [PRIMARY]", connectionsql);

    if (cmd.ExecuteNonQuery() <1) // no table created
    {
        transaction.Rollback();
    }
    else // no error
    {
        SqlCommand cmd1 = new SqlCommand("insert into " + textBox8.Text + "_stock values(@date,0,0,0,0,0)", connectionsql);
        cmd1.Parameters.AddWithValue("date", dateTimePicker3.Value);

        if (cmd1.ExecuteNonQuery() < 1) // no row inserted
        {
            transaction.Rollback();
        }
        else // no error
        {
            cmd1.Dispose();

            SqlCommand cmd2 = new SqlCommand("insert into rate values ('" + textBox12.Text + "','" + textBox8.Text + "_stock','" + double.Parse(textBox7.Text) + "','" + comboBox4.SelectedItem + "')", connectionsql);
            int z = cmd2.ExecuteNonQuery();

            if (z < 1) // no row inserted
            {
                transaction.Rollback();
            }
            else // no error
            {
                transaction.Commit(); // everything was OK, you can commit the results
            }           
            cmd2.Dispose(); 
        }
        cmd1.Dispose();
    }
    cmd.Dispose();
}
于 2013-10-03T14:52:50.087 に答える
1

使用TransactionScope... [MSDN ページ] の下部にある例を参照してください。( http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspx )

于 2013-10-03T14:36:23.917 に答える
1

これを行うために使用できますtransactions。私は次のようなことを意味します:

transaction.BeginTransaction();
try{
    // your commands here
    transaction.CommitTransaction(); // commit after all commands
} catch (Exception){
    // if exception, rollback
    transaction.RollbackTransaction();
}

詳細については、http: //msdn.microsoft.com/en-us/library/system.data.sqlclient.sqltransaction.commit (v=vs.110).aspx を参照してください。

重要: SQL インジェクションを回避するために、パラメーター化されたクエリの使用を検討してください。

于 2013-10-03T14:40:38.230 に答える