Запрос к базе данных не возвращает результаты из значения - PullRequest
0 голосов
/ 20 апреля 2020

Я создаю систему управления работами и довольно плохо знаком с Visual Basi c.

Я пытаюсь получить имя сотрудника из базы данных с заданным идентификатором. После этого я хочу, чтобы это имя отображалось в метке. После этого он может нажимать кнопки «Начало работы» или «Окончание работы».

Вот код:

Private Function employeeSearchwithID(PersonalNr As String) As String

    Dim mitarbeiter As String
    Dim r As DataRow

    Access.ExecQuery("SELECT [Vorname], [Name] from [TA-Personal] WHERE ([Personal_Nr] = '" & PersonalNr & "');")

    'Report and Abort on Erros or no Records found
    If NoErros(True) = False Or Access.RecordCount < 1 Then Exit Function

    r = Access.DBDT.Rows(0)

    'Populate Label with Data
    mitarbeiter = r.Item("Vorname") & " " & r.Item("Name")

    Return mitarbeiter

End Function

Используется так:

Private Sub tbxUserInput_KeyDown(sender As Object, e As KeyEventArgs) Handles tbxUserInput.KeyDown
    If e.KeyCode = Keys.Enter Then 'employeeIDnumbersSelect()
        Label5.Text = employeeSearchwithID(tbxUserInput.ToString)
    End If
End Sub

Так планируется запустить эту программу на планшете, подключенном к сканеру. У каждого сотрудника будет личная карточка. Когда они сканируют карту, я хочу, чтобы их имена отображались. Конечно, карточка будет с удостоверением личности. Но у меня проблемы с именами: когда я даю свой личный номер, он выглядит как пустая строка.

У меня есть отдельный модуль БД. Я узнал из учебника:

Imports System.Data.OleDb

Public Class DBControl
    ' DB Connection 
    Public DBCon As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=D:\recycle2000.mdb;")

    'DB Command
    Public DBCmd As OleDbCommand

    'DB Data
    Public DBDA As OleDbDataAdapter
    Public DBDT As DataTable
    'Public Myreader As OleDbDataReader = DBCmd.ExecuteReader

    'Query Paramaters
    Public Params As New List(Of OleDbParameter)

    ' Query Stats
    Public RecordCount As Integer
    Public Exception As String

    Public Sub ExecQuery(Query As String)
        'Reset Query Stats
        RecordCount = 0
        Exception = ""

        Try
            'Open a connection
            DBCon.Open()

            'Create DB Command
            DBCmd = New OleDbCommand(Query, DBCon)

            ' Load params into DB Command
            Params.ForEach(Sub(p) DBCmd.Parameters.Add(p))

            ' Clear params list
            Params.Clear()

            ' Execute command & fill Datatable
            DBDT = New DataTable
            DBDA = New OleDbDataAdapter(DBCmd)
            RecordCount = DBDA.Fill(DBDT)

        Catch ex As Exception

            Exception = ex.Message

        End Try

        ' Close your connection
        If DBCon.State = ConnectionState.Open Then DBCon.Close()

    End Sub

    ' Include query & command params
    Public Sub AddParam(Name As String, Value As Object)

        Dim NewParam As New OleDbParameter(Name, Value)
        Params.Add(NewParam)

    End Sub

End Class

1 Ответ

0 голосов
/ 20 апреля 2020

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

Private Function EmployeeSearchwithID(personalNr As String) As String

    Dim mitarbeiter As String = String.Empty

    Dim sql = "SELECT [Vorname], [Name] from [TA-Personal] WHERE [Personal_Nr] = ?;"

    Using conn As New OleDbConnection("your connection string"),
           cmd As New OleDbCommand(sql, conn)

        cmd.Parameters.Add(New OleDbParameter With {.ParameterName = "@PersonalNr",
                                                    .OleDbType = OleDbType.VarChar,
                                                    .Size = 12,
                                                    .Value = personalNr})

        conn.Open()
        Dim rdr = cmd.ExecuteReader()

        If rdr.Read() Then
            mitarbeiter = rdr.GetString(0) & " " & rdr.GetString(1)
        End If

    End Using

    Return mitarbeiter

End Function

Private Sub tbxUserInput_KeyDown(sender As Object, e As KeyEventArgs) Handles tbxUserInput.KeyDown
    If e.KeyCode = Keys.Enter Then 'employeeIDnumbersSelect()
        Dim employeeName = EmployeeSearchwithID(tbxUserInput.Text.Trim())

        If String.IsNullOrEmpty(employeeName) Then
            MessageBox.Show("Not found.", "Problem", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
        Else
            Label5.Text = employeeName
        End If

    End If

End Sub

Команда Using гарантирует, что «неуправляемые ресурсы», задействованные в запросах к базе данных, впоследствии очищаются, даже если что-то идет не так.

Вам потребуется изменить значения OleDbType.VarChar и .Size = 12, чтобы они соответствовали типу и размеру этого столбец в базе данных.

Имя параметра только для удобства с OleDb, потому что оно игнорируется в реальном запросе, который использует "?" в качестве заполнителя. Пожалуйста, смотрите Свойство OleDbCommand.Parameters для полной информации.

Если это все еще не работает, пожалуйста, введите идентификатор вручную в tbxUserInput и посмотрите, сможете ли вы заставить его работать таким образом .

Подожди ... tbxUserInput.ToString должно быть tbxUserInput.Text. Но все остальное, что я написал, остается в силе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...