首页 > 解决方案 > 嗨伙计。我正在尝试将应用程序从 vb6 更新到 VB dot net 并且遇到了一个非常基本的问题。当然,我会在一秒钟内添加代码。我

问题描述

尝试将旧的 VB^ 应用程序更新到 VB.Net。我觉得语法有问题。在任何情况下,向自动日志表中插入一条新记录都是一件简单的事情。(下面的代码)。

我想问一些通常也没有记录的其他问题。看来我必须使用命令生成器等等 - 我没有办法简单地使用 SQL 语句并针对后台表执行它吗?这些表在我开发时可以访问,但将在软件的最终版本中扩大。

通过使用 mygui 脚下的错误建议,我已将代码更改为以下内容。

现在看起来像这样,唯一的问题是它向我抛出了一个逻辑错误,即每个最终函数都必须有一个前面的“函数”也许我有点昏暗

Function MAutolog(ByVal 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:\Users \PC User\Documents\Freightmaster\resources\freightmaster.accdb"), cmd As New OleDb.OleDbCommand(SQL, con) cmd.Parameters.Add("@Action", OleDb.OleDbType.VarChar).Value = Action con. Open() 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:\Users\PC User\Documents\Freightmaster\resources\freightmaster.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

标签: vb.net

解决方案


数据库对象喜欢ConnectionCommand使用非托管代码,并且需要它们的Dispose方法来释放这些资源。在这些对象上调用此方法或使用Using...End Using即使出现错误也会为您执行此操作的块。在此代码中,ConnectionCommand都包含在Using块中,用逗号分隔它们。

By Val是默认值,所以没有必要。

始终使用参数来避免 sql 注入。直接使用来自用户输入的值可能允许恶意代码在您的数据库上执行。参数的值不被数据库视为可执行代码。

OleDb 不关心参数名称。您可以轻松使用 ? 在 sql 语句中。我使用名称是为了便于阅读。您确实需要某种名称来添加参数。OleDb 考虑参数在 sql 语句中的位置。位置必须与参数添加到参数集合的顺序相匹配。

这是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:\Users\PC User\Documents\Freightmaster\resources\freightmaster.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

如果 UserID 不是自动编号

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:\Users\PC User\Documents\Freightmaster\resources\freightmaster.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

推荐阅读