查询似乎有效,但实际上并不影响Access数据库

时间:2015-09-22 03:13:31

标签: vb.net database-connection oledb oledbcommand buildaction

我已将访问数据库添加到我的项目中作为数据源。所以我得到了自动生成的tableadapters类,因此可以访问包含连接字符串的表适配器实例。我使用它来打开与我的数据库的连接,所以我可以先删除一些记录,然后用新记录替换它们。 查询似乎有效,因为.executenonquery确实返回受影响的行。我甚至尝试了delete *命令。但是,当我打开数据库时,一切都是一样的。 我有一些关于原因的想法。我认为tableadapter返回的连接字符串可能很愚蠢,因为它包含指向项目数据目录的通用指针。

  

Provider = Microsoft.Jet.OLEDB.4.0; Data Source = | DataDirectory | \ DupeMDB.mdb; Persist Security Info = True

我也想过,我可能遇到了Build Action或Copy to Output Directory的问题。我真的不明白这两件事背后的机制。我想也许复制到输出目录的东西可能是罪魁祸首。

这是我的目标。我想将这个项目部署到我的秘书,这样她就可以使用该程序来处理重复的记录列表等。数据必须与程序一起使用。我希望将此 .mdf 文件打包到部署中,并在完成后将其从她身上取回。我在这里接近尾声(写回表)。有谁知道桌子为什么不会更新?

    Dim Connector As DupeTblTableAdapter = New DupeTblTableAdapter
    Dim Conn As New System.Data.OleDb.OleDbConnection
    Conn = Connector.Connection
    Conn.ConnectionString = Connector.Connection.ConnectionString
    MsgBox(Conn.ConnectionString)
    Dim Comm As System.Data.OleDb.OleDbCommand

    Conn.Open()
    For Each DR In DeleteRecords
        Comm = New System.Data.OleDb.OleDbCommand($"DELETE from DupeTbl where DupeTbl.CUST_NO={DR.ToString}", Conn) '
        Dim aff As Integer = Comm.ExecuteNonQuery
        'MsgBox(aff)
        Comm = Nothing
    Next
    For Each RR In ReplaceRecords
        Comm = New System.Data.OleDb.OleDbCommand($"INSERT INTO DupeTbl ( CUST_NO, PREDIR, POSTDIR, SUFFIX, CUSTSIZE, AddFlag, IgnoreRecord ) VALUES ({RR.Cust_No}, '{RR.PreDir}', '{RR.PostDir}', '{RR.Suffix}', {RR.Size}, {RR.AddFlag}, {RR.Ignore});", Conn)
        Comm.ExecuteNonQuery()
        Comm = Nothing
    Next

    Conn.Close()

2 个答案:

答案 0 :(得分:0)

   Dim Connector As DupeTblTableAdapter = New DupeTblTableAdapter
    Dim Conn As New System.Data.OleDb.OleDbConnection
    Conn = Connector.Connection
    Conn.ConnectionString = Connector.Connection.ConnectionString
    MsgBox(Conn.ConnectionString)
    Dim Comm As System.Data.OleDb.OleDbCommand

    Conn.Open()
    For Each UR In UpdateRecords
        Comm = New System.Data.OleDb.OleDbCommand($"UPDATE DupeTbl  SET CUST_NO = <NewValue>, PREDIR = <NewValue, POSTDIR = <NewValue> etc. where DupeTbl.CUST_NO={DR.ToString}", Conn) '
        Dim aff As Integer = Comm.ExecuteNonQuery
        'MsgBox(aff)
        Comm = Nothing
    Next

    Conn.Close()

答案 1 :(得分:0)

在这种情况下的问题通常是在每个构建上覆盖工作数据库。将本地数据文件添加到项目时,它将作为源文件添加到项目文件夹中。默认情况下,Copy to Output Directory属性设置为Copy Always。这意味着每次构建项目时,每次进行代码更改并默认运行项目时都会发生这种情况,源文件将被复制到输出文件夹中工作数据库的顶部,从而消除任何更改你在调试时做的。要防止这种情况,请将该属性更改为Copy if Newer,这意味着只有在对源数据库进行更改时才会覆盖工作数据库,例如:修改架构。