将 int 数组传递给存储过程的表值参数 - 转换失败

xMe*_*orx 2 c# sql stored-procedures table-valued-parameters

我有一个接受表值参数的存储过程。我想将 int 数组传递给它,但现在我收到此错误:

无法将参数值从 Object[] 转换为 IEnumerable`1。

我的代码:

int[] orderIds; //int array which contains 0 or more values

List<SqlParameter> queryList = new List<SqlParameter>
     {
        new SqlParameter("@companyId", SqlDbType.Int) {Value = companyId}, 
        new SqlParameter("@marketplaceId", SqlDbType.Int) {Value = marketplaceId}, 
        new SqlParameter("@marketlocalId", SqlDbType.Int) {Value = marketLocal}, 
        new SqlParameter("@storeId", SqlDbType.Int) {Value = storeId}
     };

if (orderIds != null)
{
     queryList.Add(new SqlParameter("@OrderIdsSpecified", SqlDbType.Bit) {Value = 1});
     // converting int array to object array 
     queryList.Add(new SqlParameter("@OrderIds", SqlDbType.Structured) {Value = orderIds.Select(orderId => (object)orderId).ToArray() }); 
}

using (SqlDataReader reader = SqlHelper.ExecuteReader(connString, CommandType.StoredProcedure, "SPName", queryList.ToArray()))
{
     //reader.read()
}
Run Code Online (Sandbox Code Playgroud)

我尝试按原样传递 int 数组,而不转换为对象,但这也不起作用。我收到了相同的错误消息,但使用的是 int[] 而不是 object[]。

表值参数只是一个具有一列整数的表,并且已经定义。

我在这里做错了什么?任何帮助表示赞赏。谢谢!

Neo*_*isk 5

类型的 SQL 参数SqlDbType.Structured需要表类型的值。您不能只向其传递一个整数数组。请阅读:

最后一个答案建议您可以使用 DataTable、IEnumerable 或 DbDataReader。是否需要结构化取决于您的数据库架构。根据我的经验,创建名为 ListOfId 的 SQL 类型非常常见。这是一个包含 1 个 Id 列的表。下面的代码摘自另一个答案:

private static DataTable CreateDataTable(IEnumerable<long> ids) {
    DataTable table = new DataTable();
    table.Columns.Add("ID", typeof(long));
    foreach (long id in ids) {
        table.Rows.Add(id);
    }
    return table;
}
Run Code Online (Sandbox Code Playgroud)

然后你应该能够用作CreateDataTable(orderIds)你的sql参数值。