[ASP.NET] ADO.NET + Try...Catch + DB Transaction + Query parameter

摘要:[ASP.NET] ADO.NET + Try...Catch + DB Transaction + Query parameter

 

要完成這樣一個表單來做基本資料的新增與刪除,其實只要簡單的2行程式,但是如果要考量到錯誤狀況的處理,就得使用一些方法來處理他,這一次要說的就是『ADO.NET + Try...Catch + DB Transaction + Query parameter』合併應用。

2行程式是哪2行阿?就是 Sql_employee.Insert() 與 Sql_employee.Delete(),而 Sql_employee 是我的 SqlDataSource 的名稱。

當然你得在前端先處理一下,其動作就是幾個步驟的點選

<asp:SqlDataSource ID="Sql_employee" runat="server" 
        ConnectionString="<%$ ConnectionStrings:Test_DBConnectionString %>" 
        DeleteCommand="DELETE FROM [employee] WHERE [emp_id] = @emp_id" 
        InsertCommand="INSERT INTO [employee] ([emp_id], [emp_name]) VALUES (@emp_id, @emp_name)" 
        SelectCommand="SELECT [emp_id], [emp_name] FROM [employee]" 
        UpdateCommand="UPDATE [employee] SET [emp_name] = @emp_name WHERE [emp_id] = @emp_id">
        <DeleteParameters>
            <asp:ControlParameter ControlID="txt_id" Name="emp_id" PropertyName="Text" 
                Type="Int32" />
        </DeleteParameters>
        <UpdateParameters>
            <asp:ControlParameter ControlID="txt_name" Name="emp_name" PropertyName="Text" 
                Type="String" />
            <asp:ControlParameter ControlID="txt_id" Name="emp_id" PropertyName="Text" 
                Type="Int32" />
        </UpdateParameters>
        <InsertParameters>
            <asp:ControlParameter ControlID="txt_id" Name="emp_id" PropertyName="Text" 
                Type="Int32" />
            <asp:ControlParameter ControlID="txt_name" Name="emp_name" PropertyName="Text" 
                Type="String" />
        </InsertParameters>
    </asp:SqlDataSource>

 

但是要抓出(避免)錯誤執行,出現下面難堪畫面,就得動點手腳

這樣的錯誤提示可愛多了

很複雜嗎?其實不會,看下面這段程式碼就知道了

 

  1. Dim connectx As String =System.Configuration.ConfigurationManager.ConnectionStrings("Test_DBConnectionString").ConnectionString
  2. Dim conn As New SqlConnection(connectx)
  3.  conn.Open()
  4. Dim trans1 As SqlTransaction = conn.BeginTransaction
  5. Dim sqlcmd As String = "INSERT INTO [employee] ([emp_id], [emp_name]) VALUES (@emp_id, @emp_name)"
  6. Dim cmd As New SqlCommand(sqlcmd, conn)
  7. cmd.Transaction = trans1
  8. Try
  9.   cmd.Parameters.Add("@emp_id", SqlDbType.Int).Value = CInt(txt_id.Text)
  10.   cmd.Parameters.Add("@emp_name", SqlDbType.NChar10).Value =txt_name.Text
  11.   cmd.ExecuteNonQuery()
  12.   trans1.Commit()
  13.   MsgBox("新增資料成功")
  14. Catch ex As Exception
  15.   trans1.Rollback()
  16.   MsgBox("無法新增該筆資料")
  17. Finally
  18.   conn.Close()
  19.   conn.Dispose()
  20.   trans1.Dispose()
  21.   cmd.Dispose()
  22. End Try

註1:當然在這個例子中,使用 Transaction 的 Rollback 是無意義的,因為當 Insert 出錯時,自然不能將該筆資料新增到資料庫裡,也就沒 Rollback 的必要。但是當你的 conn.BeginTransaction ...... 到 trans1.Rollback() 之間有多次 T-SQL 動作時,一旦某個 T-SQL 執行錯誤,就會去 Rollback 之前已經成功的動作。

例如:ATM 領錢:要求提款 ->輸入提款金額 ->大於剩餘金額 ->扣款 ->吐鈔 ->吐鈔的機械動作。假設吐鈔的機械動作錯誤時,顧客無法領到錢,就必須將剛剛已經扣款的金額給補回去(Rollback)

註2:若單純抓取一個 T-SQL 執行是否有錯,其實用 Try...Catch...Finally...End Try 就可以了,在將錯誤訊息寫在 Catch 區塊裡。Finally 是當正常執行時,最後釋放到佔住的系統資源。

註3:System.Configuration.ConfigurationManager.ConnectionStrings("Test_DBConnectionString").ConnectionString 是用來抓取寫在 web.config 裡的 connection 資料。

註4:至於使用 ADO.NET 跟使用塞參數方式,就如同上面的例子,也不會太難。

~ End