c# - 如何在 Select 语句的 IN 子句中提供一串 ID,即使该列是整数

标签 c# parameters sqlcommand sql

我使用 ObjectDataSource 对数据进行分页,我有以下方法:

public int GetNumberOfArticles(string employeeIds)
{
    System.Data.DataTable dataTable;
    System.Data.SqlClient.SqlDataAdapter dataAdapter;
    System.Data.SqlClient.SqlCommand command;

    int numberOfArticles = 0;

    command = new System.Data.SqlClient.SqlCommand();
    command.Connection = Classes.Database.SQLServer.SqlConnection;

    command.CommandText = @"SELECT COUNT(*)
                            FROM 
                                  [Articles]
                            WHERE 
                                  [Articles].[EmployeeID] IN (@EmployeeIds)";

    command.Parameters.AddWithValue("@EmployeeIds", employeeIds);
    numberOfArticles = (int)command.ExecuteScalar();
    return numberOfArticles;
}

EmployeeID 是一个整数,因此,我放在 employeeIds 中的任何内容都将转换为整数。但是,因为我使用的是 IN 关键字,所以很明显我想用逗号分隔的 ID 列表替换 employeeIds:

1, 2, 3

但是当我替换行时:

command.Parameters.AddWithValue("@EmployeeIds", employeeIds);

用类似的东西:

command.Parameters.AddWithValue("@EmployeeIds", "1, 2, 3");

我收到一个异常,因为我提供了一个字符串,而 EmployeeIds 是一个整数。那么,我该怎么做呢?

谢谢。

编辑:

从回复中,我了解到这必须手动完成,但是包含此方法的类将由 ObjectDataSource 自动创建。那么如何在运行时提供 employeeIds 的值呢?

最佳答案

执行此操作的唯一方法是在查询中手动解析字符串并将值插入内存表,然后在查询中加入内存表而不是使用 IN条款。

例如,this page on CodeProject介绍这个功能:

IF EXISTS(SELECT * FROM sysobjects WHERE ID = OBJECT_ID(’UF_CSVToTable’))
 DROP FUNCTION UF_CSVToTable
GO

CREATE FUNCTION UF_CSVToTable
(
 @psCSString VARCHAR(8000)
)
RETURNS @otTemp TABLE(sID VARCHAR(20))
AS
BEGIN
 DECLARE @sTemp VARCHAR(10)

 WHILE LEN(@psCSString) > 0
 BEGIN
  SET @sTemp = LEFT(@psCSString, ISNULL(NULLIF(CHARINDEX(',', @psCSString) - 1, -1),
                    LEN(@psCSString)))
  SET @psCSString = SUBSTRING(@psCSString,ISNULL(NULLIF(CHARINDEX(',', @psCSString), 0),
                               LEN(@psCSString)) + 1, LEN(@psCSString))
  INSERT INTO @otTemp VALUES (@sTemp)
 END

RETURN
END
Go

然后你可以像这样使用它:

SELECT                          
    COUNT(*)
FROM 
    [Articles]

JOIN dbo.UF_CSVToTable(@EmployeeIds) ids on ids.sID = [Articles].[EmployeeID]

不过,最后,这通常不是一个很好的做法。但如果有必要,那么这种方法应该以非常直接的方式为您提供。

关于c# - 如何在 Select 语句的 IN 子句中提供一串 ID,即使该列是整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/741789/

相关文章:

c# - 在 C++ 中是否有与 LINQ 相对于数据表的等价物?

c++ - 使用 C 的 '...' 参数包作为 C++ 模板值?

c# - SqlCommand AddWithValue 和 if 语句与 gridview 相关

c#连续读取文件

c# - 从 Azure Function 中的 Azure SQL 访问几何列时出错

data-binding - Grails - 向 params 映射添加参数

javascript - 我的 if 语句给出了错误的输出

C# 数据库中的多个并行插入

c# - 如何覆盖 SqlCommand 以获取生成的 TSQL

c# - 数据集是否与记录集相同