Привет, ребята. Я пытаюсь обновить приложение до VB dot net с vb6 и столкнулся с действительно основной проблемой. Я, конечно, добавлю код через секунду. Я

#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 балла.