Нужна помощь в работе с базами данных в C # - PullRequest
5 голосов
/ 29 ноября 2010

У меня есть база данных с двумя таблицами. Обе эти таблицы связаны и имеют одинаковое ключевое поле. Например, у них обоих есть строки данных, соответствующие ISBN = 12345, но две таблицы имеют разные данные об этом ISBN.

Итак, я пытаюсь выяснить, как отображать данные из обеих таблиц в один dataGridView. Я пробовал некоторые команды SQL, которые я нашел в Интернете, но похоже, что команды в C # могут отличаться от обычных запросов SQL.

Предположим, что таблица1 имеет следующие поля: ISBN, цвет, размер, а таблица2 имеет поля ISBN, вес.

Мне нужен способ отображения ISBN, цвета, размера, веса в моем представлении сетки данных. Я думаю, мне придется как-то сделать это с помощью адаптера. Я могу подключаться и выполнять запросы к таблицам по отдельности и показывать эти данные в моем видеосетях, но не могу понять, как смешивать данные из двух отдельных таблиц.

Если у вас есть хороший ресурс, который я могу прочитать об этом, я бы хотел получить его, мое Google-фу меня подводит.

Вот пример того, что я могу сделать сейчас с моей базой данных:

    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 ]

3 голосов
/ 29 ноября 2010

Изучите использование 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';

(нет необходимости псевдоним table1 как T1 - я только что сделал это в качестве примера; в более сложных запросах с более длинными именами таблиц вам может не потребоваться повторять имя таблицы все время)

  • с ISBNвстречается в обеих таблицах, он должен быть явно указан в ваших полях-выборках;Можно использовать T1 или T2, поскольку они идентичны
  • , поскольку цвет, размер и вес каждого элемента указаны только в одной таблице, их НЕ нужно квалифицировать, но это не повредит.
1 голос
/ 29 ноября 2010
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.

0 голосов
/ 29 ноября 2010

Вы можете запрашивать записи из обеих таблиц, используя 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' в обоих местах, используя любой метод, более удобный в вашей ситуации.

...