如何将多个 INSERT INTO 与准备好的语句结合起来?

Posted

技术标签:

【中文标题】如何将多个 INSERT INTO 与准备好的语句结合起来?【英文标题】:How to combine multiple INSERT INTO's with prepared statements? 【发布时间】:2022-01-06 23:26:29 【问题描述】:

使用 Dapper,有没有办法用准备好的语句将其组成一个查询? userIds 的长度是动态的。

        public static void LinkUsersToChatroom(int chatroomId, int[] userIds)
        
            using SqlConnection connection = new(connectionString);

            connection.Execute(
            "INSERT INTO chatroom_users (chatroomId, userId) VALUES (@chatroomId, @userId)",
                new  chatroomId, userId = userIds[0] );

            connection.Execute(
            "INSERT INTO chatroom_users (chatroomId, userId) VALUES (@chatroomId, @userId)",
                new  chatroomId, userId = userIds[1] );

            connection.Execute(
            "INSERT INTO chatroom_users (chatroomId, userId) VALUES (@chatroomId, @userId)",
                new  chatroomId, userId = userIds[2] );
        

【问题讨论】:

【参考方案1】:

Dapper 相对于直接 ADO.NET 的众多优势之一是可以将数据列表插入表中的简单性。 您只需要一个类<T> 的列表,其中该类的属性与您的数据库字段具有相同的名称,所以...

private class ChatRoomUser

    public int chatroomId get;set;
    public int userId get;set;


public static void LinkUsersToChatroom(int chatroomId, int[] userIds)

    //Transform the array in an IEnumerable of ChatRoomUser
    var users = userIds.Select(x => new ChatRoomUser
     
        chatroomId = chatroomId, 
        userIds = x
    ;
    using SqlConnection connection = new(connectionString);
    connection.Execute(@"INSERT INTO chatroom_users (chatroomId, userId)  
                         VALUES (@chatroomId, @userId)", 
                         users);


如果您想维护当前方法的实际接口,您可以使用这种方法,但是,当然,没有什么可以阻止您直接在构建数组的地方构建列表并传递列表而不是两个参数,甚至创建此方法的重载,接受列表作为其输入。

【讨论】:

以上是关于如何将多个 INSERT INTO 与准备好的语句结合起来?的主要内容,如果未能解决你的问题,请参考以下文章

DataGrip 通过结果集生成insert into values语句

DataGrip 通过结果集生成insert into values语句

DataGrip 通过结果集生成insert into values语句

如何将sqlserver表中的数据导出sql语句或生成insert into语句

根据自定义类动态调整 Create Table 和 Insert Into 语句

ORACLE MERGE INTO