#vb.net
Вопрос:
Попытка обновить старое приложение VB^ до VB.Net. По-моему, у меня проблемы с синтаксисом. В любом случае это простой вопрос вставки новой записи в таблицу автолога. (код ниже).
Я хотел бы спросить кое-что еще, что тоже часто не документируется. Кажется, что я должен использовать сборщики команд и так далее — неужели я не могу просто использовать инструкцию SQL и выполнить ее в фоновой таблице? Таблицы доступны, пока я разрабатываю, но будут расширены в окончательном выпуске программного обеспечения.
Я изменил свой код на следующий, используя предложения об ошибках в нижней части mygui.
Теперь это выглядит так, и единственное, что вызывает у меня логическую ошибку, которая заключается в том, что каждая конечная функция должна иметь предшествующую «функцию», Возможно, я немного туповат
Функция MAutolog(Действие ByVal В Виде Строки) В Виде Логического Dim SQL = «Вставить В Автолог (Действие) Значения (@Действие)» Используя con В качестве Нового соединения OLEDB(«Поставщик=Microsoft.ACE.OLEDB.12.0;Источник данных=C:ПользователиПользователь ПКДокументыFreightmasterресурсыfreightmaster.accdb»), cmd В качестве Новой команды OleDb.oledb(SQL, con) cmd.Параметры.Добавить(«@Действие», OleDb.OleDbType.VarChar).Значение = Действие con.Откройте() cmd.ExecuteNonQuery() Завершает использование
MAutolog = True
End Function
Я хотел бы заранее поблагодарить вас за вашу помощь. Я не могу сказать вам, насколько я буду вам признателен.
Код
Module ModFunctions
Function MAutolog(ByVal UserID As Long, ByVal Action As String) As Boolean
Dim dbprovider As String
Dim dbsource As String
Dim mydocumentsfolder As String
Dim fulldatabasepath As String
Dim TheDatabase As String
Dim SQL As String
Dim DS As New DataSet
Dim da As OleDb.OleDbDataAdapter
Dim con As New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:UsersPC UserDocumentsFreightmasterresourcesfreightmaster.accdb")
con.Open()
'----------------------------
SQL = "Select * from Autolog"
da = New OleDb.OleDbDataAdapter(SQL, con)
da.Fill(DS, "Log")
con.Close()
Dim CB As New OleDb.OleDbCommandBuilder(da)
Dim DSNEWROW As DataRow
DSNEWROW = DS.Tables("Log").NewRow()
DSNEWROW.Item("UserID") = UserID
DSNEWROW.Item("Action") = Action
DS.Tables("log").Rows.Add(DSNEWROW)
da.Update(DS, "log")
MAutolog = True
End function
Комментарии:
1. Является ли идентификатор пользователя полем автоматического ввода номера?
Ответ №1:
Объекты базы данных любят Connection
и Command
используют неуправляемый код и нуждаются в своих Dispose
методах для высвобождения этих ресурсов. Либо вызовите этот метод для этих объектов, либо используйте Using...End Using
блоки, которые сделают это за вас, даже если произойдет ошибка. В этом коде оба Connection
и Command
включены в Using
блок, разделяя их запятой.
By Val
является значением по умолчанию, поэтому в этом нет необходимости.
Всегда используйте параметры, чтобы избежать sql-инъекции. Использование значений непосредственно из пользовательского ввода может привести к выполнению вредоносного кода в вашей базе данных. Значение параметра не рассматривается базой данных как исполняемый код.
OleDb не заботится об именах параметров. Вы могли бы так же легко использовать ? в инструкции sql. Я использую имена для удобства чтения. Вам действительно нужно какое-то имя, чтобы добавить параметр. OleDb учитывает положение параметра в инструкции sql. Позиция должна соответствовать порядку добавления параметров в коллекцию параметров.
Это код для вставки if UserID
в поле автоматического номера. Вы не указываете значение для полей автоматического нумерации. База данных справится с этим.
Function MAutolog(Action As String) As Boolean
Dim SQL = "Insert Into Autolog (Action) Values (@Action)"
Using con As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:UsersPC UserDocumentsFreightmasterresourcesfreightmaster.accdb"),
cmd As New OleDbCommand(SQL, con)
cmd.Parameters.Add("@Action", OleDbType.VarChar).Value = Action
con.Open()
cmd.ExecuteNonQuery()
End Using
MAutolog = True
End Function
Если идентификатор пользователя не является автоматическим номером
Function MAutolog(UserID As Long, Action As String) As Boolean
Dim SQL = "Insert Into Autolog (UserID, Action) Values (@UserID, @Action)"
Using con As New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:UsersPC UserDocumentsFreightmasterresourcesfreightmaster.accdb"),
cmd As New OleDbCommand(SQL, con)
cmd.Parameters.Add("@UserID", OleDbType.Integer).Value = UserID
cmd.Parameters.Add("@Action", OleDbType.VarChar).Value = Action
con.Open()
cmd.ExecuteNonQuery()
End Using
MAutolog = True
End Function
Комментарии:
1. @ChrisJTaverner Если мой ответ был полезен, пожалуйста, примите его, нажав на галочку (галочку) слева от ответа. Это поможет будущим читателям, заработает мне несколько повторений и принесет вам 2 балла.