在C#中使用数据库需要一些帮助

时间:2010-11-28 21:17:40

标签: c# sql oledb

我有一个包含两个表的数据库。这两个表都是相关的,并且具有相同的关键字段。例如,它们都具有对应于ISBN = 12345的数据行,但是这两个表具有关于该ISBN的不同数据。

所以,我正在试图弄清楚如何将两个表中的数据显示到一个dataGridView中。我尝试过在网上找到的一些SQL命令,但看起来C#中的命令可能与普通的SQL查询不同。

假设table1具有以下字段:ISBN,颜色,大小和table2具有ISBN,weight字段。

我需要一种在数据网格视图中显示ISBN,颜色,大小,重量的方法。我想我必须以某种方式用适配器来做这件事。我可以单独连接并对表进行查询,并在datagridview中显示数据,但我无法弄清楚如何混合来自两个单独表的数据。

如果你有一个很好的资源我可以读到这个我很想拥有它,我的google-fu让我失望。

以下是我现在可以使用我的数据库做的一些示例:

    private void Form1_Load(object sender, EventArgs e)
    {
        // TODO: This line of code loads data into the 'database1DataSet.Book' table. You can move, or remove it, as needed.
        this.bookTableAdapter.Fill(this.database1DataSet.Book);
        string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + @"C:\Users\Geoff\Documents\cs 351\Database1.accdb" + ";Persist Security Info=False;";
        OleDbConnection conn = new OleDbConnection(connectionString);
        string query = "select * from Book where ISBN = 12345";
        OleDbCommand com = conn.CreateCommand();
        com.CommandText = query;
        OleDbDataAdapter adapter = new OleDbDataAdapter(com);
        DataSet data = new DataSet();
        conn.Open();
        adapter.Fill(data);

        conn.Close();
        dataGridView1.DataSource = data.Tables[0];
    }

所以,基本上,我想做我上面所做的事情,但我也希望包含来自不同表格的数据。另一个表还有一个关键字段ISBN,它包含与第一个表匹配的ISBN值。

3 个答案:

答案 0 :(得分:3)

查看使用JOIN从两个表格JOIN返回结果ON一些常见值

另见

对C#或OLEDB没有任何限制 - 它是基本的SQL。


有关您所询问的内容的详细信息,可能如下所示:

SELECT T1.ISBN, T1.color, T1.size, T2.weight
FROM table1 T1
  INNER JOIN table2 T2
    ON T1.ISBN = T2.ISBN
WHERE ISBN = '12345';

(没有必要将alias table1作为T1 - 我只是以此为例;在具有较长表名的更复杂查询中,您可能不希望一直重复表名称)

  • 由于ISBN出现在两个表中,因此必须在字段选择中明确限定;可以使用T1或T2,因为它们是相同的
  • 因为颜色,大小和重量都只出现在一张桌子上,所以它们不需要合格 - 但它不会受到伤害。

答案 1 :(得分:1)

var query       = "SELECT t1.isbn, t1.color, t1.size, t2.weight FROM table1 t1 JOIN table2 t2 ON t2.isbn = t1.isbn";
var connection  = new System.Data.SqlClient.SqlConnection("your SQL connection string here");
var dataAdapter = new System.Data.SqlClient.SqlDataAdapter(query, connection);
var dataSet     = new System.Data.DataSet();

dataAdapter.Fill(dataSet);

yourGridView.DataSource = dataSet;
yourGridView.DataBind();

这是许多解决方案之一。我认为如果您创建内存中的DataTable并使用SqlDataReader,代码可能会更快,但上面的示例更简单。

使用MSSQL数据库时,通常使用System.Data.SqlClient类。如果您 - 无论出于何种原因 - 使用OleDb,请从System.Data.OleDb命名空间中选择相应的对象。

答案 2 :(得分:0)

您可以使用UNION ALL

查询两个表中的记录
SELECT 'In table 1', book_author, book_title, book_isbn 
FROM books
WHERE book_isbn = '67890' 
UNION ALL
SELECT 'In table 2', othertable_author, othertable_title, othertable_isbn 
FROM othertable
WHERE othertable_isbn = '67890'

当然,您需要使用在您的情况下更方便的任何方法在两个地方手动填充'67890'。