0

我是 SQL 新手,在我的项目中,我试图从 DataBase 表中填充 DataSet,然后在 DataSet 中插入新行。完成此操作后,我再次使用 DataSet 数据填充数据库表。在填充之前,我正在清除或删除数据库表数据。好吧,我通过使用以下代码实现了这一点:

Database Table --> myTable
DataSet --> ds

按钮点击

   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();
      }
   }

上面的代码工作正常,但是当commandsqlCommand 中有任何异常时,它会完全删除数据库表而不填充 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 回答