我正在尝试在C#winform应用程序中链接两个组合框。
第一个组合框-comboKategorija,一旦用_SelectedIndexChanged
选择,就将组合框中的选定值作为自变量发送到存储过程。
private void comboKategorija_SelectedIndexChanged(object sender, EventArgs e)
{
DataModel db = new DataModel();
CheckInternet net = new CheckInternet();
if (net.Available())
{
var validated = db.ChangeComboSifra(comboKategorija.Text);
comboSifra.DataSource = validated;
comboSifra.DisplayMember = "prefiks";
comboSifra.ValueMember = "prefiks";
}
else
{
MessageBox.Show("Интернет конекцијата е недостапна.", "Информација", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
}
我用精巧的东西。方法如下。 我只传递一个参数-从combox中选择的值。
public List<Sifrarnik> ChangeComboSifra(string opis)
{
using (IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["Cloud"].ConnectionString))
{
if (db.State == ConnectionState.Closed)
{
db.Open();
}
var response = db.Query<Sifrarnik>("dbo.spChangeComboSifra @opis",
new
{
opis = opis
}).ToList();
return response;
}
}
存储过程支持返回一行或多行,这将预填充第二个组合框-comboboxSifra
ALTER PROCEDURE [dbo].[spChangeComboSifra]
@opis nvarchar(300)
AS
BEGIN
DECLARE @MyPrefiks nvarchar(100)
SET @MyPrefiks = (SELECT prefiks from Sifrarnik where opis LIKE '%' + @opis + '%')
SELECT prefiks,opis FROM Sifrarnik where SUBSTRING(prefiks, 1,2) = @MyPrefiks and LEN(prefiks) > 2
END
但是我遇到以下错误:
System.Data.SqlClient.SqlException:'子查询返回了多个值。当子查询遵循=,!=,<,<=,>,> =或将子查询用作表达式时,不允许这样做。'
它说返回了多个值,这正是我想要的。但是我不确定为什么会出错?
答案 0 :(得分:2)
有多个Sifrarnik的opis与您在@opis变量中传递的内容相匹配:
SET @MyPrefiks = (SELECT prefiks from Sifrarnik where opis LIKE '%' + @opis + '%')
如果此查询匹配2+行,则SP的执行将因错误而停止。确定如何确保此查询仅返回单行。您可以:
SET @MyPrefiks = (SELECT MAX(prefiks) from Sifrarnik where opis LIKE '%' + @opis + '%')
SET @MyPrefiks = (SELECT TOP 1 prefiks from Sifrarnik where opis LIKE '%' + @opis + '%' ORDER BY ...)
依此类推
如果查询返回多行,但您确实要使用所有行,则必须使用其输出来驱动@MyPrefiks以前使用的查询,例如:
SELECT prefiks,opis
FROM Sifrarnik
where
SUBSTRING(prefiks, 1,2) IN (SELECT prefiks from Sifrarnik where opis LIKE '%' + @opis + '%')
and LEN(prefiks) > 2
答案 1 :(得分:1)
问题在于SET
仅在返回零或一行时有效。另一方面,无论返回多少行,SELECT
都可以正常工作(尽管只分配了一个值)。因此,您可以使用:
SELECT @MyPrefiks = prefiks from Sifrarnik where opis LIKE '%' + @opis + '%'
请注意,如果查询不返回任何行,SET
和SELECT
将执行differently(SET
会将变量设置为NULL
SELECT
将保持不变)。