c# - 具有 SQL 参数的级联组合框
问题描述
我有一个重载方法来填充组合框。我正在尝试使用它在我的 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# 很陌生。
解决方案
最终找到了解决方案。代码很好。问题在于数据库中的基础数据。当表单加载游戏组合框上的第一个值时,没有字符,所以字符组合框看起来没有填充,但确实如此。
推荐阅读
- php - 如何在php中对文件上方的目录进行排序
- java - 如何在android studio上按下按钮时进行简单的文本交换
- ios - How to make a label to be a circle in Swift4?
- tcl - 测试 TCL 中是否存在矩阵对象
- visual-studio - Is there an "easy" way to migrate installed extensions from Visual Studio 2017 to Visual Studio 2019 when installed side-by-side?
- mysql - mysql'慢查询日志'返回大量检查的行,但解释似乎没问题
- chart.js - Chartjs 工具提示超出页面
- xgboost - 如何在 xgboost.XGBClassifier 中同时使用自定义 eval_metric 和内置指标
- sql-server - SQL Server 和 Oracle 表之间的联合视图(查询)
- html - 没有嵌套部分的 CSS 自动编号