10

In C# I want to execute a query that use 2 different databases (One is Access for local, and other is distant and is MySQL)

I'm able to do it in VBA Access, but how I can make the same thing in C# ??

This is how I made it in Access:

Link my 2 differents table/databases in Table

In VBA:

sSQL = "INSERT INTO DB1tblClient SELECT * FROM DB2tblClient"  
CurrentDb.Execute sSQL  

How I can execute this SQL in C# ? (What object to use, etc... Example code if you can)

Thanks !

4

4 回答 4

1

好吧,不可能用单个语句运行这种复杂的查询。

基本上每个查询执行对象都是由特定的数据库信息初始化的,所以每个数据库首先需要两个不同的对象。

现在需要用自己的连接对象初始化 2 个对象。

只需通过第一个对象获取数据并通过使用第二个连接对象将其插入另一个数据库。

于 2013-05-25T11:59:02.440 回答
1

你应该能够从任何应用程序运行相同的 SQL 命令,真的。这是假设:

  • 您正在从 C# 应用程序连接到 Access
  • DB1tblClient是一个本地访问表
  • DB2tblClient是Access中的链接表

鉴于这些,您可以尝试以下方法:

using (OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Stuff\MyAccessdb.mdb"))
{
    conn.Open();

    using (OleDbCommand cmd = conn.CreateCommand())
    {
        cmd.CommandText = "INSERT INTO DB1tblClient SELECT * FROM DB2tblClient";
        cmd.ExecuteNonQuery();
    }
}

如果您无法正确获取连接字符串,您可能需要检查connectionstrings.com ,并且您可能需要为使用这些提供程序的连接安装一些组件(MDAC 或 ACE)。

于 2013-02-14T15:31:24.167 回答
1

有两种方法可以做到这一点。一种是在 Access 上设置链接表并运行单个查询。另一种是从 c# 运行这两个查询并将它们与 linq 连接起来。

第一种方法更好。如果你真的必须用 linq 来做,这里有一些示例代码:

dWConnection.Open();
dWDataAdaptor.SelectCommand = dWCommand1;
dWDataAdaptor.Fill(queryResults1);
dWDataAdaptor.SelectCommand = dWCommand2;
dWDataAdaptor.Fill(queryResults2);
dWConnection.Close();

IEnumerable<DataRow> results1 = (from events in queryResults1.AsEnumerable()
                       where events.Field<string>("event_code").ToString() == "A01"
                       ||  events.Field<string>("event_code").ToString() == "ST"
                       select events ) as IEnumerable<DataRow>;


var results2 = from events1 in queryResults1.AsEnumerable()
    join events2 in queryResults2.AsEnumerable()
    on (string)events1["event_code"] equals (string)events2["event_code"]

    select new
            {
                  f1 = (string)events1["event_code"],
                  f2 = (string)events2["event_name"]
            };

DataTable newDataTable = new DataTable();
newDataTable = results1.CopyToDataTable<DataRow>();

明白为什么我说链接表更好了吗?

于 2013-02-14T15:35:11.243 回答
0

在尝试此类查询之前,您需要牢记以下几点

  1. 这两个数据库都可以从您的代码中访问。

  2. 两个数据库之间存在互连。

  3. 这两个数据库都可供您用来执行此查询的用户使用。

  4. 您需要按以下格式指定查询

DATABASE_NAME.SCHEMA_NAME.TABLE_NAME而不仅仅是TABLE_NAME

编辑

如果您没有数据库之间的互连,您可以按照以下步骤操作

  1. 使用一个连接到 Source 数据库connection

  2. 将源数据库中的数据读入datasetdatatable使用SELECT查询。

  3. 使用第二个连接到目标数据库connection

  4. INSERT使用标准查询使用循环将所有记录一一插入到目标数据库

于 2013-02-14T15:29:39.083 回答