使用C#循环遍历多个SQL插入语句

时间:2013-12-12 17:30:19

标签: c# sql sql-server-2008

我试图遍历一个包含多个insert语句的SQL文件。我想检查每个单独的语句,因为有可能有重复的主键。使用C#以编程方式完成此任务的最佳方法是什么?

对于重复项,我需要跳过该查询并将密钥(代码)添加到Excel文件中。

SQL查询示例:

INSERT [dbo].[JuryInstructions] ([Code], [Description], [InstructionText], [EnterUserID], [EnterDate], [UpdateUserID], [UpdateDate], [Type], [InstructionNumber]) VALUES (N'1000A', N'GENERAL INSTRUCTIONS', N'', N'I', NULL)
INSERT [dbo].[JuryInstructions] ([Code], [Description], [InstructionText], [Type], [InstructionNumber]) VALUES (N'1001', N'Introduction', N'', N'I', NULL)

3 个答案:

答案 0 :(得分:1)

到目前为止,最简单的方法是分别针对数据库服务器运行每个insert语句。如果出现关于主键冲突的错误,则将该特定行存储在日志文件中。

答案 1 :(得分:1)

确定。我很快就将一段简单的代码拼凑在一起,这些代码块可以为您提供构建解决方案的基础。有更多高级方法可以做到这一点,但我尽量保持这个简单。您应该能够通过一些工作来构建一个能够满足您需求的解决方案。如果有什么不清楚的地方,请随时问我。

        //open the text file for reading
        using (TextReader tr = new StreamReader("Filepath"))
        {
            try
            {
                // read line from text file
                string query = tr.ReadLine();
                // split the string on the commas to make it easier to find the key value
                string[] queryArray = query.Split(',');
                int beginingOfKeyIndex = queryArray[8].IndexOf('\'') + 1; // add one because we don't want the '
                // get the key value from the correct array element
                string keyValue = queryArray[8].Substring(beginingOfKeyIndex, queryArray.Length - beginingOfKeyIndex);
            }
            catch (IOException)
            {
                // we get here when it tries to read beyond end of file or there is some other issue.
                throw;
            }
        }

答案 2 :(得分:0)

我没有花时间编写正则表达式来解析密钥字段(也不确定样本SQL是关键字段的哪个字段)。

以下是一些可以帮助您入门的代码:

        try
        {
            Hashtable htKeys = new Hashtable();
            List<string> sqlToExecute = new List<string>();         

            IEnumerable<string> lines = File.ReadLines("path-to-your-file.sql");
            foreach (string line in lines)
            {
                // parse out key field here
                string keyfield = RegExToFindYourValue(line);

                if (!htKeys.ContainsKey(keyfield)) 
                {
                    sqlToExecute.Add(line);             
                    htKeys.Add(keyfield, line);
                }
                else
                {
                  // duplicate key, handle here.
                }
            }

        }
        catch (Exception e)
        {
            Console.WriteLine("The file could not be read:");
            Console.WriteLine(e.Message);
        }