KD209 Ответов: 1

Vb.net проверьте DB на наличие значения, а затем запустите оператор IF


У меня есть проблема с запуском запроса "Select data from DB where data = textbox AND dbdata = True" запрос необходим для проверки того, равны ли данные из текстового поля результату запроса. Если оно истинно или равно, то запустите оператор if, чтобы показать сообщение об ошибке и остановить выполнение остальной части скрипта или просто выйти или закрыть.

Если это имеет смысл....

Я пробовал использовать оператор USING с функциями OleDBDataReader, но безуспешно...

Оператор if будет выглядеть примерно так:

Если assestbarcode. text = query, то me. close messagebox. show("этот элемент уже проверен")

Я удалил все, что пробовал, и оставил только код, который записывает данные в БД, который должен запускаться только в том случае, если оператор if ложен.

Что я уже пробовал:

Private Sub CheckOut_Click_1(sender As Object, e As EventArgs) Handles CheckOut.Click

    Dim str As String
    str = "INSERT INTO TrackingInfo (EmployeeName, AssetName, BadgeNumber, AssetBarcode, CheckedOut, DateNTime) values (DisplayName, AssetName, ChkOutBadge, ChkOutBarcode, True, TimeStamp)"

    Dim cmd As OleDbCommand = New OleDbCommand(str)

    cmd.Connection = objConn

    Try

        objConn.Open()

        cmd.Parameters.Add(New OleDbParameter("EmployeeName", CType(Me.Controls("Displayname").Text, String)))
        cmd.Parameters.Add(New OleDbParameter("AssetName", CType(Me.Controls("DisplayAsset").Text, String)))
        cmd.Parameters.Add(New OleDbParameter("BadgeNumber", CType(Me.Controls("ChkOutBadge").Text, String)))
        cmd.Parameters.Add(New OleDbParameter("AssetBarcode", CType(Me.Controls("ChkOutBarcode").Text, String)))
        cmd.Parameters.Add(New OleDbParameter("DateNTime", CType(Me.Controls("TimeStamp").Text, String)))

        cmd.ExecuteNonQuery()
        cmd.Dispose()
        objConn.Close()

        MsgBox("Loaner has been checked out successfully")

    Catch ex As Exception

        MsgBox(ex.Message)

    End Try

KD209

Вот код, который я пытался использовать, чтобы получить желаемый результат:

Dim fetchstr As String = connStr
Dim fetchconn As OleDbConnection = New OleDbConnection(fetchstr)
Дим cmdfetch как объект oledbcommand = новый объект oledbcommand()
Дим принести как String = "выбрать AssetBarcode от активов, где AssetBarcode = ChkOutBarcode и взяты для изменения = истина"
- cmdfetch.Свойства commandtext = "выбрать AssetBarcode от активов, где AssetBarcode = ChkOutBarcode и взяты для изменения = истина"

фетчконн.Открыть()

cmdfetch = New OleDbCommand(fetch, fetchconn)
cmdfetch.Параметры.AddWithValue ("AssetBarcode", ChkOutBarcode.Текст)

cmdfetch.Метод executenonquery()
фетчконн.Закрывать()

Если cmdfetch.ExecuteNonQuery > 0 затем
Ящик для сообщений.Показать ("этот пункт уже был проверен. Пожалуйста, предупредите члена команды Службы Поддержки.")
Меня.Рядом()
Конец, Если

Richard Deeming

Попробуйте использовать вопросительный знак в качестве заполнителя параметра:

Select AssetBarcode from Assets Where AssetBarcode = ? AND CheckedOut = True

Richard Deeming

Ты тоже пытаешься позвонить ExecuteNonQuery дважды, и второй раз-это после вы закрыли связь. Это не сработает. Вам нужно сохранить результат первого вызова в переменной, а затем протестировать эту переменную в вашем компьютере. If блок.

KD209

Я переписал код, но теперь я получаю ошибку о том, что " ExecuteReader не был инициализирован"

Код:

Dim fetchstr As String = connStr
Dim fetchconn As OleDbConnection = New OleDbConnection(fetchstr)
Дим cmdfetch как объект oledbcommand = новый объект oledbcommand()
Dim fetch As String = " Select AssetBarcode from Assets Where AssetBarcode = ? И взяты для изменения = истина"

фетчконн.Открыть()

cmdfetch.Параметры.AddWithValue ("AssetBarcode", OleDbType.VarChar).Значение = ChkOutBarcode

Дим fetchreader как и oledbdatareader = cmdfetch.Метода executereader()

А fetchreader.Читать()

Если ChkOutBarcode.Text = (fetchreader ("AssetBarcode")) Затем

Ящик для сообщений.Показать ("товар уже проверен. Пожалуйста, сообщите об этом в Службу поддержки")

Меня.Рядом()

Конец, Если

Конец Пока

fetchreader.Закрывать()
фетчконн.Закрывать()

Richard Deeming

Вы не установили команду Connection собственность.

