none
請問大大,如何避免Insert 資料時,會有錯誤訊息出現. RRS feed

  • 問題

  • Q1:當我執行程式時,若沒有將"所有欄位"都填滿資料的話,會出現有關"ExecuteNonQuery()"的 錯誤訊息.不知有沒有比較好的方法可以改善?

    Q2:有沒有更好的方法讓此程式有更好效率及節省資源?

    Q3:Insert資料還有其他寫法嗎?

    以下有範例code:(DataGrid x1 for displaying data, TextBox x 4 for inserting data, Button x1 for executing click command)

    Dim SqlConn As SqlConnection

        Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

            Dim ConnString As String = "Data Source=sonymobile; Initial Catalog=ATEN01;Integrated Security=Yes"
            SqlConn = New SqlConnection(ConnString)

            Grid_Bind()

        End Sub

        Sub Grid_Bind()

            Dim SelectSqlString As String = "Select * from TestModule"
            Dim da As New SqlDataAdapter(SelectSqlString, SqlConn)

            Dim ds As New DataSet
            da.Fill(ds, "TestModule")

            Dim dv As New DataView(ds.Tables("TestModule"))

            DataGrid1.DataSource = dv
            DataGrid1.DataBind()

        End Sub

        Private Sub DataGrid1_PageIndexChanged(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataGridPageChangedEventArgs) Handles DataGrid1.PageIndexChanged

            DataGrid1.CurrentPageIndex = e.NewPageIndex
            Grid_Bind()

        End Sub

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

            Dim InsertSqlString As String = "INSERT INTO TestModule(TestModule_No, TestModule_Content, TestModule_Note, TestModule_TimeCost) VALUES (@TestModule_No, @TestModule_Content, @TestModule_Note, @TestModule_TimeCost)"

            Dim InsertCmd As SqlCommand = New SqlCommand(InsertSqlString, SqlConn)

            If TextBox1.Text <> "" Then
                InsertCmd.Parameters.Add(New SqlParameter("@TestModule_No", System.Data.SqlDbType.Int, 4))
                InsertCmd.Parameters("@TestModule_No").Value = TextBox1.Text
            End If

            If TextBox2.Text <> "" Then
                InsertCmd.Parameters.Add(New SqlParameter("@TestModule_Content", System.Data.SqlDbType.NVarChar, 50))
                InsertCmd.Parameters("@TestModule_Content").Value = TextBox2.Text
            End If

            If TextBox3.Text <> "" Then
                InsertCmd.Parameters.Add(New SqlParameter("@TestModule_Note", System.Data.SqlDbType.NVarChar, 1073741823))
                InsertCmd.Parameters("@TestModule_Note").Value = TextBox3.Text
            End If

            If TextBox4.Text <> "" Then
                InsertCmd.Parameters.Add(New SqlParameter("@TestModule_TimeCost", System.Data.SqlDbType.Int, 4))
                InsertCmd.Parameters("@TestModule_TimeCost").Value = TextBox4.Text
            End If

            InsertCmd.Connection.Open()

            Try

                InsertCmd.ExecuteNonQuery()
                Label5.Text = "Add a new record successfully!"

                TextBox1.Text = ""
                TextBox2.Text = ""
                TextBox3.Text = ""
                TextBox4.Text = ""

            Catch exp As SqlException

                If exp.Number = 2627 Then

                    Label5.Text = "Error!The ID is repeated!"

                Else

                    Label5.Text = "Add a new record failed!"

                End If

            End Try

            InsertCmd.Connection.Close()

            Grid_Bind()

        End Sub
    End Class

    2006年2月14日 上午 09:35

解答

  • Q1: 你的欄位可能設定為不允許 NULL,基本上就必須要給值,而且你有使用 Parameter 物件,如果沒設定 Parameter 的值的話,很可能會發生未提供一個或多個必要參數的錯誤,不過因為你的程式已經捕捉錯誤,不妨就輸出 exp.Message 來,這樣才可以看清楚到底是什麼樣的錯誤 .

    Q2: "有沒有更好的方法讓此程式有更好效率及節省資源" 這問題挺怪,你的程式基本上在 DataBind 的部份,如果能使資料量減少最好,因為取一百筆和取一萬筆是有差別的,若程式沒什麼會耗損資源的地方,那資料庫的速度就是關鍵 .

    Reference:
    http://msdn.microsoft.com/data/DataAccess/adonet/default.aspx?pull=/library/en-us/dnpag/html/scalenetchapt12.asp

    Q3: 你的寫法是比較安全的,用字串連結的方式產生 SQL 會有 Security Issue.

    2006年2月15日 上午 04:10
    版主