包含2个数据库的SQL查询

时间:2013-02-14 15:22:40

标签: c# mysql sql database ms-access

在C#中我想执行一个使用2个不同数据库的查询(一个是Access for local,另一个是远程的,是MySQL)

我能够在VBA Access中完成它,但是如何在C#中做同样的事情?

这就是我在Access中所做的:

在表

中链接我的2个不同的表/数据库

在VBA中:

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

如何在C#中执行此SQL? (使用什么对象等等......如果可以,请使用示例代码)

谢谢!

4 个答案:

答案 0 :(得分:1)

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

  • 您正在从C#app连接到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)。

答案 1 :(得分: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>();

看看为什么我说链接表更好?

答案 2 :(得分:1)

用单一语句运行这样复杂的查询是不可能的。

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

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

只需通过第一个对象获取数据,然后通过第二个连接对象将其插入另一个数据库。

答案 3 :(得分:0)

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

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

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

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

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

  5. DATABASE_NAME.SCHEMA_NAME.TABLE_NAME而非TABLE_NAME

    修改

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

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

    2. 使用dataset查询将源数据库中的数据读入datatableSELECT

    3. 使用秒connection连接到目标数据库。

    4. 使用循环将所有记录逐个插入TARGET数据库,使用标准INSERT查询