Вы также должны обернуть объекты connection, command и reader в Using блоки и используйте сравнение строк без учета регистра, чтобы проверить, равны ли строки.

Using fetchconn As New OleDbConnection(connStr)
    Using cmdfetch As New OleDbCommand()
        cmdfetch.Connection = fetchconn
        cmdfetch.CommandText = "Select AssetBarcode from Assets Where AssetBarcode = ? AND CheckedOut = True"
        cmdfetch.Parameters.AddWithValue("AssetBarcode", OleDbType.VarChar).Value = ChkOutBarcode
        
        fetchconn.Open()
        Using fetchreader As OleDbDataReader = cmdfetch.ExecuteReader(CommandBehavior.CloseConnection)
            While fetchreader.Read()
                If String.Equals(ChkOutBarcode.Text, fetchreader("AssetBarcode"), StringComparison.OrdinalIgnoreCase) Then
                    MessageBox.Show("Item has already been checked out. Please inform the Helpdesk")
                    Me.Close()
                    Return
                End If
            End While
        End Using
    End Using
End Using

KD209

При использовании функций Using я все еще сталкиваюсь с ошибкой "нет значения для одного или нескольких требуемых параметров." Я предполагаю, что результат запроса все еще не захватывается для запуска оператора if.

Richard Deeming

Извините, я пропустил ту часть, где вы пытались пройти весь курс. ChkOutBarcode управление как значение параметра, а не его текст!

cmdfetch.Parameters.AddWithValue("AssetBarcode", OleDbType.VarChar).Value = ChkOutBarcode.Text

KD209

Я все еще получаю ту же ошибку исключения:

- Система ... Данные.Oledb. OleDbException был необработан
Код ошибки=-2147217904
Значение HRESULT=-2147217904
Сообщение=Нет значения для одного или нескольких обязательных параметров.
Источник=Microsoft Access Database Engine
Трассировка стека:
в системе.Данных.Oledb для.Объект oledbcommand.ExecuteCommandTextErrorHandling(OleDbHResult hr)
в системе.Данных.Oledb для.Объект oledbcommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult)
в системе.Данных.Oledb для.Объект oledbcommand.ExecuteCommandText(Object& executeResult)
в системе.Данных.Oledb для.Объект oledbcommand.ExecuteCommand(CommandBehavior behavior, Object&executeResult)
в системе.Данных.Oledb для.Объект oledbcommand.ExecuteReaderInternal(поведение CommandBehavior, строковый метод)
в системе.Данных.Oledb для.Объект oledbcommand.ExecuteReader(CommandBehavior поведение)
в WindowsApplication1.DMNDTracker.CheckOut_Click_1 (отправитель объекта, EventArgs e) in C:\Users\KDavis\Documents\Visual Studio 2013\Projects\CheckOutSystem\CheckOutSystem\Form1.vb: строка 115
в системе.Окна.Формы.Контроль.OnClick(EventArgs e)
в системе.Окна.Формы.Кнопка.OnClick(EventArgs e)
в системе.Окна.Формы.Кнопка.OnMouseUp(MouseEventArgs mevent)
в системе.Окна.Формы.Контроль.WmMouseUp(Message& m, кнопка MouseButtons, Int32 клика)
в системе.Окна.Формы.Контроль.WndProc (Message& m)
в системе.Окна.Формы.ButtonBase.WndProc (Message& m)
в системе.Окна.Формы.Кнопка.WndProc (Message& m)
в системе.Окна.Формы.Контроль.ControlNativeWindow.OnMessage (Message& m)
в системе.Окна.Формы.Контроль.ControlNativeWindow.WndProc (Message& m)
в системе.Окна.Формы.Родное окно.DebuggableCallback(hwnd элемента указателя IntPtr, int32 и глутамат натрия, указателя IntPtr параметр wparam, указателя IntPtr lparam должен)
в системе.Окна.Формы.Небезопасные методы.DispatchMessageW(MSG& msg)
в системе.Окна.Формы.Приложение.ComponentManager.Система.Окна.Формы.Небезопасные методы.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
в системе.Окна.Формы.Приложение.ThreadContext.RunMessageLoopInner(типа int32 причина, ApplicationContext контексте)
в системе.Окна.Формы.Приложение.ThreadContext.RunMessageLoop(типа int32 причина, ApplicationContext контексте)
в корпорации Microsoft.На языке VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
в корпорации Microsoft.На языке VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
в корпорации Microsoft.На языке VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Выполнить(строка[] командной строки)
в в windowsapplication1.Мой.Мое_приложение.Main (String[] Args) в 17d14f5c-a337-4978-8281-53493378c1071.vb: строка 81
в системе.AppDomain. _nExecuteAssembly (сборка RuntimeAssembly, String[] args)
в системе.Домен приложений.nExecuteAssembly(RuntimeAssembly ассамблеи, string[] аргументы)
в System. Runtime.Принимающий.ManifestRunner. Run(Boolean checkAptModel)
в System. Runtime.Принимающий.Манифестраннер.ExecuteAsAssembly()
в System. Runtime.Принимающий.ApplicationActivator.CreateInstance(ActivationContext activationContext, String[] activationCustomData)
в System. Runtime.Принимающий.ApplicationActivator.Метод createinstance(ActivationContext activationContext)
в системе.Активатор.Метод createinstance(ActivationContext activationContext)
в корпорации Microsoft.VisualStudio.Хостингпроцесс.HostProc.RunUsersAssemblyDebugInZone()
в системе.Нарезание резьбы.ThreadHelper.ThreadStart_Context(состояние объекта)
в системе.Нарезание резьбы.Параллельном режиме.RunInternal(параллельном режиме параллельном режиме, ContextCallback обратного вызова, состояние объекта, логическое preserveSyncCtx)
в системе.Нарезание резьбы.Параллельном режиме.Выполнения(в параллельном режиме параллельном режиме, ContextCallback обратного вызова, состояние объекта, логическое preserveSyncCtx)
в системе.Нарезание резьбы.ExecutionContext. Run(ExecutionContext executionContext, ContextCallback callback, состояние объекта)
в системе.Нарезание резьбы.ThreadHelper.ThreadStart()
Свойство innerexception: "

