【问题标题】:Sql query containing 2 databases包含 2 个数据库的 Sql 查询
【发布时间】:2013-01-30 10:47:56
【问题描述】:

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

我可以在 VBA Access 中做到这一点,但是如何在 C# 中做同样的事情??

这就是我在 Access 中的制作方式:

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

在 VBA 中:

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

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

谢谢!

【问题讨论】:

  • 您需要指定数据库名称:dbname.dbo.tablename
  • 我需要什么对象/连接?
  • 您是否正在对 Access 数据库执行该 SQL?哪些表在 MySQL 数据库中?
  • DB1tblClient 是 Access,DB2tblClient 是 MySQL。此代码已在 Access 中运行。我想用 C# 做同样的事情谢谢!!

标签: c# mysql sql database ms-access


【解决方案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>();

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

【讨论】:

  • 大声谢谢!我是 C# 的新手,我什至认为在 C# 中进行像 sSQL = "INSERT INTO DB1tblClient SELECT * FROM DB2tblClient" 这样的简单查询并不难;)
【解决方案2】:

您应该能够从任何应用程序运行相同的 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)。

【讨论】:

  • 感谢您的代码!!!,在 Access 中它现在就这样工作......但是如果我不想使用 Access 在其中包含链接表而只使用 C#?大声笑令我惊讶的是,我们不能直接在 C# 中制作它!如果这在 C# 中不起作用,我可能会使用这种方法...
  • 我们不能在我们的项目中添加数据源,或者类似的东西(数据阅读器、数据集、数据表等)来使这个 SQL 工作?
  • @user2072536 我不确定你在问什么。
  • 我只是问我们是否可以像在 Access 中那样使用数据源来链接数据库/表(新手问题大声笑)。并在使用此数据源执行查询之后。
  • 但是我用你的方法做到了,而且效果很好!谢谢 !我很惊讶我们不能直接在 C# 中这样做;)再次感谢!
【解决方案3】:

那么,用单个语句来运行这种复杂的查询是不可能的。

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

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

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

【讨论】:

    【解决方案4】:

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

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

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

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

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

    DATABASE_NAME.SCHEMA_NAME.TABLE_NAME 而不仅仅是TABLE_NAME

    编辑

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

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

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

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

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

    【讨论】:

    • 好的。是的,两个表/数据库都可以访问。这是一些需要从 MySQL 更新他的表(Access)的技术人员。就像我说的,这项工作已经在 Access VBA 中。但我想消除 Access 并用 C# 制作这个软件。谢谢!!
    • 现在,我可以打开 2 个连接(我使用 OleDbConnection 和 OdbcConnection) coon.Open();和 oleConn.open();工作.. 现在我不知道要使用哪个对象或做什么来执行此 SQL。如果可以的话,你能在我的连接对象打开后给我看一小段代码来执行这个查询吗?谢谢!
    • 两个数据库之间是否有互通性?
    • 不,我只想从一个表(DB1)中获取数据并将其放入第二个表(DB2)中。一个是少数笔记本电脑上的本地(Access DB1)。这些人需要使用远程 MySQL (DB2) 上的数据更新他们的数据库 (DB1 Access)(在路上工作)。谢谢!
    • 您的“Database_name.Schema_name.table_name”对我来说似乎很棒...如何在 C# 中编写代码?我的意思是,我可能需要打开连接/链接,以便在查询中访问 Database_name.Schema_name.table_name ...(我的意思是需要数据读取器、新数据源、数据适配器??)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    • 2018-04-18
    相关资源
    最近更新 更多