从sql脚本创建种子数据

时间:2016-11-09 16:18:11

标签: c# sql-server regex orm mapping

我在我的项目中使用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" }
};

我怎样才能实现它?

3 个答案:

答案 0 :(得分:1)

对于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 Parser,可能是Microsoft.SqlServer.SMO。

答案 1 :(得分:0)

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

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();

答案 2 :(得分:0)

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);
                }
            }
        }
    }

调用select查询(这里我写了查询,但应该避免,你可以使用存储过程)。使用ExecuteReader获取所有列,并逐个列出所有行。