2014-01-02 17 views
0

Я никогда не использовал запросы выбора с несколькими таблицами, которые были задействованы до и сейчас, когда я это делаю, у меня возникают проблемы с получением информации из DataTable.Загрузка DataTable с несколькими таблицами select query

У меня есть этот запрос:

SELECT * 
FROM [Usergroups], [Groups] 
WHERE [Usergroups.UserID] = @name 
    AND [Groups.GroupID] = [Usergroups.GroupID] 

И это, как я получаю возвращенные значения в DataTable:

DataTable groupsTable = new DataTable(); 
groupsTable.Load(sqlCmd.ExecuteReader()); 

Теперь, как я могу указать мой DataTable из какой таблицы я хочу взять строки из? Например, это то, что я делал раньше несколько таблиц, где участвуют:

string groupName = groupsTable.Rows[0]["Name"]; 

Я не мог найти какой-либо ресурс с такой информацией, но я знаю, что это основной вопрос. Заранее спасибо.

+2

Почему бы вам не использовать внутреннее соединение в SQL заявления? –

+1

[Плохие привычки пинать: использование JOIN в старом стиле] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins. aspx) - стиль старого стиля * разделенный запятыми список таблиц * был отменен с помощью ANSI - ** 92 ** SQL Standard (более ** 20 лет ** назад) –

ответ

6

В запросе в вашем вопросе не возникает, в результате, несколько таблиц.
Он создает ОБЪЕДИНЕНИЕ между двумя столами.

Как следствие, на стороне C# у вас нет двух таблиц, но только один, как и раньше, со всеми полями из обеих таблиц.

Как примечание стороны, лучший способ объединения таблиц вместе через использование JOIN заявления как этот

SELECT * -- a field list is better here --- 
FROM Usergroups ug INNER JOIN Groups g ON g.GroupID=ug.GroupID 
WHERE [email protected] 

и вы должны добавить, к ЗЕЬЕСТ, список полей, которые вы действительно заинтересованы.

SEE a simple JOIN reference

Если вы хотите, чтобы получить значения этих двух таблиц в отдельных DataTable объектов, то вам нужно использовать DataSet таким образом

DataSet ds = new DataSet(); 
DataTable dtUserGroups = new DataTable("UserGroups"); 
DataTable dtGroups = new DataTable("Groups"); 
ds.Tables.Add(dtUserGroups); 
ds.Tables.Add(dtGroups); 
using(SqlCommand cmd = new SqlCommand("SELECT * FROM UserGroups;SELECT * from Groups", con)) 
{ 
    using(SqlDataReader dr = cmd.ExecuteReader()) 
    { 
     ds.Load(dr, LoadOption.OverwriteChanges, dtUserGroups, dtGroups); 

     // Now you have the two tables filled and 
     // you can read from them in the usual way 

    } 
} 

Этот последний пример может дополнительно улучшить добавление объекта DataRelation к DataSet для представления взаимосвязи между двумя таблицами. Это может позволить вашему коду перемещаться по родительскому/дочернему набору записей.

2

Вы можете попробовать таким образом:

string query = "SELECT U.ID,U.NAME, C.NAME AS CUSTOMERNAME, C.DOB FROM USER U INNER JOIN CUSTOMER C ON U.ID = C.USERID" 
SqlConnection conn = new SqlConnection(_connectionString); 
SqlCommand cmd = new SqlCommand(query, conn); 
SqlDataAdapter adp = new SqlDataAdapter(cmd); 
DataTable dt = new DataTable(); 
adp.Fill(dt); 

Приведенный выше код вернет вам один DataTable с данными из разных таблиц говорят, «Пользователь» и «Клиент».

Надеюсь, теперь вы знаете, как получить доступ к данным из DataTable.

0

Лучше использовать JOIN для объединения нескольких таблиц, таких как INNER JOIN, LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL JOIN согласно вашим требованиям. Таким образом, когда вы используете INNER JOIN, он будет иметь столбцы из двух соединенных таблиц, т. Е., Если

tblA имеет а, б, в в качестве столбцов и

tblB имеет а, е, е в виде столбцов

то внутренний присоединился таблица будет иметь a, b, c, e, f в качестве своих столбцов.

Затем вы можете использовать так:

public DataTable LoadData() 
    { 
     DataTable dataTable; 
     string connString = @"your connection string here"; 
     string query = "SELECT * FROM Usergroups t1 INNER JOIN Groups t2 ON t2.GroupID=t1.GroupID WHERE [email protected]"; 

     SqlConnection conn = new SqlConnection(connString);   
     SqlCommand cmd = new SqlCommand(query, conn); 
     conn.Open(); 

     // create data adapter 
     SqlDataAdapter da = new SqlDataAdapter(cmd); 
     // this will query your database and return the result to your datatable 
     da.Fill(dataTable); 
     conn.Close(); 
     return dataTable; 
    } 

После получения DataTable, то вы можете использовать эту таблицу как:

DataTable dt = LoadDataClass.LoadData(); 
string groupName = dt.Rows[0]["Name"]; //For first row 

Я надеюсь, что вы получите.

0

в МОФ C#, этот метод может также использоваться для извлечения данных из нескольких таблиц

  try 
      { 
       using (SqlConnection conn = new SqlConnection(_pageDataBase.connectionString())) 
       { 
        conn.Open(); 

        DataTable dt = new DataTable(); 

        SqlDataAdapter Usergroups= new SqlDataAdapter("select *from Usergroups", conn); 
        Usergroups.Fill(dt); 

        SqlDataAdapter Groups= new SqlDataAdapter("select *from Groups", conn); 
        Groups.Fill(dt); 

        datagridName.ItemsSource = dt.DefaultView;  

       } 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 
Смежные вопросы