.net C# 事務處理

在數據庫中使用存儲過程,通常遇到多個操作的時候,我們都會用事物來進行錯誤回滾。但是,有時候,需要保存大數據量的時候,將數據傳到存儲過程裏面,是很麻煩的時候,varchar 8000,nvarchar 4000,當大於這個最大值的時候,怎麼處理呢?多聲明幾個參數。?這個,你能預知多少個呢?

 所以,在這個情況下,我覺得在代碼裏面使用事物比較好。

下面我們看一下,怎麼樣在代碼中實現事物操作數據:

1.首先要啓動 

MSDTC 服務(Distributed Transaction Coordinator) 協調跨多個數據庫、消息隊列、文件系統等資源管理器的事務。如果停止此服務,這些事務將會失敗。如果禁用此服務,顯式依賴此服務的其他服務將無法啓動。

確保MSDTC服務啓動運行。

讓後在項目中引用

System.Transactions  

代碼中:

using System.Transactions;  


下面看一下具體代碼

 using (TransactionScope scope = new TransactionScope())
                {
                    DbCommand cmd = new DbCommand(....)
                   ...........//這裏是您的代碼。

                    ret = ExecuteNonQuery(dbUnic, cmd);


                    if (0 < ret)
                    {
                        scope.Complete();
                    }
                    else
                    {
                        scope.Dispose();
                    }
                }


以上是單個操作的僞代碼,下面看一下多個操作:

                using (TransactionScope scope = new TransactionScope())
                {
                    DbCommand cmd =
                        dbUnic.GetSqlStringCommand(........));

                    dbUnic.AddInParameter(cmd, NAME_PARAM_CONSULTATION_SYSID, DbType.String, sysID);
                    dbUnic.AddInParameter(cmd, NAME_PARAM_CONSULTATION_OBJID, DbType.String, objID);
                    ............

                    bool hasError = true;

                    if (0 < ExecuteNonQuery(dbUnic, cmd))
                    {
                        using (SqlBulkCopy bulkCopy = new SqlBulkCopy(DBConnectionString))
                        {
                            bulkCopy.DestinationTableName =
                                DataAccessConsultationSlice.NAME_TBL_CONSULTATION_SLICE;

                            try
                            {
                                // Write from the source to the destination.
                                bulkCopy.WriteToServer(這個是datatable數據);
                                hasError = false;
                            }
                            catch (Exception ex)
                            {
                                hasError = true;
                            }
                        }

                        if (!hasError)
                        {
                            using (SqlBulkCopy bulkCopy = new SqlBulkCopy(DBConnectionString))
                            {
                                bulkCopy.DestinationTableName =
                                    DataAccessConsultationExpert.NAME_TBL_CONSULTATION_EXPERT;

                                try
                                {
                                    // Write from the source to the destination.
                                    bulkCopy.WriteToServer(這個是datatable數據);
                                    hasError = false;
                                }
                                catch (Exception ex)
                                {
                                    hasError = true;
                                }
                            }

                            if (!hasError)
                            {
                                using (SqlBulkCopy bulkCopy = new SqlBulkCopy(DBConnectionString))
                                {
                                    bulkCopy.DestinationTableName =
                                        DataAccessConsultationAnnex.NAME_TBL_CONSULTATION_ANNEX;

                                    try
                                    {
                                        // Write from the source to the destination.
                                        bulkCopy.WriteToServer(這個是datatable數據);
                                        hasError = false;
                                    }
                                    catch (Exception ex)
                                    {
                                        hasError = true;
                                    }
                                }
                            }
                        }
                    }

                    ret = hasError ? 0 : 1;

                    if (0 < ret)
                    {
                        scope.Complete();
                    }
                    else
                    {
                        scope.Dispose();
                    }
                }
這樣,就不用擔心數據太大的問題了,只要把數據拼裝好了,就可以在代碼中直接進行數據操作的事物了。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章