2015-01-27 2 views
0

SQL Server 대신 Access 2007 데이터베이스 (.accdb)를 사용중인 프로젝트에서 작업하고 있습니다. CRUD 작업을 수행하기 위해 필자는 저장 프로 시저를 사용하여 작성한 이전 코드부터 MS Access의 쿼리를 사용하고 있습니다. 그리고 SQL 트랜잭션도 사용하고 있습니다.오류는 없지만 삭제/업데이트 쿼리가 작동하지 않습니다. C#

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; 
        } 
       } 

이 코드는 오류없이 실행하지만이 기록은 삭제되지 않습니다뿐만 아니라 중복 레코드로 레코드를 삽입하지 않습니다

여기 내 코드입니다.

+1

'OrderId'를 어디에 설정했는지 알 수 없습니다. 코드를 중단하고 유효한 값으로 설정되어있는 것으로 확인 되었습니까? – paul

+0

고마워, 너 내 목숨을 구했어. –

+0

DTO 코드와 메소드를 혼합합니다. 이 코드는 단위 테스트가 불가능합니다. 필자는 DAL 방법보다 DTO 파트 (스칼라 속성)를 분리했습니다. – granadaCoder

답변

0

폴 문제가 해결되었습니다. OrderId의 값이 유효하지 않습니다.

0

"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); 
관련 문제