XAML C#中的SQL内部联接语句

khbbv19g  于 2022-12-07  发布在  C#
关注(0)|答案(1)|浏览(148)

我在做一个学校项目
我想得到乐队的所有信息,这很好用。直到我到了流派。流派有点特别,因为一个乐队可以有多个流派,反之亦然。
在SQL中,我有一个表Bands,一个表Genre和一个表Band_Genre如果我在那里进行内部连接

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

在SQL中一切都很好,但是当我用该语句尝试第二个读取器时,它返回null。
但是我现在要做的是用类型本身来填充datagrid,而不是ID。所以我想我需要从Inner join中获取ID,并将其链接到Genre。Name
也许这有点过了,但是如果有人已经将id放入ObservableCollection中,我会很高兴。这样Datagrid就会显示Genres:例如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>
0qx6xfy6

0qx6xfy61#

不太确定您要做什么...第二个读取器不应返回null,除非您的表中没有正确的数据-但它将没有流派信息。对于流派,您希望内部联接到流派,是吗?

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未填充或ID不正确,因此无法连接到您的Band表

编辑

如果要在一个查询中包含所有这些查询:

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

相关问题