摘要:[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>
但是要抓出(避免)錯誤執行,出現下面難堪畫面,就得動點手腳
這樣的錯誤提示可愛多了
很複雜嗎?其實不會,看下面這段程式碼就知道了
-
Dim connectx As String =System.Configuration.ConfigurationManager.ConnectionStrings("Test_DBConnectionString").ConnectionString
-
Dim conn As New SqlConnection(connectx)
-
conn.Open()
-
Dim trans1 As SqlTransaction = conn.BeginTransaction
-
Dim sqlcmd As String = "INSERT INTO [employee] ([emp_id], [emp_name]) VALUES (@emp_id, @emp_name)"
-
Dim cmd As New SqlCommand(sqlcmd, conn)
-
cmd.Transaction = trans1
-
Try
-
cmd.Parameters.Add("@emp_id", SqlDbType.Int).Value = CInt(txt_id.Text)
-
cmd.Parameters.Add("@emp_name", SqlDbType.NChar, 10).Value =txt_name.Text
-
cmd.ExecuteNonQuery()
-
trans1.Commit()
-
MsgBox("新增資料成功")
-
Catch ex As Exception
-
trans1.Rollback()
-
MsgBox("無法新增該筆資料")
-
Finally
-
conn.Close()
-
conn.Dispose()
-
trans1.Dispose()
-
cmd.Dispose()
-
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