C# 使用事务对SQLite进行批更新
使用C# 使用事务对SQLite进行批更新,c#,system.data.sqlite,microsoft.data.sqlite,C#,System.data.sqlite,Microsoft.data.sqlite,使用Microsoft.Data.Sqlite在循环中将产品添加到Sqlite数据库时出错。错误: Must add values for the following parameters: @ItemCode, @ItemCost, @ItemDescription, @LocationId, @ReorderStockLevel, @ReservedStockLevel, @StockLevel, @StockIt, @SupplierId 在我的代码中,我尝试遵循和的示例 对cmd.Ex
Microsoft.Data.Sqlite
在循环中将产品添加到Sqlite数据库时出错。错误:
Must add values for the following parameters: @ItemCode, @ItemCost, @ItemDescription, @LocationId, @ReorderStockLevel, @ReservedStockLevel, @StockLevel, @StockIt, @SupplierId
在我的代码中,我尝试遵循和的示例
对cmd.ExecuteNonQuery()
的第一个调用将触发。在第二次迭代中输入foreach(newItems中的Product newItem)
时抛出异常。使用和不使用cmd.Prepare()
数据库中未输入任何产品。数据库连接配置正确,因为一次可以在数据库行中输入产品
如何更新事务中的项目列表?插入
sql
以两个右括号结束<代码>插入到…)代码>。检查一下out@dr.null谢谢你提醒我注意双括号。那是写问题时的一个打字错误。我对sql进行了编辑,希望它更清晰。不确定是否相关,但cmd.Prepare()应该在循环之外调用一次。@DavidBrowne Microsoft感谢您的建议。我已将cmd.Prepare
移到“foreach”循环之外。错误是,必须将sql中的@
符号替换为$
符号。插入sql
以两个右括号结束<代码>插入到…)代码>。检查一下out@dr.null谢谢你提醒我注意双括号。那是写问题时的一个打字错误。我对sql进行了编辑,希望它更清晰。不确定是否相关,但cmd.Prepare()应该在循环之外调用一次。@DavidBrowne Microsoft感谢您的建议。我已将cmd.Prepare
移到“foreach”循环之外。错误是,必须将sql中的@
符号替换为$
符号。
using (SqliteConnection con = new(DataService.SqliteConnectionString))
{
con.Open();
using (SqliteTransaction transaction = con.BeginTransaction())
{
using (SqliteCommand cmd = con.CreateCommand())
{
cmd.CommandText =
$"INSERT INTO Products
(
ItemCode,
ItemCost,
ItemDescription,
LocationId,
ReorderStockLevel,
ReservedStockLevel,
StockLevel,
StockIt,
SupplierId
)
VALUES
(
@ItemCode,
@ItemCost,
@ItemDescription,
@LocationId,
@ReorderStockLevel,
@ReservedStockLevel,
@StockLevel,
@StockIt,
@SupplierId
)";
SqliteParameter itemCodeParam = cmd.CreateParameter();
itemCodeParam.ParameterName = "$ItemCode";
cmd.Parameters.Add(itemCodeParam);
SqliteParameter itemCostParam = cmd.CreateParameter();
itemCostParam.ParameterName = "$ItemCost";
cmd.Parameters.Add(itemCostParam);
SqliteParameter itemDescriptionParam = cmd.CreateParameter();
itemDescriptionParam.ParameterName = "$ItemDescription";
cmd.Parameters.Add(itemDescriptionParam);
SqliteParameter locationIdParam = cmd.CreateParameter();
locationIdParam.ParameterName = "$LocationId";
cmd.Parameters.Add(locationIdParam);
SqliteParameter reorderStockLevelParam = cmd.CreateParameter();
reorderStockLevelParam.ParameterName = "$ReorderStockLevel";
cmd.Parameters.Add(reorderStockLevelParam);
SqliteParameter reservedStockLevelParam = cmd.CreateParameter();
reservedStockLevelParam.ParameterName = "$ReservedStockLevel";
cmd.Parameters.Add(reservedStockLevelParam);
SqliteParameter stockLevelParam = cmd.CreateParameter();
stockLevelParam.ParameterName = "$StockLevel";
cmd.Parameters.Add(stockLevelParam);
SqliteParameter stockItParam = cmd.CreateParameter();
stockItParam.ParameterName = "$StockIt";
cmd.Parameters.Add(stockItParam);
SqliteParameter supplierIdParam = cmd.CreateParameter();
supplierIdParam.ParameterName = "$SupplierId";
cmd.Parameters.Add(supplierIdParam);
foreach (Product newItem in newItems)
{
itemCodeParam.Value = newItem.ItemCode;
itemCostParam.Value = newItem.ItemCost;
itemDescriptionParam.Value = newItem.ItemDescription;
locationIdParam.Value = newItem.LocationId;
reorderStockLevelParam.Value = newItem.ReorderStockLevel;
reservedStockLevelParam.Value = newItem.ReservedStockLevel;
stockItParam.Value = newItem.StockIt;
stockLevelParam.Value = newItem.StockLevel;
supplierIdParam.Value = newItem.SupplierId;
cmd.ExecuteNonQuery();
}
cmd.Prepare();
transaction.Commit();
}
}
}