首页 > 解决方案 > 具有 SQL 参数的级联组合框

问题描述

我有一个重载方法来填充组合框。我正在尝试使用它在我的 Windows 窗体上级联一些组合框,但是在使用第一个组合框的值作为参数填充第二个组合框时,我的代码似乎没有正确地将 SQL 参数传递给 SQL Server 存储过程.

我已经为这种方法尝试了许多变体,但都没有奏效。最初我收到一个错误,指出存储过程需要一个参数,但它没有传递给它。我现在已经把代码弄到了没有错误的地步,但它仍然没有填充第二个组合框。

我试过使用combobox.Text 值和combobox.SelectedValue。我也尝试将参数添加到我的代码中Parameter.AddParameter.AddWithValue但它不会影响结果。

我的 SQL Server 存储过程将游戏名称作为参数并返回该游戏的所有字符:

SELECT c.CharacterName
FROM dbo.Characters c
JOIN dbo.Games g ON g.GameID = c.GameID
WHERE g.GameName = @GameName

我有两个版本的 C# 方法。第一个使用数据库中的游戏名称填充第一个组合框:

private void fillCombobox(ComboBox cmb, string scmd, string dispmem)
{
    using (SqlConnection conn = new SqlConnection("Server = (local); Database = DBName; Integrated Security = SSPI; "))
    {
        using (DataSet ds = new DataSet())
        {
            try
            {
                conn.Open();

                using (SqlCommand cmd = new SqlCommand(scmd, conn))
                {
                    using (SqlDataAdapter da = new SqlDataAdapter())
                    {
                        da.SelectCommand = cmd;
                        da.Fill(ds);

                        cmb.DisplayMember = dispmem;
                        cmb.ValueMember = "ID";
                        cmb.DataSource = ds.Tables[0];
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
    }
}

我的方法的第二个版本应该使用游戏组合框的文本并将其作为参数传递给存储过程,以仅返回所选游戏中的字符:

private void fillCombobox(ComboBox cmb, string scmd, string dispmem, string param1)
{
    using (SqlConnection conn = new SqlConnection("Server = (local); Database = DBName; Integrated Security = SSPI;"))
    {
        using (DataSet ds = new DataSet())
        {
            try
            {
                conn.Open();

                using (SqlCommand cmd = new SqlCommand(scmd, conn))
                {
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.AddWithValue("@GameName", param1);

                    using (SqlDataAdapter da = new SqlDataAdapter())
                    {
                        da.SelectCommand = cmd;
                        da.Fill(ds);

                        cmb.DisplayMember = dispmem;
                        cmb.ValueMember = "ID";
                        cmb.DataSource = ds.Tables[0];
                    }
                }
            }
            catch (Exception ex)
            {
                 MessageBox.Show(ex.ToString());
            }
        }
    }
}

然后我像这样调用这两种方法:

fillCombobox(cmbGame, "sGetGames", "GameName");
fillCombobox(cmbName, "sGetGameCharacters", "CharacterName", cmbGame.Text);

我的目标是选择的游戏cmbGamesGetGameCharacters作为参数传递给存储过程。SQL Server 然后返回该游戏的所有字符并CharacterName在第二个组合框中显示 。

我已经根据我在这里看到的类似问题尝试了其他变体,但没有任何效果,所以我完全没有想法并且对 C# 很陌生。

标签: c#sql-server

解决方案


最终找到了解决方案。代码很好。问题在于数据库中的基础数据。当表单加载游戏组合框上的第一个值时,没有字符,所以字符组合框看起来没有填充,但确实如此。


推荐阅读