如何使用C#处理原始字符串SQL语句

问题描述 投票:0回答:2

我正在传输数据库。我有6万行SQL插入语句。由于旧数据库中的某些字段不在新数据库中,因此我需要编辑已有的语句。

例如:

INSERT INTO Product (Name,Count,Brand,Type,Code) VALUES ("Toys",4,NULL,"Child Toy","T001")

新数据库的表达式应为:

INSERT INTO Product (Name,Count,Type,) VALUES ("Toys",4,"Child Toy")

此过程对不同的表结构也有效,因此我正在寻找一种永久解决方案。

我写这个解决方案:

string s="INSERT INTO Product (Name,Count,Brand,Type,Code) VALUES ("Toys",4,NULL,"Child Toy","T001")"

s.Replace("Code", "");

Console.WriteLine(s);

但是此解决方案非常原始。我该如何解决?

c# sql string
2个回答
0
投票

您只需更改表名就可以使用现有语句。

首先,创建一个视图和一个触发器:

create view vwProduct as 
select  [Name], [Count], null as [Brand], [Type], null as [Code] from Product
create trigger ProductTrigger on vwProduct
instead of insert
as
begin
    insert into Product
    select [Name], [Count], [Type] from inserted
end;

现在您只需将Product更改为vwProduct,就可以运行现有语句:

INSERT INTO vwProduct (Name,Count,Brand,Type,Code) VALUES ("Toys",4,NULL,"Child Toy","T001")

0
投票

我写了一个小巧的控制台应用程序,可以解决问题...

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("INSERT INTO Product (Name,Count,Brand,Type,Code) VALUES (\"Toys\",4,NULL,\"Child Toy\",\"T001\")");
            Console.WriteLine(GetCorrectedInsertStatement("INSERT INTO Product (Name,Count,Brand,Type,Code) VALUES (\"Toys\",4,NULL,\"Child Toy\",\"T001\")", "Brand", "Code"));

        }

        private static string GetCorrectedInsertStatement(string sqlInput, params string[] columnssToRemove)
        {
            string sqlOutput = string.Empty;

            if (columnssToRemove.Length == 0)
            {
                return sqlInput;
            }

            int indexOpenBracket = sqlInput.IndexOf('(');

            // Copy prepare sqlOutput with INSERT INTO [Table] ({0}) VALUES ({1})
            sqlOutput = sqlInput.Substring(0, indexOpenBracket) + "({0}) VALUES ({1})";

            // Remove INSERT INTO [COLUMN] from sqlInput
            sqlInput = sqlInput.Substring(indexOpenBracket, sqlInput.Length - indexOpenBracket);

            int indexCloseBracket = sqlInput.IndexOf(')');

            // Get Coumn1,Column2,... 
            string tmpColumns = sqlInput.Substring(1, indexCloseBracket - 1);

            // Split to get all columns
            List<string> columns = tmpColumns.Split(',').ToList();

            // Remove Coumn1,Column2,... from sqlInput
            sqlInput = sqlInput.Substring(indexCloseBracket, sqlInput.Length - indexCloseBracket);

            indexOpenBracket = sqlInput.IndexOf('(');

            // Remove VALUES from sqlInput
            sqlInput = sqlInput.Substring(indexOpenBracket, sqlInput.Length - indexOpenBracket);

//UPDATED the next line from IndexOf to LastIndex of.
            indexCloseBracket = sqlInput.LastIndexOf(')');

            // Get values to insert from sqlInput
            string tmpValues = sqlInput.Substring(1, indexCloseBracket - 1);

            // Split to get all values
            List<string> values = tmpValues.Split(',').ToList();

            // remove the columns and values that are no longer needed
            foreach (string columnToRemove in columnssToRemove)
            {
                int indexToRemove = columns.IndexOf(columnToRemove);
                columns.RemoveAt(indexToRemove);
                values.RemoveAt(indexToRemove);
            }

            // insert the columns and values into the sqlOutput
            sqlOutput = string.Format(sqlOutput, string.Join(", ", columns.ToArray()), string.Join(", ", values.ToArray()));
            return sqlOutput;
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.