将 int 数组传递给存储过程的 Table 值参数 - 转换失败
Pass int array to Table Value parameter for stored procedure - Failure to convert
我有一个接受 table 值参数的存储过程。我想将一个 int 数组传递给它,但现在我收到此错误:
Failed to convert parameter value from a Object[] to a 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()
}
我试过按原样传递 int 数组,而不转换为对象,但这也不起作用。我收到了相同的错误消息,但使用的是 int[] 而不是 object[].
table 值参数只是一个带有一列整数的 table,并且已经定义。
我在这里做错了什么?任何帮助表示赞赏。谢谢!
SQL 类型 SqlDbType.Structured
的参数需要类型 table 的值。您不能只将一个整数数组传递给它。请阅读:
- How to pass a table-value parameter
最后的答案表明您可以使用 DataTable、IEnumerable 或 DbDataReader。您是否需要结构化取决于您的数据库模式。根据我的经验,创建一个名为 ListOfId 的 SQL 类型是很常见的。它是一个 table,里面有 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;
}
那么您应该可以使用 CreateDataTable(orderIds)
作为您的 sql 参数值。
我认为您不需要 StructuredData
。
试试这个:
queryList.Add(new SqlParameter("@OrderIds", SqlDbType.Int)
{
Value = orderIds
});
我有一个接受 table 值参数的存储过程。我想将一个 int 数组传递给它,但现在我收到此错误:
Failed to convert parameter value from a Object[] to a 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()
}
我试过按原样传递 int 数组,而不转换为对象,但这也不起作用。我收到了相同的错误消息,但使用的是 int[] 而不是 object[].
table 值参数只是一个带有一列整数的 table,并且已经定义。
我在这里做错了什么?任何帮助表示赞赏。谢谢!
SQL 类型 SqlDbType.Structured
的参数需要类型 table 的值。您不能只将一个整数数组传递给它。请阅读:
- How to pass a table-value parameter
最后的答案表明您可以使用 DataTable、IEnumerable 或 DbDataReader。您是否需要结构化取决于您的数据库模式。根据我的经验,创建一个名为 ListOfId 的 SQL 类型是很常见的。它是一个 table,里面有 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;
}
那么您应该可以使用 CreateDataTable(orderIds)
作为您的 sql 参数值。
我认为您不需要 StructuredData
。
试试这个:
queryList.Add(new SqlParameter("@OrderIds", SqlDbType.Int)
{
Value = orderIds
});