将数据集合插入 SQL Server 数据库的最佳做法是什么

use*_*901 5 sql-server-2008 sql-server stored-procedures entity-framework c#

我正在使用 C#,实体框架。用于开发 SQL Server。我有一个方法,它有两个参数 ( int ID, List<String> _listobj)。对于每个 ID,都有一个 obj 列表。所有这些 ID 和列表都将插入到数据库中的不同表中。所以问题是:最好的做法是什么?我有几个选择:

  1. 在 C# 中,拆分list<obj>为单个值,然后创建一个带有两个参数 ( ID, str)的存储过程,然后 C# 将根据列表的大小多次调用存储过程

  2. IDlist<obj>作为两个参数传递给存储过程,并让存储过程拆分list<obj>. 这样C#只会调用一次存储过程

第二种策略可行吗?如果是,哪个在性能方面更好?

Dha*_*DK' 0

第2种方法是可行的。您可以将逗号分隔的字符串传递给 SP,并在 SP 内使用自定义 sql 表值函数,如下所示:

CREATE FUNCTION [dbo].[fn_Split](@text VARCHAR(MAX), @delimiter VARCHAR(5) = ',')

RETURNS @Strings TABLE
(    
    position int IDENTITY PRIMARY KEY,
    value VARCHAR(8000)  
)

AS
BEGIN
    DECLARE @index int 
    SET @index = -1 

    WHILE (LEN(@text) > 0) 
        BEGIN  
            SET @index = CHARINDEX(@delimiter , @text)  

            IF (@index = 0) AND (LEN(@text) > 0)  
                BEGIN   
                    INSERT INTO @Strings VALUES (@text)
                    BREAK  
                END  

            IF (@index > 1)
                BEGIN
                    INSERT INTO @Strings VALUES (LEFT(@text, @index - 1))
                END

            SET @text = RIGHT(@text, (LEN(@text) - (@index+LEN(@delimiter)-1))) 
        END
    RETURN
END
Run Code Online (Sandbox Code Playgroud)

或者,您可以定义一个自定义表类型,例如 Foll 并使用 SqlDbType.Structured 从 C# 调用 SP,将表变量作为第二个参数传递

CREATE TYPE [dbo].[MyCustomType] AS TABLE(
Id int not null
)
Run Code Online (Sandbox Code Playgroud)