C# 是否仅从insert语句字符串中提取值?

C# 是否仅从insert语句字符串中提取值?,c#,string,linq,c#-4.0,C#,String,Linq,C# 4.0,起初这可能看起来很奇怪,但我希望它有意义!我有一个mysql insert语句的列表,我对这些语句逐一进行迭代和执行,这可以正常工作,但我试图实现的是性能提升 例如,我希望在单个查询中传递所有值,而不是 INSERT INTO tb1(field1,field2,field3) VALUES (1,2,3); INSERT INTO tb1(field1,field2,field3) VALUES (4,5,6); INSERT INTO tb1(field1,field2,field3) VA

起初这可能看起来很奇怪,但我希望它有意义!我有一个mysql insert语句的
列表
,我对这些语句逐一进行迭代和执行,这可以正常工作,但我试图实现的是性能提升

例如,我希望在单个查询中传递所有值,而不是

INSERT INTO tb1(field1,field2,field3) VALUES (1,2,3);
INSERT INTO tb1(field1,field2,field3) VALUES (4,5,6);
INSERT INTO tb1(field1,field2,field3) VALUES (7,8,9);
我想做什么

INSERT INTO tb1(field1,field2,field3) VALUES (1,2,3), (4,5,6), (7,8,9);

因此,基本上我需要构建一个长的查询字符串,将第一个查询作为起点,并将括号部分从值添加到列表中对象计数的末尾,这可能吗?

这应该有效。我使用
regex
查找列和值,使用
string.Substring
查找表名。然后我将
string.Format
string.Join
和一个简单的Linq查询放在一起:

IEnumerable<string> inserts = // add your insert-strings here;
string firstInsert = inserts.First();
int tableIndex = firstInsert.IndexOf("INSERT INTO ") + "INSERT INTO ".Length;
string table = firstInsert.Substring(
    tableIndex, firstInsert.IndexOf("(", tableIndex) - tableIndex);
var regex = new System.Text.RegularExpressions.Regex(@"\(([^)]+)\)",System.Text.RegularExpressions.RegexOptions.Compiled);
string columns = regex.Matches(firstInsert)[0].Value;

IEnumerable<string> values = inserts.Select(sql => regex.Matches(sql)[1].Value);

string insertAll = string.Format("INSERT INTO {0}{1} VALUES {2};"
    , table
    , columns
    , string.Join(",", values));
IEnumerable inserts=//在此处添加插入字符串;
string firstInsert=inserts.First();
int tableIndex=firstInsert.IndexOf(“插入”)+“插入到”.Length;
string table=firstInsert.Substring(
tableIndex,firstInsert.IndexOf((“,tableIndex)-tableIndex);
var regex=new System.Text.RegularExpressions.regex(@“\([^)]+)\”,System.Text.RegularExpressions.RegexOptions.Compiled);
string columns=regex.Matches(firstInsert)[0]。值;
IEnumerable values=inserts.Select(sql=>regex.Matches(sql)[1].Value);
string insertAll=string.Format(“插入到{0}{1}值{2};”
桌子
、栏
,string.Join(“,”值));

使用您的示例数据。

这应该是可行的。我使用
regex
查找列和值,使用
string.Substring
查找表名。然后我将
string.Format
string.Join
和一个简单的Linq查询放在一起:

IEnumerable<string> inserts = // add your insert-strings here;
string firstInsert = inserts.First();
int tableIndex = firstInsert.IndexOf("INSERT INTO ") + "INSERT INTO ".Length;
string table = firstInsert.Substring(
    tableIndex, firstInsert.IndexOf("(", tableIndex) - tableIndex);
var regex = new System.Text.RegularExpressions.Regex(@"\(([^)]+)\)",System.Text.RegularExpressions.RegexOptions.Compiled);
string columns = regex.Matches(firstInsert)[0].Value;

IEnumerable<string> values = inserts.Select(sql => regex.Matches(sql)[1].Value);

string insertAll = string.Format("INSERT INTO {0}{1} VALUES {2};"
    , table
    , columns
    , string.Join(",", values));
IEnumerable inserts=//在此处添加插入字符串;
string firstInsert=inserts.First();
int tableIndex=firstInsert.IndexOf(“插入”)+“插入到”.Length;
string table=firstInsert.Substring(
tableIndex,firstInsert.IndexOf((“,tableIndex)-tableIndex);
var regex=new System.Text.RegularExpressions.regex(@“\([^)]+)\”,System.Text.RegularExpressions.RegexOptions.Compiled);
string columns=regex.Matches(firstInsert)[0]。值;
IEnumerable values=inserts.Select(sql=>regex.Matches(sql)[1].Value);
string insertAll=string.Format(“插入到{0}{1}值{2};”
桌子
、栏
,string.Join(“,”值));

使用示例数据。

以防插入到不同的表(或表中的列集)

将对每个表/列集进行一次插入(如果SQL是一致的)

也就是说,如果您为每一行向数据库发出单独的请求,您最大的性能节约可能就是

var singleRequest = String.Join("", perTableQueries.ToArray());

以防插入到不同的表(或表中的列集)

将对每个表/列集进行一次插入(如果SQL是一致的)

也就是说,如果您为每一行向数据库发出单独的请求,您最大的性能节约可能就是

var singleRequest = String.Join("", perTableQueries.ToArray());

除非你想做一些文本处理,我会说,看看列表的源代码,让值单独传递,然后构造sql。是的,你可以!请看这里-您不能将所有单个插入连接到一个查询中,然后一次性执行它吗,而不是单独执行每一行?@rawling是的,这就是我在这里试图实现的,因为我接收到的语句是单个语句,我宁愿像我所说明的那样批量处理它们above@stephen我已经知道,哈哈,这就是我想做的!只需要将单个语句转换为这种格式,但无论如何都要进行排序-请参阅tims Answer除非您想进行一些文本处理,我要说的是,查看列表源以单独传递值,然后构造sql。是的,您可以!请看这里-您不能将所有单个插入连接到一个查询中,然后一次性执行它吗,而不是单独执行每一行?@rawling是的,这就是我在这里试图实现的,因为我接收到的语句是单个语句,我宁愿像我所说明的那样批量处理它们above@stephen我已经知道,哈哈,这就是我想做的!只需要将单个语句转换为这种格式,但无论如何都要进行排序-参见tims answer我将此标记为答案,我稍微修改了代码以解析我端的语句和值,但这或多或少是非常感谢Tim:)我将此标记为答案,我稍微修改了代码,以解析我这一端的语句和值,但这或多或少是非常感谢Tim:)