Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何正确清理(或参数化)SQL压缩Insert语句_C#_Linq To Sql_Sql Server 2008_Insert - Fatal编程技术网

C# 如何正确清理(或参数化)SQL压缩Insert语句

C# 如何正确清理(或参数化)SQL压缩Insert语句,c#,linq-to-sql,sql-server-2008,insert,C#,Linq To Sql,Sql Server 2008,Insert,EDIT请注意,该语句不是一次插入。它使用foreach块插入多个值数组 StringBuilder sbSQL = new StringBuilder( "INSERT INTO [table] ([fk_id], [Description], [Title] ) VALUES"); foreach(var item in items) { sbSQL.AppendFormat("({0},'{1}','{2}'),", item.fk_id, item.

EDIT请注意,该语句不是一次插入。它使用
foreach
块插入多个值数组

StringBuilder sbSQL = 
  new StringBuilder(
    "INSERT INTO [table] ([fk_id], [Description], [Title] ) VALUES");

foreach(var item in items) {
    sbSQL.AppendFormat("({0},'{1}','{2}'),", 
      item.fk_id, item.description, item.title)
}

myDataContext.ExecuteCommand(sbSQL.Remove(sbSQL.Length - 1, 1).ToString());
myDataContext.SubmitChanges();

我真的很想使用这种方法,因为它将DB插入速度提高了2倍。但我不知道应该如何将其参数化。

使用参数化查询

public int ExecuteCommand(
    string command,
    params Object[] parameters
)
例如:

List myList=new List();
myList.添加(“MyName”);
myList.Add(“我的地址”);
StringBuilder queryInsert=新建StringBuilder();
Append(“插入客户(名称、地址)值({0},{1})”;
this.myDataContext.ExecuteCommand(queryInsert.ToString(),myList.ToArray();)

使用参数化查询

public int ExecuteCommand(
    string command,
    params Object[] parameters
)
例如:

List myList=new List();
myList.添加(“MyName”);
myList.Add(“我的地址”);
StringBuilder queryInsert=新建StringBuilder();
Append(“插入客户(名称、地址)值({0},{1})”;
this.myDataContext.ExecuteCommand(queryInsert.ToString(),myList.ToArray();)
请看(SQLServer2008的新增功能)-这些功能允许您一次性传递所有值

唯一的问题是,这些都没有烘焙到Linq2SQL中,因此您需要提供自己的方法

有关示例,请参阅博客文章。

查看(SQL Server 2008新增)-这些允许您一次性传递所有值

唯一的问题是,这些都没有烘焙到Linq2SQL中,因此您需要提供自己的方法


例如,请参阅博客帖子。

我开始写评论,但时间太长了

LINQtoSQL中的参数化查询应该适合您。大概是这样的:

StringBuilder sbSQL = new StringBuilder(
       "INSERT INTO [table] ([fk_id], [Description], [Title] ) VALUES");

int paramNum = 0;
List<object> paramValues = new List<object>();

foreach(var item in items) 
{
    sbSQL.AppendFormat("({{{0}}},{{{1}}},{{{2}}}),", 
        paramNum, 
        paramNum + 1, 
        paramNum + 2);

    paramValues.Add(item.fk_id);
    paramValues.Add(item.description);
    paramValues.Add(item.title);

    paramNum += 3;
}

myDataContext.ExecuteCommand(
    sbSQL.Remove(sbSQL.Length - 1, 1).ToString(), 
    paramValues.ToArray());
StringBuilder sbSQL=新建StringBuilder(
“插入[表格]([fk_id]、[说明]、[标题])值”);
int paramNum=0;
列表参数值=新列表();
foreach(项目中的var项目)
{
AppendFormat(“({{{0}},{{{1}}},{{{2}},”,
paramNum,
paramNum+1,
paramNum+2);
paramValues.Add(item.fk_id);
参数值。添加(项目说明);
参数值。添加(项目名称);
paramNum+=3;
}
myDataContext.ExecuteCommand(
sbSQL.Remove(sbSQL.Length-1,1).ToString(),
paramValues.ToArray());

该函数只接受SQL命令,并带有与标准.NET字符串格式函数兼容的标记(
{0}
),然后将传递的值转换为参数,并使用其生成的参数名代替标记。由您自己编写命令并按照自己的喜好安排参数;它不会检查或解析命令。

我开始写评论,但这太长了

LINQtoSQL中的参数化查询应该适合您。大概是这样的:

StringBuilder sbSQL = new StringBuilder(
       "INSERT INTO [table] ([fk_id], [Description], [Title] ) VALUES");

int paramNum = 0;
List<object> paramValues = new List<object>();

foreach(var item in items) 
{
    sbSQL.AppendFormat("({{{0}}},{{{1}}},{{{2}}}),", 
        paramNum, 
        paramNum + 1, 
        paramNum + 2);

    paramValues.Add(item.fk_id);
    paramValues.Add(item.description);
    paramValues.Add(item.title);

    paramNum += 3;
}

myDataContext.ExecuteCommand(
    sbSQL.Remove(sbSQL.Length - 1, 1).ToString(), 
    paramValues.ToArray());
StringBuilder sbSQL=新建StringBuilder(
“插入[表格]([fk_id]、[说明]、[标题])值”);
int paramNum=0;
列表参数值=新列表();
foreach(项目中的var项目)
{
AppendFormat(“({{{0}},{{{1}}},{{{2}},”,
paramNum,
paramNum+1,
paramNum+2);
paramValues.Add(item.fk_id);
参数值。添加(项目说明);
参数值。添加(项目名称);
paramNum+=3;
}
myDataContext.ExecuteCommand(
sbSQL.Remove(sbSQL.Length-1,1).ToString(),
paramValues.ToArray());

该函数只接受SQL命令,并带有与标准.NET字符串格式函数兼容的标记(
{0}
),然后将传递的值转换为参数,并使用其生成的参数名代替标记。由您自己编写命令并按照自己的喜好安排参数;它不会检查或分析命令。

什么是
myDataContext
?LINQ到SQL上下文?实体框架上下文?什么是myDataContext?LINQ到SQL上下文?实体框架上下文?请注意,它不是一个insert语句,而是许多insert语句(通常约为12k)。它将一个foreach封装在附加到insert的值数组周围。鉴于您正在向它传递一个与
string.Format
兼容的查询(因此出现了
{0}
{1}
,等等),我看不出如果将它分解为多个值集会有什么不同。看起来上下文只是在创建命令和参数,然后将参数名传递到
字符串。Format
(或类似的东西)来格式化命令。@Adam-多个insert语句比一个insert语句花费的时间更长。@Jeremy:我不是说你应该使用多个insert语句。带我解释的评论太长了;请参阅我发布的答案。请注意,它不是一个insert语句,而是许多insert语句(通常约12k)。它将一个foreach封装在附加到insert的值数组周围。鉴于您正在向它传递一个与
string.Format
兼容的查询(因此出现了
{0}
{1}
,等等),我看不出如果将它分解为多个值集会有什么不同。看起来上下文只是在创建命令和参数,然后将参数名传递到
字符串。Format
(或类似的东西)来格式化命令。@Adam-多个insert语句比一个insert语句花费的时间更长。@Jeremy:我不是说你应该使用多个insert语句。带我解释的评论太长了;看我贴的答案。我不明白你之前的意思。我认为这就是解决办法!我不明白你以前的意思。我认为这就是解决办法!