2010-12-30 3 views
0

여기 몇 달 동안 스토커로 일해 왔지만 이것은 제가 작성한 첫 번째 게시물입니다. 다행히도, 여기서 끝나지 않을 것이고 더 낙관적 인 미래의 게시물이 실제로 다른 사람에게 손을 뻗으려고 노력할 수도 있습니다. 나는이 공동체에 그토록 더 많은 것을 빚지고 있습니다.ASP.Net에서 SQL Server 2008 R2의 트랜잭션을 업데이트하지 못합니다.

지금 내가하려는 것은 간단하고 그 이유는 내 자신의 어리 석음 때문입니다. 그러나, 나는 여기에서 곤란하다.

SQL Server 2008 R2 데이터베이스와 상호 작용하는 ASP.Net 웹 사이트에서 작업하고 있습니다. 지금까지 모든 것이 괜찮아졌지만 행을 업데이트하는 것만으로는 효과가 없습니다. 이 사이트와 다른 사이트에서 코드 복사 및 붙여 넣기를 시도해 보았지만 항상 똑같습니다.

요약 : 업데이트 명령이 실행될 때 예외가 발생하지 않으며 (영향을받는 행의 정확한 수를 제공 할 수도 있음) 데이터베이스에 변경 사항이 실제로 적용되지 않습니다. 나는 이것을 시도했습니다

protected void btSubmit_Click(object sender, EventArgs e) 
{ 
    using (SqlConnection connection = 
     new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString)) 
    { 
     string commandString = "UPDATE [impoundLotAlpha].[dbo].[Vehicle]" + 
             "SET [VehicleMake] = @VehicleMake" + 
              " WHERE [ComplaintID] = @ComplaintID"; 
     using (SqlCommand command = new SqlCommand(commandString, connection)) 
     { 
      SqlTransaction transaction = null; 
      try 
      { 
       command.Connection.Open(); 
       transaction = connection.BeginTransaction(IsolationLevel.Serializable); 
       command.Transaction = transaction; 

       SqlParameter complaintID = new SqlParameter("@complaintID", SqlDbType.Int); 
       complaintID.Value = HttpContext.Current.Request.QueryString["complaintID"]; 
       command.Parameters.Add(complaintID); 

       SqlParameter VehicleMake = new SqlParameter("@VehicleMake", SqlDbType.VarChar, 20); 
       VehicleMake.Value = tbVehicleMake.Text; 
       command.Parameters.Add(VehicleMake); 

       command.ExecuteNonQuery(); 

       transaction.Commit(); 
      } 
      catch 
      { 
       transaction.Rollback(); 
       throw; 
      } 
      finally 
      { 
       connection.Close(); 
      } 
     } 
    } 
} 

: 여기

내 코드의 단순화 된 버전 (원래는 더 명령과 매개 변수 각각의 톤을 가지고 있지만,이 같은 때에도 작동하지 않음)입니다 "SqlTransaction"물건과 그것없이 아무것도 변경되지 않습니다. 또한 한 번에 여러 업데이트를 수행하기 때문에 단일 트랜잭션으로 작동하도록하고 싶습니다. System.Transactions 네임 스페이스 (CommittableTransaction, TransactionScope ...)에 포함 된 클래스를 사용하여이 작업을 수행 할 수 있음을 발견했습니다.

내가 찾을 수있는 모든 것을 시도했지만 다른 결과를 얻지 못했습니다. 다음과 같이

의 Web.config의 연결 문자열은 다음과 같습니다

<connectionStrings> 
    <add name="ApplicationServices" 
     connectionString="Data Source=localhost;Initial Catalog=ImpoundLotAlpha;Integrated Security=True" 
     providerName="System.Data.SqlClient"/> 
</connectionStrings> 

그래서, tldr; 버전 :

  1. 해당 레코드 업데이트 시도로 수행 한 실수는 무엇입니까? (비슷한 문제가있는 경우 아래에서 확인하십시오.)
  2. 여러 업데이트 명령을 단일 트랜잭션으로 수집하는 가장 좋은 방법은 무엇입니까?

어떤 종류의 도움이나 제안을 보내 주셔서 감사합니다.

편집 :

내가 단지 내 실수를 알아 내기 위해 나에게 5 분했다이 시간의 원인이 어제 잠을 부족한 것 같다.

분명히 업데이트가 제대로 작동했지만 텍스트 값이 Page_Load에서 덮어 쓰여지고 있음을 알 수 없었습니다. 웬일인지 나는이 부분을 해설했다 :

if (IsPostBack) 
    return; 

두 번째 부분은 여전히 ​​의미한다. 하지만이 질문을 내 질문에 대한 답변으로 게시하거나 그대로 유지해야합니까?

답변

0

데이터베이스 (예 : SQL Management Studio 자체)에 대해 직접 쿼리를 실행 해 보았습니까? ASP에서 "START TRANSACTION ... COMMIT TRANSACTION"명령을 구현하는 방법을 확신하지 못합니다. 스토어드 프로 시저 내에서 모든 데이터베이스 작업을 수행하는 것이 중요합니다.

+0

내가 예상했던 것보다 빠르다! 명령은 관리 스튜디오에서 완벽하게 작동합니다. 그리고 저장 프로 시저를 게시 한 직후 저장 프로 시저를 사용하여이 작업을 수행하기 시작했습니다. 그것은 제가 일하는 사람들이 절차의 큰 팬이 아니므로 그것을 피하려고했습니다. – Amarus