2013-11-22 2 views
0

Я работаю над школьным проектомSQL Внутренний отчет о присоединении в C#

Я хочу получить всю информацию о полосах, которая отлично работает. Пока я не попаду в жанры. Жанр немного особенный, потому что группа может иметь несколько жанров и наоборот.

Таким образом, в SQL у меня есть таблица Bands, таблица Жанр и таблица Band_Genre Если я сделать внутреннее соединение там

SELECT * 
FROM Band 
INNER JOIN Band_Genre 
     ON Band.ID = Band_Genre.BandID 

Все отлично работает в SQL, но когда я пытаюсь второго читателя с этим утверждением он возвращает null.

Но то, что я хочу сделать сейчас, заполняет datagrid самими жанрами, а не идентификаторами. Так что я думаю, что мне нужно, чтобы получить идентификатор из внутреннего соединения и связать его с Genre.Name

Может быть, это идет немного далеко, но я был бы рад, если бы кто-то мог уже получить идентификатор по обратным ObservableCollection. Итак, в Datagrid показаны жанры: 1, 3, например.

Заранее спасибо

C# 
//Property 
private ObservableCollection<Genre> genres; 

     public ObservableCollection<Genre> Genres 
     { 
      get { return genres; } 
      set { genres = value; } 
     } 
//Method 
public static ObservableCollection<Band> GetBands() 
     { 
      ObservableCollection<Band> list = new ObservableCollection<Band>(); 
      try 
      { 
       string provider = ConfigurationManager.ConnectionStrings["ConnectionString"].ProviderName; 
       string connectionstring = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString; 

       DbConnection con = DbProviderFactories.GetFactory(provider).CreateConnection(); 
       con.ConnectionString = connectionstring; 
       con.Open(); 

       DbCommand command = DbProviderFactories.GetFactory(provider).CreateCommand(); 
       command.CommandType = System.Data.CommandType.Text; 
       command.Connection = con; 
       command.CommandText = "SELECT * FROM Band"; 

       //Bands ophalen 
       DbDataReader reader = command.ExecuteReader(); 
       while (reader.Read()) 
       { 
        Band b = new Band() 
        {      
         ID = reader["ID"].ToString(), 
         Name = reader["Name"].ToString(), 
         Picture = reader["Picture"].ToString(), 
         Description = reader["Description"].ToString(), 
         Twitter = reader["Twitter"].ToString(), 
         Facebook = reader["Facebook"].ToString(), 
         //Genres = (Genre)reader["Genres"] lijst van genres kunnen doorgeven, probleem met meerdere genres per band. Kijken filmpje inner joint 
        }; 

        if (!DBNull.Value.Equals(reader["Picture"])) 
        { 
         b.Picture = reader["Picture"].ToString(); 
        } 
        else 
        { 
         b.Picture = null; 
        } 
        list.Add(b); 
       } 

       //Genres ophalen via INNER JOIN 
       DbCommand command2 = DbProviderFactories.GetFactory(provider).CreateCommand(); 
       command2.CommandType = System.Data.CommandType.Text; 
       command2.Connection = con; 
       command2.CommandText = "SELECT * FROM Band INNER JOIN Band_Genre On Band.ID = Band_Genre.BandID"; 

       //Bands ophalen 
       DbDataReader reader2 = command2.ExecuteReader(); 
       while (reader2.Read()) 
       { 
        Genre g = new Genre() 
        { 
         ID = reader2["GenreID"].ToString(), 
         //Name = reader2[ 


        }; 
       } 

       reader.Close(); 
       reader2.Close(); 
       con.Close(); 
      } 

XAML: 
<DataGrid.Columns> 
       <DataGridTextColumn Header="Band" Binding="{Binding Name}"/> 
       <DataGridTextColumn Header="Picture" Binding="{Binding Picture}" /> 
       <DataGridTextColumn Header="Description" Binding="{Binding Description}"/> 
       <DataGridTextColumn Header="Twitter" Binding="{Binding Twitter}" /> 
       <DataGridTextColumn Header="Facebook" Binding="{Binding Facebook}" /> 
       <DataGridTextColumn Header="Genres" Binding="{Binding Genres}" /> 
      </DataGrid.Columns> 
     </DataGrid> 
+0

ID = reader2 [ "GenreID"] ToString(), используйте точку с запятой и точкой с запятой после} удалить его – Mihai

+0

Это не проблема, когда я устанавливаю точку останова на DbDataReader reader2 = command2.ExecuteReader(). Я получаю нуль. Таким образом, ошибка до этого. – user2827958

ответ

0

Не совсем уверен, что вы хотите сделать ... Второй читатель не должен возвращаться нуль, если ваши таблицы не имеют правильные данные - но это не будет иметь жанрную информацию. Для жанров вы хотите присоединиться к жанру, не так ли?

SELECT g.* 
FROM Band b 
INNER JOIN Band_Genre bg 
    ON b.ID = bg.BandID 
INNER JOIN Genre g on g.GenreID = bg.GenreID 

Это вернет вашу информацию о Жанре. Но если ваш второй читатель является пустым, он выглядит как Band_Genre не заполняется или имеет неправильные идентификаторы, поэтому он не может присоединиться к вашему столу диапазона

EDIT

Если вы хотите их все в одном запросе:

SELECT b.*, g.* 
FROM Band b 
INNER JOIN Band_Genre bg 
    ON b.ID = bg.BandID 
INNER JOIN Genre g on g.GenreID = bg.GenreID 
+0

Мне кажется странным, что группа и жанры принадлежат друг другу, но для них мне нужен второй читатель. Поэтому я хочу название группы, описание и т. Д., Но это уже работает. Только часть жанра остается пустой – user2827958

+0

Нет, она возвращает мне null – user2827958

Смежные вопросы