我正在尝试使用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();
}
}
答案 0 :(得分:6)
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();
}
}
注意:
camelCase
而不使用下划线Dispose
的冗余显式调用(因为using
语句已调用Dispose)答案 1 :(得分:3)
您使用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
数据块最终会在Dispose
上调用InsertCommand
- 这就是using
语句的作用。无需亲自致电Dispose
。
答案 2 :(得分:2)
如果使用using
语句,则不需要调用Dispose()
方法,它在内部调用,参数名称不同,在sql语句中为{{1参数部分中的@CCF_Number
。
答案 3 :(得分:1)
您将“ship_id”变量名称大写:
InsertCommand.Parameters.Add("@Ship_Id", SqlDbType.NVarChar, 10).Value = Ship_Id
答案 4 :(得分:1)
根据目前为止的答案和评论,您可以按如下方式重新构建代码:
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();
}
}
答案 5 :(得分:0)
另一方面,
而不是在如此多的操作中向SQLServer发送10000个Insert命令
当您可以创建一个将在单个操作中添加整个集合的脚本时。
认为它更有效。