我有一个重载的方法来填充组合框。我正在尝试使用它在我的Windows窗体上级联一些组合框,但是当使用第一个组合框的值作为参数填充第二个组合框时,我的代码似乎没有正确地将SQL参数传递给SQL Server存储过程。
我为此方法尝试了许多变体,但都没有奏效。最初,我收到一条错误消息,指出存储过程需要一个参数,但未将其传递给它。现在,我的代码已经到了没有错误的地步,但是它仍然没有填充第二个组合框。
我尝试使用combobox.Text值和combobox.SelectedValue。我也尝试过使用Parameter.Add
和Parameter.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);
我的目标是将在cmbGame
中选择的游戏作为参数传递给sGetGameCharacters
存储过程。然后,SQL Server返回该游戏的所有字符,并在第二个组合框中显示CharacterName
。
我已经根据在这里遇到的类似问题尝试了其他变体,但没有任何效果,因此我完全不了解C#。
答案 0 :(得分:0)
最后找到了解决方案。代码很好。问题是数据库中的基础数据。当窗体加载游戏上的第一个值时,组合框没有任何字符,因此角色组合框看起来好像没有填充,但是填充了。