从 sql 脚本创建种子数据

本文关键字:种子 数据 创建 脚本 sql | 更新日期: 2023-09-27 18:17:20

我在我的项目中使用了ORM。目前种子数据取自 sql 脚本,但我想根据我的 c# 代码创建种子数据。例如,我有sql:

SET IDENTITY_INSERT [dbo].[State] ON
INSERT INTO [dbo].[State] ([Id], [Code], [Name]) VALUES (1, N'AL', N'Alabama')
INSERT INTO [dbo].[State] ([Id], [Code], [Name]) VALUES (2, N'AK', N'Alaska')
SET IDENTITY_INSERT [dbo].[State] OFF

取而代之的是,我想要一个字符串:

new List<State> 
{
    new State { Id = 1, Code = "AL", Name = "Alabama" },
    new State { Id = 2, Code = "AK", Name = "Alaska" }
};

我怎样才能实现它?

从 sql 脚本创建种子数据

对于 INSERT 语句(如您所说,您需要种子(,您可以创建如下所示的帮助程序方法:

public static List<State> ParseSqlScript(string sqlScriptPath)
    {
        using (var reader = new StreamReader(sqlScriptPath))
        {
            var sqlScript = reader.ReadToEnd();
            var pattern = @"INSERT INTO '[dbo'].'[State'] '('[Id'], '[Code'], '[Name']') VALUES ('(.*?'))";
            var regex = new Regex(pattern);
            var matches = regex.Matches(sqlScript);
            var states = new List<State>();
            foreach (Match match in matches)
            {
                var values = match.Groups[1].Value.Split(new [] { '(', ',',' ',')' }, StringSplitOptions.RemoveEmptyEntries);
                var id = int.Parse(values[0]);
                var code = values[1].Substring(2, values[1].Length - 3);
                var name = values[2].Substring(2, values[2].Length - 3);
                foreach (var value in values)
                {
                    var state = new State() { Id = id, Code = code, Name = name };
                    states.Add(state);
                }
            }
            return states;
        }
    }

如果您还需要其他 CRUD 语句,则可能需要熟悉一些 SQL 解析器,也许是 Microsoft.SqlServer.SMO。

尝试添加以下代码,我假设您正在使用实体框架:

List<State> states = new List<State>()  
            {  
                new State { Id = 1, Code = "AL", Name = "Alabama" },
                new State { Id = 2, Code = "AK", Name = "Alaska" }  
            }; 
StateDBEntities context = new StateDBEntities(); 
foreach (State state in states)  
            {  
                context.State.Add(state);  
            }  
            context.SaveChanges();
List<State> states = new List<State>();
    using (SqlConnection connection = new SqlConnection("conn_string"))
    {
        string query = "SELECT Id, Code, Name FROM State";
        using (SqlCommand command = new SqlCommand(query, connection))
        {
            using (SqlDataReader reader = command.ExecuteReader())
            {
                while (reader.Read())
                {
                    State state =  new State { Id = (int)reader["Id"], Code = reader["Code"].ToString(), Name = reader["Name"].ToString() };
                    states.Add(state);
                }
            }
        }
    }

调用选择查询(这里我正在编写查询,但应该避免使用,您可以使用存储过程(。使用 ExecuteReader 获取所有列,并将所有行添加到一个个列出。