C# 其中在原始SQL查询中,与ExecuteSqlCommand一起使用,不适用于多条记录

C# 其中在原始SQL查询中,与ExecuteSqlCommand一起使用,不适用于多条记录,c#,sql,asp.net,entity-framework,dbcontext,C#,Sql,Asp.net,Entity Framework,Dbcontext,我试图在更新多个记录时有效地使用更新查询,而不是针对每个Id循环 我有一个简单的方法: public static async Task EfficientlyUpdateSentTimeforSomeTicketsAsync(List<int> Ids) { var parameters = Ids.Select((id, index) => new SqlParameter(string.Format("@p{0}", index), id)

我试图在更新多个记录时有效地使用更新查询,而不是针对每个Id循环

我有一个简单的方法:

    public static async Task EfficientlyUpdateSentTimeforSomeTicketsAsync(List<int> Ids)
    {
        var parameters = Ids.Select((id, index) => new SqlParameter(string.Format("@p{0}", index), id));
        var parameterNames = string.Join(", ", parameters.Select(p => p.ParameterName));
        var query = string.Format("Update [TicketQueueTable] Set SentDatetime = {1} WHERE TicketQueueID IN ({0})", parameterNames, DateTime.Now);

        try
        {
            using (var db = GetDbContext())
            {
                var affectedRows = await db.Database.ExecuteSqlCommandAsync(query, parameters.ToArray());
            }
        }
        catch (Exception ex)
        {
            await LogErrorAsync(ex);
            throw ex;
        }
    }
我从这个问题上得到了帮助:但我无法让它工作。我突然想到一个例外,那就是:

“2”附近的语法不正确

为了简单起见,我现在发送的ID是新列表{1,2}


谢谢您的时间。

类似这样的内容:我没有测试,可能是打字错误

var parameterNames = string.Join(", ", Ids.Select(p => "("+ x.id.ToString()+")"));
var query = string.Format(@"Update TicketQueueTable 
                              Set SentDatetime = '{1}'
                             FROM TicketQueueTable
                             JOIN (
                               VALUES
                                {0}
                             ) AS L(ID) ON TicketQueueTable.Ticket.TicketQueueID = L.ID;", parameterNames, DateTime.Now)

如果要使用一个参数,则应将其设置为表参数,并将表中的值列表连接到该参数。

类似这样的内容:我没有测试,可能输入错误

var parameterNames = string.Join(", ", Ids.Select(p => "("+ x.id.ToString()+")"));
var query = string.Format(@"Update TicketQueueTable 
                              Set SentDatetime = '{1}'
                             FROM TicketQueueTable
                             JOIN (
                               VALUES
                                {0}
                             ) AS L(ID) ON TicketQueueTable.Ticket.TicketQueueID = L.ID;", parameterNames, DateTime.Now)

如果要使用一个参数,则应将其设置为表参数,并在表中包含值列表并与之联接。

要创建的字符串如下所示

Update [TicketQueueTable] Set SentDatetime = 3/6/2020 2:30:18 AM WHERE TicketQueueID IN (@p0, @p1)
如果尝试使用sql Server Management Studio之类的sql工具执行该命令,则会出现此错误

Msg 102, Level 15, State 1, Line 1
Incorrect syntax near '2'.
加上凌晨2:30:18的2是红色下划线

您有两个选择:

引用日期和时间 使用sql函数获取sql server的当前时间 将日期时间作为参数传入
您正在创建的字符串如下所示

Update [TicketQueueTable] Set SentDatetime = 3/6/2020 2:30:18 AM WHERE TicketQueueID IN (@p0, @p1)
如果尝试使用sql Server Management Studio之类的sql工具执行该命令,则会出现此错误

Msg 102, Level 15, State 1, Line 1
Incorrect syntax near '2'.
加上凌晨2:30:18的2是红色下划线

您有两个选择:

引用日期和时间 使用sql函数获取sql server的当前时间 将日期时间作为参数传入
您还应该为要设置的日期创建一个参数。但问题是,在查询中设置日期的格式,而不在其周围加上单引号。嗨@juharr,很抱歉,我没有得到它。你能详细说明一下吗?当我在日期周围加上引号时,我得到了一个异常:对象类型System.Data.SqlClient.SqlParameter[]与已知的托管提供程序本机类型之间不存在映射。您能告诉我异常正在传递的确切消息吗?您不能将参数用作in语句元素的输入。in语句需要常量,而使用values语句并构造一个表,链接到try:var query=string.FormatUpdate[TicketQueeTable]Set SentDatetime=NOW,其中{0}中的TicketQueueID为parameterNames;始终最好在sql server而不是web server上使用datetime,尤其是当您开始运行多个web服务器时。您还应该为要设置的日期创建一个参数。但问题是,在查询中设置日期的格式,而不在其周围加上单引号。嗨@juharr,很抱歉,我没有得到它。你能详细说明一下吗?当我在日期周围加上引号时,我得到了一个异常:对象类型System.Data.SqlClient.SqlParameter[]与已知的托管提供程序本机类型之间不存在映射。您能告诉我异常正在传递的确切消息吗?您不能将参数用作in语句元素的输入。in语句需要常量,而使用values语句并构造一个表,链接到try:var query=string.FormatUpdate[TicketQueeTable]Set SentDatetime=NOW,其中{0}中的TicketQueueID为parameterNames;最好在sql server而不是web服务器上使用datetime,尤其是当您开始运行多个web服务器时。感谢您提供了这个非常详细的答案!谢谢你的详细回答!