Richard Deeming

Вы передаете неправильное значение AddWithValue:

cmdfetch.Parameters.AddWithValue("AssetBarcode", ChkOutBarcode.Text)

Вы также можете попробовать использовать 1 вместо True в запросе.

И убедитесь в этом ChkOutBarcode.Text иметь ценность.

KD209

Я решил, что это вызовет у меня проблемы. Я исправил это, но код по-прежнему выдает ошибку: "нет значения для одного или нескольких требуемых параметров" в строке: "Using fetchreader As OleDbDataReader = cmdfetch.ExecuteReader(CommandBehavior.Значение closeconnection)"

Также,

Поле/столбец базы данных - это поле Да/нет, будут ли целые числа 1 или 0 работать одинаково?

Richard Deeming

Я никогда не могу вспомнить, как Access обрабатывает логические столбцы! Быстрый тест показывает, что нет, 1 не получится. Вам нужно использовать True вместо.

То "никакой ценности не дано" ошибка возникает, когда вы неправильно пишете имя столбца. Вы абсолютно уверены, что ваш Assets таблица содержит столбцы, называемые AssetBarcode и CheckedOut?

KD209

Ричард, будь ты сейчас здесь, ты бы меня задушил. Мне нужно было запустить запрос к таблице "TrackingInfo", ХА-ХА-ХА! Сейчас все работает.

Последний вопрос, который у меня есть, - как я могу позволить форме повторно инициализироваться вместо того, чтобы делать me.close()?

Richard Deeming

Это всегда простые вещи! :Д

Вам просто нужно написать метод для сброса элементов управления в исходное состояние и вызвать этот метод вместо Close Насколько легко это сделать, будет зависеть от того, насколько сложна ваша форма.

KD209

Понял! Спасибо за всю помощь, я действительно ценю это.

Можете ли вы вставить код в поле решения, чтобы я мог сделать его решенным/отвеченным?

1 Ответов

Рейтинг:
12

Richard Deeming

Решение из комментариев:

Using fetchconn As New OleDbConnection(connStr)
    Using cmdfetch As New OleDbCommand()
        cmdfetch.Connection = fetchconn
        cmdfetch.CommandText = "Select AssetBarcode from TrackingInfo Where AssetBarcode = ? AND CheckedOut = True"
        cmdfetch.Parameters.AddWithValue("AssetBarcode", ChkOutBarcode.Text)
        
        fetchconn.Open()
        Using fetchreader As OleDbDataReader = cmdfetch.ExecuteReader(CommandBehavior.CloseConnection)
            While fetchreader.Read()
                If String.Equals(ChkOutBarcode.Text, fetchreader("AssetBarcode"), StringComparison.OrdinalIgnoreCase) Then
                    MessageBox.Show("Item has already been checked out. Please inform the Helpdesk")
                    Me.Close() ' Or your custom method to reset the form...
                    Return
                End If
            End While
        End Using
    End Using
End Using

Как было предложено в ваш последующий вопрос[^], проверка в коде является избыточной. Вы можете упростить это до:
Using fetchconn As New OleDbConnection(connStr)
    Using cmdfetch As New OleDbCommand()
        cmdfetch.Connection = fetchconn
        cmdfetch.CommandText = "Select CheckedOut from TrackingInfo Where AssetBarcode = ?"
        cmdfetch.Parameters.AddWithValue("AssetBarcode", ChkOutBarcode.Text)
        
        fetchconn.Open()
        
        Dim result As Object = cmdfetch.ExecuteScalar()
        
        If result Is Nothing Then
            MessageBox.Show("This item does not exist. Please inform the Helpdesk")
            Me.Close()
            
        Else If CBool(result) Then
            MessageBox.Show("This item has already been checked out. Please inform the Helpdesk")
            Me.Close()
        End If
    End Using
End Using