C#返回错误“子查询返回的值大于1”,但这应该可以

时间:2019-09-15 21:52:49

标签: c# sql-server

我正在尝试在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:'子查询返回了多个值。当子查询遵循=,!=,<,<=,>,> =或将子查询用作表达式时,不允许这样做。'

它说返回了多个值,这正是我想要的。但是我不确定为什么会出错?

2 个答案:

答案 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 + '%'

请注意,如果查询不返回任何行,SETSELECT将执行differentlySET会将变量设置为NULL SELECT将保持不变)。

相关问题