我有以下代码:
imageAdd
输出错误:在此上下文中不允许使用可枚举的参数序列(数组,列表等)。
怎么可能?有同等的解决方案吗?
答案 0 :(得分:7)
尝试使用Dapper.DynamicParameters
代替SqlParameter
数组:
var parameters = new DynamicParameters();
parameters.Add("@ParameterName", parameterValue);
答案 1 :(得分:1)
如果您使用ExecuteNonQuery
而不是Query<>
,则不会再出现此异常。但是,当您在Oracle中使用Query时,还会出现另一个问题。
我对这个问题的解决方案是使用中间表。我正在使用Oracle; Oracle在sys
模式下有一个称为“双重”的特殊表。该表给了我启发,我在用户的模式下创建了另一个表。
CREATE TABLE USER_SCHEMA.DUAL2
(
DUMMY VARCHAR2(1000 BYTE)
)
NOCOMPRESS
NOCACHE
NOPARALLEL;
您可以根据需要延长长度。给了表一些资助。然后,我将查询从select更改为select语句插入。
INSERT INTO USER_SCHEMA.DUAL2
(SELECT ID
FROM ANOTHER_SCHEMA.SOME_TABLE
WHERE SOME_FLAG = 'M' AND NO IN :NO)
这是因为ADO.NET无法从ExecuteNonQuery
返回结果。默认情况下,它运行SELECT
个查询,但每个查询返回-1。我通过提供INSERT
查询来模拟SELECT
。这将返回结果。
var parameters = noSplit.Select(x => new { NO = x, SOME_FLAG = flag }).ToList();
var queryResult = dbConnection.Execute(insertSelectQuery, parameters, transactionIfExists);
if (queryResult != parameters.Count)
{
throw new Exception("Can not find some no");
}
答案 2 :(得分:0)
我知道这对您来说有点晚了,但也许可以帮助其他人:)
您可以这样做:
public class MySqlDataAccess
{
string _connectionString = "{your connection string}";
public async Task<IEnumerable<CustomerDto>> GetListAsync(IList<Guid> customers)
{
const string query = @"
SELECT TOP 100 Id,
Name
FROM Customers
WHERE Id IN @CustomerIdList
";
using (var c = new SqlConnection(_connectionString))
{
return await c.QueryAsync<CustomerDto>(query, new { CustomerIdList = customers.ToArray() });
}
}
}
您执行WHERE Id IN @CustomerIdList
,然后从数组中像这样传递匿名类型:new { CustomerIdList = customers.ToArray() }
,而不是直接传递数组。
希望有帮助!