iT邦幫忙

0

C# using 下多個command.ExecuteNonQuery();

  • 分享至 

  • xImage

您好:
參考
https://kagawacode.medium.com/speed-benchmark-for-sql-bulk-insert-update-temp-table-vs-table-valued-parameters-3439b943d27c

修改如下
我有加入qlTransaction sqlTran = conn.BeginTransaction(); // 開始事務
但執行時卻出現
Error:當指定給命令的連接為擱置的本機交易時,ExecuteNonQuery 需要連接以交易。命令的 Transaction 屬性尚未初始化。

請問,這一段是否因為多個ExecuteNonQuery ?

要如何解決呢?
謝謝

 using (SqlConnection conn = new SqlConnection(_Conn))
            {
                


                using (SqlCommand command = new SqlCommand("", conn))
                {
                    command.CommandTimeout = 300;
                    conn.Open();

                    SqlTransaction sqlTran = conn.BeginTransaction(); // 開始事務

                    //------------1.Create temp table
                    command.CommandText = @"CREATE TABLE #TempAA
                                (
                                    [holiday] varchar (8) NULL,
	                                [workno] varchar (6) NOT NULL,
	                               
                                )";
                    command.ExecuteNonQuery();

                    //------------2. Bulk copy data into temp table
                    using (SqlBulkCopy sqlBC = new SqlBulkCopy(conn))
                    {
                        sqlBC.DestinationTableName = "#TempAA";

                        sqlBC.ColumnMappings.Add("holiday", "holiday");
                        sqlBC.ColumnMappings.Add("workno", "workno");
                                    

                        sqlBC.WriteToServer(dt);
                    }

                    // 3. Join updating table with temp table and run update
                    // 4. Delete updated records from temp table
                    // 5.Insert what is left in temp table
                    command.CommandText = @" DELETE m
                                            FROM holiday2 m  
                                                        WHERE;


                                            INSERT INTO hr_holiday2  
                                            SELECT * FROM #tempAA;


                                            DROP TABLE #TempAA;
                                        ";

                    command.ExecuteNonQuery();

                    try
                    {

                       // sqlBC.WriteToServer(dt);
                        sqlTran.Commit();
                        js = "OK";
                    }
                    catch (Exception)
                    {
                        js = "ERR";
                        sqlTran.Rollback();
                        throw;
                    }
                    finally
                    {
                        //sqlBC.Close();
                      //  conn.Close();
                    }
                    //開始寫入
                }  //---using (SqlCommand command 
            }  //----USING CONN
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
hsuwesley
iT邦見習生 ‧ 2024-05-25 22:27:57
最佳解答

在執行ExecuteNonQuery之前,Command也要知道是Transaction

在執行命令前要加入這行
command.Transaction = sqlTran;

noway iT邦研究生 3 級 ‧ 2024-05-27 09:16:52 檢舉

您好:
謝謝
我發現還有一段bulk insert 要作
// using (SqlBulkCopy sqlBC = new SqlBulkCopy(conn))
using (SqlBulkCopy sqlBC = new SqlBulkCopy(conn, SqlBulkCopyOptions.Default, sqlTran) )
這樣才可以過
謝謝

我要發表回答

立即登入回答