using子句中的C#Foreach值
本文关键字:C#Foreach 子句 using | 更新日期: 2023-09-27 18:20:21
我试图使用foreach控件循环遍历字符串数组,然后使用每个值在数据库中插入信息。有人能帮我理解为什么在using子句中我不能使用foreach变量吗?
string[] ship_ids = ShipsInScope.Split('|');
foreach (string ship_id in ship_ids)
{
using (SqlCommand InsertCommand = new SqlCommand("insert into PROJECT_SHIP (CR_Number, Ship_Id) VALUES (@CR_Number, @CCF_Number)", DBConn))
{
InsertCommand.Parameters.Add("@CR_Number", SqlDbType.NVarChar, 10).Value = CRNumber;
InsertCommand.Parameters.Add("@Ship_Id", SqlDbType.NVarChar, 10).Value = Ship_Id;
InsertCommand.ExecuteNonQuery();
InsertCommand.Dispose();
}
}
C#区分大小写。您的迭代变量是ship_id
,但您正试图在循环中使用Ship_Id
。
理想情况下,使用C#命名约定(对于其他变量也是如此):
// Declared outside the method.
private const string InsertSql =
"insert into PROJECT_SHIP (CR_Number, Ship_Id) " +
"VALUES (@CR_Number, @CCF_Number)";
...
string[] shipIds = ShipsInScope.Split('|');
foreach (string shipId in shipIds)
{
using (SqlCommand command = new SqlCommand(InsertSql, connection))
{
command.Parameters.Add("@CR_Number", SqlDbType.NVarChar, 10)
.Value = crNumber; // Unclear what this means
command.Parameters.Add("@Ship_Id", SqlDbType.NVarChar, 10)
.Value = shipId;
command.ExecuteNonQuery();
}
}
注:
- 已将常量SQL提取为类级常量。没有必要,但可能会澄清问题
- 将所有变量重命名为不带下划线的
camelCase
- StackOverflow的换行符-您的代码中可能不需要那么多换行
- 删除了对
Dispose
的冗余显式调用(因为using
语句已经调用Dispose)
您使用的是Ship_id
而不是ship_id
。C#区分大小写。
string[] ship_ids = ShipsInScope.Split('|');
foreach (string ship_id in ship_ids)
{
using (SqlCommand InsertCommand = new SqlCommand("insert into PROJECT_SHIP (CR_Number, Ship_Id) VALUES (@CR_Number, @CCF_Number)", DBConn))
{
InsertCommand.Parameters.Add("@CR_Number", SqlDbType.NVarChar, 10).Value = CRNumber;
InsertCommand.Parameters.Add("@Ship_Id", SqlDbType.NVarChar, 10).Value = ship_Id;
InsertCommand.ExecuteNonQuery();
}
}
此外,using
块最终将在InsertCommand
上调用Dispose
——using
语句就是这样做的。无需自己致电Dispose
。
如果您使用的是using
语句,则不需要调用Dispose()
方法,它在内部调用,并且参数的名称不同,在sql语句中为@CCF_Number
,在parameters部分为@Ship_Id
。
您将"ship_id"变量名大写:
InsertCommand.Parameters.Add("@Ship_Id", SqlDbType.NVarChar, 10).Value = Ship_Id
根据到目前为止的答案和注释,您可以按如下方式重新构建代码:
const string sql = @"
INSERT INTO PROJECT_SHIP (CR_Number, Ship_Id)
VALUES (@CR_Number, @Ship_Id)";
using (SqlCommand InsertCommand = new SqlCommand(sql, DBConn))
{
var parameters = InsertCommand.Parameters;
var crNumberParameter = parameters.Add("@CR_Number", SqlDbType.NVarChar, 10);
var shipIdParameter = parameters.Add("@Ship_Id", SqlDbType.NVarChar, 10);
string[] ship_ids = ShipsInScope.Split('|');
foreach (string ship_id in ship_ids)
{
crNumberParameter.Value = CRNumber;
shipIdParameter.Value = ship_id;
InsertCommand.ExecuteNonQuery();
}
}
另一方面,
而不是在这么多操作中向SQLServer发送10000个Insert命令
当您可以创建一个脚本,在一个操作中添加整个集合时。
认为它更有效。