必须在Select命令中声明标量变量

r m*_*k r 1 c# sql-server

我正在传递一长串employeeId,employeeIdlist并将它们分成一个List.使用此列表我将向查询添加参数.我收到以下错误

{"必须声明标量变量\"@ EmployeeId \"."}

public List<versionInfo> GetVersion(string  employeeIdlist)
{
    DbHelper helper = new DbHelper();
    List<versionInfo> empVerInfo = new List<versionInfo>();

    using (SqlConnection conn = new SqlConnection(connString))
    {              
        conn.Open();
        using (SqlCommand getVersion = new SqlCommand())
        {
            getVersion.Connection = conn;
            getVersion.CommandText = @"SELECT EmployeeId,Version 
                                                FROM [dbo].[EmployeeVersion]
                                                WHERE EmployeeId in (@EmployeeId)";

            getVersion.CommandType = CommandType.Text;
            List<int> empIds = employeeIdlist.Split(',').Select(int.Parse).ToList();
            StringBuilder sb = new StringBuilder();
            int i = 0;
            foreach (var emp in empIds)
            {
                // IN clause
                sb.Append("@EmployeeId" + i.ToString() + ",");
                // parameter
                getVersion.Parameters.AddWithValue("@EmployeeId" + i.ToString(), emp);
                i++;
            }

           // getVersion.Parameters.AddWithValue("@EmployeeId", employeeIdlist);
            SqlDataReader rdr = getVersion.ExecuteReader();
            while (rdr.Read())
            {
                versionInfo vi = new versionInfo();
                vi.employeeId = helper.GetDb<int>(rdr, "EmployeeId");
                vi.version = helper.GetDb<decimal>(rdr, "Version");
                empVerInfo.Add(vi);                      
            }
            rdr.Close();
        }
        conn.Close();
    }
    return empVerInfo;
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*eve 5

在IN之后删除文本

getVersion.CommandText = @"SELECT EmployeeId,Version 
                          FROM [dbo].[EmployeeVersion]
                          WHERE EmployeeId in (";
Run Code Online (Sandbox Code Playgroud)

然后foreach可以建立完整的参数和文本列表

foreach (var emp in empIds)
{
    sb.Append("@EmployeeId" + i.ToString() + ",");
    getVersion.Parameters.AddWithValue("@EmployeeId" + i.ToString(), emp);
    i++;
}
Run Code Online (Sandbox Code Playgroud)

退出循环后,从StringBuilder中删除最后一个逗号

sb.Length--;
Run Code Online (Sandbox Code Playgroud)

最后,完成附加StringBuilder内容的命令文本,不要忘记IN子句的结束括号.

getVersion.CommandText += sb.ToString() + ")";
Run Code Online (Sandbox Code Playgroud)

现在,您可以使用正确的IN子句和匹配的参数列表运行该命令