0

私は SQL を初めて使用します。私のプロジェクトでは、DataBase テーブルから DataSet を埋めようとしていて、DataSet に新しい行を挿入しようとしています。これを行った後、再びデータベース テーブルに DataSet データを入力します。入力する前に、データベース テーブルのデータをクリアまたは削除しています。以下のコードを使用してこれを達成しました。

Database Table --> myTable
DataSet --> ds

OnButtonClick

   string strQuery = "delete from [dbo].[myTable]"
   SqlConnection conn = new SqlConnection(strConn);
   SqlCommand cmd = new SqlCommand(strQuery, conn);
   SqlCommand command;
   SqlDataAdapter da = new SqlDataAdapter(cmd);
   using (cmd)
   {
      using (conn)
      {
         conn.Open();
         cmd.ExecuteNonQuery();                    //deleting database table data
         foreach (DataRow dr in ds.Tables[0].Rows) //Inserting new data into the Database table
         {
             command = new SqlCommand(InsertQuery, conn);
             command.ExecuteNonQuery();
         }
         conn.Close();
      }
   }

command上記のコードは正常に動作していますが、 sqlCommand で例外が発生すると、データベース テーブルが完全に削除され、DataSet がいっぱいになりません。このコードを変更するための提案はありますか? 助けてください。

アップデート:

            string strQuery = "delete from [dbo].[myTable]";
            using (SqlCommand cmd = new SqlCommand(strQuery, conn))
            {
                using (SqlCommand cmdReset = new SqlCommand("DBCC CHECKIDENT('myTable', RESEED, 0)", conn))
                {
                    SqlDataAdapter da = new SqlDataAdapter(cmd);
                    conn.Open();
                    SqlTransaction sqlTransaction = conn.BeginTransaction();
                    cmd.Transaction = sqlTransaction;
                    try
                    {
                        cmd.ExecuteNonQuery();                   //deleting database table data
                        cmdReset.ExecuteNonQuery();               //Resetting Identity of first column
                        foreach (DataRow dr in ds.Tables[0].Rows) //Inserting new data into the Database table
                        {
                            command = new SqlCommand(query.createDoctorRow(InsertQuery, conn);
                            command.ExecuteNonQuery();
                        }
                        sqlTransaction.Commit();
                        conn.Close();
                    }
                    catch (Exception e)
                    {
                        sqlTransaction.Rollback();
         /*ERROR*/      throw;  
                    }
                }
            }

エラー --> 「ExecuteNonQuery では、コマンドに割り当てられた接続が保留中のローカル トランザクションにある場合、コマンドにトランザクションが必要です。コマンドのトランザクション プロパティが初期化されていません。」

4

2 に答える 2

4

トランザクションを使用して SQL を実行する

string strQuery = "delete from [dbo].[myTable]";

using (SqlConnection conn = new SqlConnection(strConn))
{
  using (cmd = new SqlCommand(strQuery, conn))
  {
     SqlDataAdapter da = new SqlDataAdapter(cmd);
     conn.Open();
     SqlTransaction sqlTransaction = conn.BeginTransaction();
     cmd.Transaction = sqlTransaction;
     try
     {
         cmd.ExecuteNonQuery();                    //deleting database table data
         foreach (DataRow dr in ds.Tables[0].Rows) //Inserting new data into the Database table
         {
             command = new SqlCommand(InsertQuery, conn);
             command.ExecuteNonQuery();
         }
         sqlTransaction.Commit();
         conn.Close();
     }
     catch(Exception e)
     {
         sqlTransaction.Rollback();
         throw;
     }
  }

}

トランザクションは、オール オア ナッシングのシナリオを形成します。トランザクション内のすべてが機能してデータベースにコミットされるか、何も起こらなかったかのようにロット全体がキャンセルされます。

于 2012-11-02T13:49:37.703 に答える
3

このは、SQL コマンドをトランザクション スコープにラップする優れた方法を示しています。基本的に、行の挿入中に例外がスローされると、削除クエリも失敗します。

ナッツシェルでは、すべてを

 using (TransactionScope scope = new TransactionScope())
        {
            using (SqlConnection connection1 = new SqlConnection(connectString1))
            {
                 //enter your code here
            }
      }

また、行ごとに挿入する必要はありません。SqlBulkCopyを使用すると、より効率的に挿入できます。

 using (SqlConnection connection =new SqlConnection(connectionString))
 {
        connection.Open();
        using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
         {                               
                  bulkCopy.DestinationTableName = table.TableName;
                  bulkCopy.WriteToServer(table);
         }
  }
于 2012-11-02T13:50:53.810 に答える