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