VB.NET - 从 MySQL 数据库获取值并将其插入 Ms. Access (MDB) 数据库中



我想从MySQL导出数据库并将其导入Ms. Access (MDB)数据库。我尝试编写一个长 LoC 来处理将数据库导入 DataTable 变量并将值存储到其中。

这是我从MySQL上的数据库中获取值的代码adm_users

a_query = "SELECT * FROM adm_users where uac_code='4' or uac_code='4A' or uac_code='1'"
a_da = New MySqlDataAdapter(a_query, db_conn)
a_da.Fill(a_ds, "adm_users")
a_dt = a_ds.Tables("adm_users")

然后我想用这段代码将a_dt值存储到 MDB 数据库中

For x = 0 To a_dt.Rows.Count - 1
b_query = "INSERT INTO user_login
(userid, username, password, uac) VALUES
('" + a_dt.Rows(x).Item("userid") + "', '" + a_dt.Rows(x).Item("username") + "', '" + a_dt.Rows(x).Item("userpwd") + "', '2')"
b_sql = New OleDbCommand(b_query, ms_conn)
b_sql.ExecuteReader()
Next

然后尝试查找存储在b_query中的字符串查询,如下所示

INSERT INTO user_login
(userid, username, password, uac) VALUES
('admin', 'Varenicou', 'administrator', '2')

然后返回值为:"插入 INTO 语句中的语法错误" 我发现查询没有任何问题,所以我b_query变量替换为简单的查询,例如"SELECT FROM user_login",返回值为:"SELECT * FROM 语句中的语法错误">

也许我太笨了,无法问这个问题,但我的观点是 VB.NET 认为我已经打开了与MySQL数据库的连接,并且必须始终在MySQL数据库上。因此,当我使用 Ms. Access 打开数据库连接时,它会返回这样的值,VB.NET 混淆"你想使用哪个数据库?

有什么想法让我做这个任务吗? 我向我的朋友询问了一些建议,他说我需要与类一起工作,我还有另一个想法与另一个新项目合作,该项目通过首先将MySQL数据库导出为CSV来执行此任务以输入Ms. Access数据库。

编辑:

重读您的问题后,我可以告诉您,您遇到的特定问题是由于"密码"是 Jet/Access SQL 中的保留字。每当您想在 SQL 中使用保留字作为标识符时,都需要对其进行转义。 对于 Access,您可以通过将其括在括号中来做到这一点,例如

INSERT INTO user_login (userid, username, [password], uac)
VALUES (@userid, @username, @password, @uac)

不过,我下面的原始建议仍然有效。

源语言:

如果您有DataTable则不会循环访问它以保存数据。正如在数据适配器上进行单个Fill调用以检索数据一样,您进行单个Update调用以保存数据。当没有什么可读的时,打电话给ExecuteReader有什么意义?至少打电话给ExecuteNonQuery但即使这样也不理想。

如果要插入它包含的数据,则必须配置第二个数据适配器的InsertCommand。您还需要DataTable中的所有DataRows才能获得AddedRowState。为此,您只需在第一个数据适配器上将AcceptChangesDuringFill设置为False。 当您调用Fill时,它会添加所有行,因此它们的RowStateAdded。 然后它调用AcceptChanges,将所有RowStates设置为Unchanged。 告诉它不要打电话AcceptChanges,您就可以插入了。

下面是使用两个数据适配器从一个数据库获取数据并插入到另一个数据库中的示例:

Dim table As New DataTable
Using sourceAdapter As New MySqlDataAdapter("SELECT Column1, Column2 FROM MyTable",
"source connection string here") With {.AcceptChangesDuringFill = False}
sourceAdapter.Fill(table)
End Using
Using destinationConnection As New OleDbConnection("destination connection string here"),
destinationCommand As New OleDbCommand("INSERT INTO MyTable (Column1, Column2) VALUES (@Column1, @Column2)",
destinationConnection),
destinationAdapter As New OleDbDataAdapter With {.InsertCommand = destinationCommand}
With destinationCommand.Parameters
.Add("@Column1", OleDbType.VarChar, 50, "Column1")
.Add("@Column2", OleDbType.Integer, 0, "Column2")
End With
destinationAdapter.Update(table)
End Using

如您所见,这是相当简单的东西。 一个带SelectCommand的数据适配器和另一个带InsertCommand的数据适配器。 添加参数没有什么特别之处,但您首先需要了解参数。 如果您不知道如何将参数与 ADO.NET 一起使用,那么您应该立即学习。 你可以在这里找到我自己的解释。

最新更新