C# 无错误,但删除/更新查询在c中不起作用#
我正在从事一个项目,在该项目中,我使用的是Access 2007数据库(C# 无错误,但删除/更新查询在c中不起作用#,c#,ms-access-2007,C#,Ms Access 2007,我正在从事一个项目,在该项目中,我使用的是Access 2007数据库(.accdb),而不是SQL Server。为了执行CRUD操作,我使用MS Access的查询,因为我以前的代码是使用存储过程编写的。我还使用SQL事务 这是我的密码: public int OrderId { get; set; } public string OrderDate { get; set; } public int ServiceMode { get; set; } public string Delive
.accdb
),而不是SQL Server。为了执行CRUD操作,我使用MS Access的查询,因为我以前的代码是使用存储过程编写的。我还使用SQL事务
这是我的密码:
public int OrderId { get; set; }
public string OrderDate { get; set; }
public int ServiceMode { get; set; }
public string DeliveryDate { get; set; }
public int ClientId { get; set; }
public int TotalQty { get; set; }
public decimal TotalAmount { get; set; }
public int Discount { get; set; }
public decimal DiscAmount { get; set; }
public decimal NetTotal { get; set; }
public decimal Advance { get; set; }
public decimal Due { get; set; }
public bool Update(DataTable itemList)
{
using (var conn = new OleDbConnection(Sniper.ConnString))
{
conn.Open();
using (var trans = conn.BeginTransaction())
{
try
{
using (var cmd = new OleDbCommand())
{
cmd.Transaction = trans;
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
cmd.CommandText = string.Format("DELETE FROM OrderMaster WHERE OrderId={0}", OrderId);
cmd.ExecuteNonQuery();
cmd.CommandText = string.Format("DELETE FROM OrderDetails WHERE OrderId={0}", OrderId);
cmd.ExecuteNonQuery();
cmd.CommandText = string.Format("DELETE FROM OrderStatus WHERE OrderId={0}", OrderId);
cmd.ExecuteNonQuery();
}
using (var cmd = new OleDbCommand("qry_OrderMaster_Insert", conn))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Transaction = trans;
cmd.Parameters.AddWithValue("@OrderId", OrderId);
cmd.Parameters.AddWithValue("@OrderDate", OrderDate);
cmd.Parameters.AddWithValue("@ServiceMode", ServiceMode);
cmd.Parameters.AddWithValue("@DeliveryDate", DeliveryDate);
cmd.Parameters.AddWithValue("@ClientId", ClientId);
cmd.Parameters.AddWithValue("@TotalQty", TotalQty);
cmd.Parameters.AddWithValue("@TotalAmount", TotalAmount);
cmd.Parameters.AddWithValue("@Discount", Discount);
cmd.Parameters.AddWithValue("@DiscAmount", DiscAmount);
cmd.Parameters.AddWithValue("@NetTotal", NetTotal);
cmd.Parameters.AddWithValue("@Advance", Advance);
cmd.Parameters.AddWithValue("@Due", Due);
cmd.ExecuteNonQuery();
}
using (var cmd = new OleDbCommand("qry_OrderStatus_Insert", conn))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Transaction = trans;
cmd.Parameters.AddWithValue("@OrderId", OrderId);
cmd.Parameters.AddWithValue("@IsDelivered", 0);
cmd.Parameters.AddWithValue("@IsCancelled", 0);
cmd.ExecuteNonQuery();
}
foreach (DataRow row in itemList.Rows)
{
using (var cmd = new OleDbCommand("qry_OrderDetails_Insert", conn))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Transaction = trans;
cmd.Parameters.AddWithValue("@OrderId", OrderId);
cmd.Parameters.AddWithValue("@ItemId", row["ItemId"].ToInt());
cmd.Parameters.AddWithValue("@Qty", row["Qty"].ToInt());
cmd.Parameters.AddWithValue("@UnitPrice", row["UnitPrice"].ToPrice());
cmd.Parameters.AddWithValue("@Service", row["Service"].ToString());
cmd.Parameters.AddWithValue("@Remarks", row["Remarks"].ToString());
cmd.Parameters.AddWithValue("@SI", row["SI"].ToString());
cmd.Parameters.AddWithValue("@TotalPrice", row["TotalPrice"].ToString());
cmd.ExecuteNonQuery();
}
}
trans.Commit();
return true;
}
catch (Exception)
{
trans.Rollback();
return false;
}
}
此代码执行时没有任何错误,但它不会删除记录,也不会将记录作为重复记录插入。正如paul所说,我修复了这个问题。OrderId的值无效。不应使用“string.format”。您应该使用命名参数。 你可以写一个基本的验证器
if(this.OrderID <= 0)
{
throw new ArgumentOutOfRangeException("Please provide an OrderID");
}
OleDbCommand Command = new OleDbCommand();
Command.Connection = Connection;
OleDbParameter paramOrderId = new OleDbParameter();
Parameter1.OleDbType = OleDbType.VarChar;
Parameter1.ParamterName = "@OrderId";
Parameter1.Value = this.OrderID;
Command.Parameters.Add(paramOrderId );
if(this.OrderID)我看不到您在哪里设置了OrderID
,可能是您中断了代码并确认它设置为有效值了?非常感谢,您救了我的命。您正在混合DTO代码和方法。此代码无法进行单元测试。我将分离DTO部分(标量属性)对于DAL方法。