使用Data Reader访问两个数据库

时间:2012-03-27 12:15:19

标签: c# sql

我正在尝试使用ADO.NET开发应用程序。我在两个不同的数据库中有两个表。他们每个人都有一部分完整的数据。现在我需要编写一个查询,以便我能够从两个表中获取完整的记录。例如,表1具有Index_no,emp_ID和联系号。表2包含index_no,emp_name,salary和dept。 index_no对于每个表中的相同记录部分是相同的。 以下是获取薪水<20000。

的所有记录的代码
sqlCmd2 = new SqlCommand("SELECT * FROM table1 WHERE Index_No =@Index_No",
                         TestCon);
int i = 0; 
while (reader.Read()) {
    ListBox1.Items.Add(reader.GetInt32(0) + "  -   " + 
      reader.GetString(1) + "  -   " + reader.GetString(2));
    //  Name.Text += reader["Name"] + "<br />"; ;
    // Depart.Text += reader["Depart"] + "<br />"; ;
    array1[i] = reader.GetInt32(0);
    i++;
}

sqlCmd2.Parameters.Add("@Index_No", System.Data.SqlDbType.Decimal);
i = 0;
do {
    sqlCmd2.Parameters["@Index_No"].Value = array1[i];
    reader1 = sqlCmd2.ExecuteReader();
    reader1.Read();
    ListBox2.Items.Add(reader1.GetString(1));
    i++;
} while (i < array1.Length);

这个问题是我从table2只得到一个记录信息,而对于表1我得到了所有想要的记录信息。 do-while循环似乎只在一次迭代后终止。

2 个答案:

答案 0 :(得分:5)

这取决于两个不同的数据库意味着什么。如果两个数据库在同一个SQL Server上运行,则可以轻松访问其他数据库的表

 SELECT * FROM OtherDb.dbo.TableOnOtherDb

如果没有,我建议你在两个数据库之间创建一个数据库链接(参见问题How do I create and query linked database servers in SQL Server?)。然后你可以访问上面的另一个表。

在这两种情况下,您都可以使用JOIN查询来连接这两个表。那么你只需要一个数据阅读器

SELECT
    A.Index_no, A.emp_ID, A.contact_no,
    B.emp_name, B.salary, B.dept
FROM
    table1 A
    INNER JOIN table2 B
        ON A.Index_no = B.Index_no
WHERE
    B.salary < 20000
ORDER BY
    B.emp_name

更新

如果涉及的记录数量很少,那么如果由于某种原因无法链接这两个服务器,那么使用IN子句仅查询第二个表将会更有效率。

SELECT *
FROM table1
WHERE Index_no IN (4,12,17,30,112,167)

您可以像这样创建此SQL语句

string[] stringArray = array1
    .Select(i => i.ToString())
    .ToArray();
string list = String.Join(",", stringArray);
string sql = "SELECT * FROM table1 WHERE Index_No IN (" + list + ")";

执行第二个循环的惯用方法是(不是do while

for (int i = 0; i < array1.Length; i++) {
    ...
}

答案 1 :(得分:2)

为什么不编写一个连接两个存储并存回结果的存储过程?您可以使用链接服务器连接到第二个数据库,也可以使用dbname.tablename格式引用第二个数据库。