插入

时间:2019-02-12 03:47:11

标签: vb.net loops validation



自从我上一篇关于通过复选框进行循环保存的帖子以来已经有一段时间了。
所以我确实设法在将输入保存到表之前检查了输入,但是即使不重复一个,它也无法保存任何数据。
想要创建一个函数来检查表中是否已经存在每个复选框列表,但是我无法对其进行管理,因为它需要此脚本中的值,因此我跳过了它。

Using conn2 As New SqlConnection()
        conn2.ConnectionString = ConfigurationManager _
            .ConnectionStrings("BackboneConnectionString").ConnectionString()
        Using cmd As New SqlCommand
            cmd.CommandText = "Insert into EL_MstFunctionalNilai values(@IDFunc, @nik, @IDFuncParent, @IDFuncChild, @IDFuncMtr, '', '', '0')"
            cmd.Connection = conn2
            conn2.Open()
            For Each item As ListItem In CheckBoxList2.Items
                If item.Selected Then
                    'cmd.Parameters.Clear()

                    Dim urutan As Int32 = GetNumberFunctional()
                    Dim str As String = item.Value.ToString

                    Dim strArr() As String = str.Split("_")
                    Dim IDFunctionalParent1 As String = strArr(0)
                    Dim IDFunctionalChild1 As String = strArr(1)
                    Dim IDFunctionalMtr1 As String = strArr(2)

                    cmd.CommandText = "select count(*)as numrows from el_mstFunctionalnilai where nik = @nik and idfuncmtr = @IDFuncMtr"
                    cmd.Parameters.AddWithValue("@nik", txtnik.Text)
                    cmd.Parameters.AddWithValue("@IDFuncMtr", IDFunctionalMtr1)
                    queryresult = cmd.ExecuteScalar()

                    If queryresult = 0 Then

                        cmd.Parameters.Clear()
                        cmd.Parameters.AddWithValue("@IDFunc", urutan)
                        cmd.Parameters.AddWithValue("@nik", txtnik.Text)
                        cmd.Parameters.AddWithValue("@IDFuncMtr", IDFunctionalMtr1) 'mtr
                        cmd.Parameters.AddWithValue("@IDFuncParent", IDFunctionalParent1) 'parent 
                        cmd.Parameters.AddWithValue("@IDFuncChild", IDFunctionalChild1) 'child

                        cmd.ExecuteNonQuery()
                        'Label1.Text = queryresult --> already check if queryresult has value

                    End If
                End If
            Next
            conn2.Close()
        End Using
    End Using

当它没有执行错误时,所以我无法弄清楚我缺少了什么。那么我该如何解决呢?
谢谢。

1 个答案:

答案 0 :(得分:0)

el_mstFunctionalnilai

EL_MstFunctionalNilai

是哪个?请注意大写。

我猜到了所有SqlDbType,请检查您的数据库以获取实际的类型。

代码跟随您的模式,并有2次命中数据库。

Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim queryResult As Integer
    'Pass the connection string directly to the constructor of the connection
    Using conn2 As New SqlConnection(ConfigurationManager.ConnectionStrings("BackboneConnectionString").ConnectionString())
        'Pass the command text and the connection directly to the command constructor
        'You do not need as alias for Count
        Using cmd As New SqlCommand("select count(*) from EL_MstFunctionalNilai where nik = @nik and idfuncmtr = @IDFuncMtr", conn2)
            conn2.Open()
            'This value does not appear to change in the loop so I moved it outside the loop
            Dim urutan As Int32 = GetNumberFunctional()
            'Add the parameters outside of the loop and only change the value inside the loop
            'The value of the text box can't change inside the loop so it can be assigned outside the loop
            cmd.Parameters.Add("@nick", SqlDbType.Int).Value = CInt(txtnik.Text)
            cmd.Parameters.Add("@IDFuncMtr", SqlDbType.VarChar)
            Using cmd2 As New SqlCommand("Insert into EL_MstFunctionalNilai values(@IDFunc, @nik, @IDFuncParent, @IDFuncChild, @IDFuncMtr, '', '', '0')", conn2)
                cmd2.Parameters.Add("@IDFunc", SqlDbType.Int).Value = urutan
                cmd2.Parameters.Add("@nik", SqlDbType.Int).Value = CInt(txtnik.Text)
                cmd2.Parameters.Add("@IDFuncMtr", SqlDbType.VarChar) 'mtr
                cmd2.Parameters.Add("@IDFuncParent", SqlDbType.VarChar) 'parent 
                cmd2.Parameters.Add("@IDFuncChild", SqlDbType.VarChar) 'child
                For Each item As ListItem In CheckBoxList2.Items
                    If item.Selected Then
                        Dim str As String = item.Value.ToString
                        Dim strArr() As String = str.Split("_"c)
                        Dim IDFunctionalParent1 As String = strArr(0)
                        Dim IDFunctionalChild1 As String = strArr(1)
                        Dim IDFunctionalMtr1 As String = strArr(2)
                        cmd.Parameters("@IDFuncMtr").Value = IDFunctionalMtr1
                        queryResult = CInt(cmd.ExecuteScalar())
                        If queryResult = 0 Then
                            cmd2.Parameters("@IDFuncMtr").Value = IDFunctionalMtr1 'mtr
                            cmd2.Parameters("@IDFuncParent").Value = IDFunctionalParent1 'parent 
                            cmd2.Parameters("@IDFuncChild").Value = IDFunctionalChild1 'child
                            cmd.ExecuteNonQuery()
                        End If
                    End If
                Next
            End Using
        End Using
    End Using
End Sub

我认为使用一个查询既可以检查记录是否存在,也可以在不存在的情况下插入记录,会更容易。

Protected Sub Method2()
    Dim urutan As Int32 = GetNumberFunctional()
    Using cn As New SqlConnection(ConfigurationManager.ConnectionStrings("BackboneConnectionString").ConnectionString())
        Using cmd As New SqlCommand("If Exists (Select 1 From EL_MstFunctionalNilai where nik = @nik and idfuncmtr = @IDFuncMtr) Select 0 Else Select 1 Insert into EL_MstFunctionalNilai values(@IDFunc, @nik, @IDFuncParent, @IDFuncChild, @IDFuncMtr, '', '', '0');", cn)
            cmd.Parameters.Add("@nik", SqlDbType.Int).Value = CInt(txtnik.Text)
            cmd.Parameters.Add("@IDFuncMtr", SqlDbType.VarChar)
            cmd.Parameters.Add("@IDFunc", SqlDbType.VarChar).Value = urutan
            cmd.Parameters.Add("@IDFuncParent", SqlDbType.VarChar)
            cmd.Parameters.Add("@IDFuncChild", SqlDbType.VarChar)
            cn.Open()
            For Each item As ListItem In CheckBoxList2.Items
                If item.Selected Then
                    Dim strArr() As String = item.Value.ToString.Split("_"c)
                    cmd.Parameters("@IDFuncMtr").Value = strArr(2)
                    cmd.Parameters("@IDFuncParent").Value = strArr(0)
                    cmd.Parameters("@IDFuncChild").Value = strArr(1)
                    cmd.ExecuteScalar()
                End If
            Next
        End Using
    End Using
End Sub