Массовое обновление данных в приложении windows с использованием процедуры обновления SQL - PullRequest
0 голосов
/ 06 января 2020

Я создал приложение windows для отображения данных из базы данных SQL в виде сетки в приложении windows. Для этого я использовал сервер VB. net и SQL. При использовании условия where в запросе sql я получил значения, которые удовлетворяют заданным данным. Теперь мне нужно обновить показанные данные. Для этого я использовал запрос sql Update columnName = значение где (условие). имя и значение столбца получаются от пользователя с помощью текстового поля. Когда я использовал запрос в Sql, он отлично работает, и значение обновляется в базе данных. Но когда я запускаю то же самое в коде VB, он не обновляется в приложении windows. Я не понимаю, и назначенное время для него выходит за рамки моего времени наблюдения. Пожалуйста, помогите мне кто-нибудь. Заранее спасибо. Здесь я прилагаю код.

\ код начинается здесь \

Private Sub Btn_Edit_Click(sender As Object, e As EventArgs) Handles btn_Update.Click
        cmdupdate.Connection = connection
        connection.Open()
        'table.Rows.Clear()
        'table.Columns.Clear()

 cmdupdate.CommandText = "update tblWebaccessErrorTrack set @columnName = @editData where IssueDateTime between @frmdate and @todate and ErrorDetails like '%' + @errorDetails + '%' and  ClientIpaddress like '%'+ @IpAddress + '%' and ResponseStatus like '%'+ @responseStatus + '%' and TicketNo like '%' + @ticketNo + '%' select * from tblWebaccessErrorTrack"
        table.Clear()
        '"UPDATE tblWebaccessErrorTrack
        ' SET
        ' @columnName = @editData"
        '"sp_Updatedata"
        'Update tblWebaccessErrorTrack set TicketNo=202010 select * from tblWebaccessErrorTrack

        'cmdupdate.CommandType = CommandType.StoredProcedure
        cmdupdate.Parameters.Add("@frmdate", SqlDbType.DateTime).Value = frm_DateTimePicker.Text
        cmdupdate.Parameters.Add("@todate", SqlDbType.DateTime).Value = to_DateTimePicker.Text
        cmdupdate.Parameters.Add("@errorDetails", SqlDbType.NVarChar).Value = txtErrorDetails.Text
        cmdupdate.Parameters.Add("@IpAddress", SqlDbType.NVarChar).Value = txtClientIp.Text
        cmdupdate.Parameters.Add("@responseStatus", SqlDbType.NVarChar).Value = txtResponseStatus.Text
        cmdupdate.Parameters.Add("@ticketNo", SqlDbType.NVarChar).Value = txtTicketNo.Text
        cmdupdate.Parameters.Add("@columnName", SqlDbType.NVarChar).Value = Columnvalue '//column name
        cmdupdate.Parameters.Add("@editData", SqlDbType.NVarChar).Value = txtEditdata.Text '//Data we give

        adapter = New SqlDataAdapter(cmdupdate)

        adapter.Fill(table)
        adapter.Update(table)
        DataGridView1.DataSource = table
        'adapter.Fill(table)
        'table.Clear()


        'cmdupdate.CommandText = "select * from tblWebaccessErrorTrack" 'where IssueDateTime between @frmdate and @todate and ErrorDetails like '%' + @errorDetails + '%' and  ClientIpaddress like '%'+ @IpAddress + '%' and ResponseStatus like '%'+ @responseStatus + '%' and TicketNo like '%' + @ticketNo + '%'"
        'adapter = New SqlDataAdapter(cmdupdate)
        'adapter.Fill(table)
        'adapter.Update(table)
        'DataGridView1.DataSource = table
        ''adapter.Fill(table)
        ''cmdupdate.Parameters.Clear()
        'table.Clear()
        connection.Close()
        cmd.Parameters.Clear()

    End Sub`enter code here`
  • символ ('), присутствующий перед какой-либо строкой, представляет строку комментария.

1 Ответ

1 голос
/ 06 января 2020

Будет проще, если код будет разбит на более мелкие части, каждый из которых будет выполнять одно действие. Это упрощает понимание и обновление кода. Таким образом, методы для обновления столбца и отображения DGV будут отдельными.

Для SQL, пожалуйста, обратите внимание, что плохая идея иметь только одно соединение SQL, которое будет использоваться повторно. Существует механизм под названием пул соединений , который упрощает правильный способ выполнения запроса: создайте соединение, используйте соединение, избавьтесь от соединения.

Если вы хотите использовать переменную для имени столбца, вам нужно объединить ее в запрос SQL. Это открыто для SQL внедрения, поэтому необходимо убедиться, что используется допустимое имя столбца, прежде чем что-либо с ним делать.

Для DateTimePickers значение, которое нужно использовать, это .Value, а не .Text, в противном случае могут возникнуть проблемы с другими Windows настройками / языковым стандартом.

Итак, этот код является отправной точкой для того, чтобы заставить его работать:

Private Function IsValidColumnName(colName As String) As Boolean
    'TODO: Put the valid column names in the array.
    Dim validColumnNames = {"Col1", "Col2", "ColWhatever"}
    Return validColumnNames.Any(Function(c) colName = c)

End Function

Private Sub UpdateDataInColumn(columnName As String, newData As String)
    If Not IsValidColumnName(columnName) Then
        Throw New Exception("Invalid column name [" & columnName & "]")
    End If

    Dim sql = "UPDATE tblWebaccessErrorTrack SET [" & columnName & "] & = @editData WHERE IssueDateTime BETWEEN @frmdate AND @todate AND ErrorDetails LIKE @errorDetails AND ClientIpaddress LIKE @IpAddress AND ResponseStatus LIKE @responseStatus AND TicketNo LIKE @ticketNo"

    Using conn As New SqlConnection("Your connection string"),
            cmdupdate As New SqlCommand(sql, conn)

        cmdupdate.Parameters.Add("@frmdate", SqlDbType.DateTime).Value = frm_DateTimePicker.Value
        cmdupdate.Parameters.Add("@todate", SqlDbType.DateTime).Value = to_DateTimePicker.Value
        cmdupdate.Parameters.Add("@errorDetails", SqlDbType.NVarChar).Value = "%" + txtErrorDetails.Text & "%"
        cmdupdate.Parameters.Add("@IpAddress", SqlDbType.NVarChar).Value = "%" + txtClientIp.Text & "%"
        cmdupdate.Parameters.Add("@responseStatus", SqlDbType.NVarChar).Value = "%" + txtResponseStatus.Text & "%"
        cmdupdate.Parameters.Add("@ticketNo", SqlDbType.NVarChar).Value = "%" + txtTicketNo.Text & "%"
        cmdupdate.Parameters.Add("@editData", SqlDbType.NVarChar).Value = newData '//Data we give

        Dim nChanged = cmdupdate.ExecuteNonQuery()

        If nChanged > 1 Then
            ' More than one row was updated. This is probably a Big Problem.
        End If

    End Using

End Sub

Private Sub ShowDataGridView()
    'TODO: write the ShowDataGridView() sub.
End Sub

Private Sub btn_Update_Click(sender As Object, e As EventArgs) Handles btn_Update.Click
    Dim colName = "Some method to select a column would go here."
    Dim newData = txtEditdata.Text

    UpdateDataInColumn(colName, newData)
    ShowDataGridView()

End Sub
...