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
Понял! Спасибо за всю помощь, я действительно ценю это.
Можете ли вы вставить код в поле решения, чтобы я мог сделать его решенным/отвеченным?