C# 如何使用C操作原始字符串SQL语句#

C# 如何使用C操作原始字符串SQL语句#,c#,sql,string,C#,Sql,String,我正在传送一个数据库。我有6万行SQL insert语句。由于旧数据库中的某些字段不在新数据库中,因此我需要编辑已有的语句 例如: 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") 这个过程对于不同的表

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

例如:

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

但这个解决方案非常原始。我该如何解决这个问题呢?

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

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;
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
名称空间控制台EApp2
{
班级计划
{
静态void Main(字符串[]参数)
{
Console.WriteLine(“插入产品(名称、计数、品牌、类型、代码)值(\'Toys\',4,NULL,\'Child Toy\',\'T001');
Console.WriteLine(GetCorrectedInsertStatement(“插入产品(名称、计数、品牌、类型、代码)值(\'Toys\',4,NULL,\'Child Toy\',\'T001\”),“Brand”,“Code”);
}
私有静态字符串GetCorrectedInsertStatement(字符串sqlInput,参数字符串[]列存储移动)
{
string sqlOutput=string.Empty;
如果(columnssToRemove.Length==0)
{
返回sqlInput;
}
int indexOpenBracket=sqlInput.IndexOf('(');
//将带有INSERT的prepare sqlOutput复制到[表]({0})值({1})
sqlOutput=sqlInput.Substring(0,indexOpenBracket)+“({0})值({1})”;
//从sqlInput中删除[COLUMN]中的插入
sqlInput=sqlInput.Substring(indexOpenBracket,sqlInput.Length-indexOpenBracket);
int indexCloseBracket=sqlInput.IndexOf(');
//获取Coumn1,Column2,。。。
字符串tmpColumns=sqlInput.Substring(1,indexCloseBracket-1);
//拆分以获取所有列
List columns=tmpColumns.Split(',').ToList();
//从sqlInput中删除Coumn1,Column2
sqlInput=sqlInput.Substring(indexCloseBracket,sqlInput.Length-indexCloseBracket);
indexOpenBracket=sqlInput.IndexOf('(');
//从sqlInput中删除值
sqlInput=sqlInput.Substring(indexOpenBracket,sqlInput.Length-indexOpenBracket);
//将下一行从IndexOf更新为LastIndex of。
indexCloseBracket=sqlInput.LastIndexOf(');
//获取要从sqlInput插入的值
字符串tmpValues=sqlInput.Substring(1,indexCloseBracket-1);
//拆分以获取所有值
列表值=tmpValues.Split(',').ToList();
//删除不再需要的列和值
foreach(字符串列存储移动到列存储移动)
{
int indexToRemove=columns.IndexOf(columnToRemove);
columns.RemoveAt(indexToRemove);
值。移除(indexToRemove);
}
//将列和值插入sqlOutput
sqlOutput=string.Format(sqlOutput,string.Join(“,”,columns.ToArray()),string.Join(“,”,values.ToArray());
返回sqlOutput;
}
}
}

只需对表名进行一次更改,就可以使用现有语句

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

create view vwProduct as 
select  [Name], [Count], null as [Brand], [Type], null as [Code] from Product
现在,只需将
Product
更改为
vwProduct
,即可运行现有语句:

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

请注意,表有列,而不是字段。我不是专家,但如果你不知道更好的方法,为什么要调用一些基本的东西。。。请求帮助就足够了。。。只是一个注释…这些语句是生成的还是您手动编写的?您不能处理generator吗?这将在.sql文件中插入语句。我必须到新桌子上去。而我失败了:/你的问题是,因为它是你开始的方式,但鉴于它是什么,我会怎么做。。。按原样读取行,不在产品(名称、计数、品牌、类型、代码)值中插入
so values only,然后将它们转换为代码中键入的版本,然后您可以使用框架进行插入,或者使用所需的修改写入文本文件。或者只需使用记事本和手动即可。您的解决方案非常棒。但我坚持使用“秒”(字符。例如:值(转换为日期时间)(xxx))场景抛出错误。我怎么能否认这一点?@SametÖz:我对发布的代码做了一点小改动,以满足您的要求。
INSERT INTO vwProduct (Name,Count,Brand,Type,Code) VALUES ("Toys",4,NULL,"Child Toy","T001")