2010-12-30 5 views
0

ここ数年はストーカーになっていますが、これは私が作った最初の投稿です。うまくいけば、それはここで終わらず、より楽観的に将来の投稿が実際に私を誰かに手を差し伸べようとしているかもしれない、私はこのコミュニティにずっと謝っている。SQL Server 2008 R2のトランザクションをASP.Netから更新しないでください

今、私がしようとしているのは単純で、おそらくそれが働いていないのは私自身の愚かさです。しかし、私はここで困っている。

SQL Server 2008 R2データベースと対話するASP.Net Webサイトで作業しています。これまではすべてが大丈夫でしたが、行(またはそれ以上)を更新するだけでは機能しません。私はこのサイトや他のサイトからコードをコピーして貼り付けることを試みましたが、それは常に同じことです。

簡潔に:updateコマンドが実行されたときに例外やエラーは表示されません(影響を受ける行の正確な数が示されます)が、データベースに実際に変更は加えられません。私はこれを試してみた

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. 複数の更新コマンドを1つのトランザクションとして収集する最良の方法は何ですか?

ご協力いただきありがとうございます。

編集:

私はそれだけで私のミスを把握するために私に5分かかりました。この時間を引き起こす昨日いくつかの睡眠を欠けていたようです。

明らかに更新が正しく機能していましたが、テキストボックスの値がPage_Loadで上書きされていたことに気づきませんでした。何らかの理由で私はこの部分をコメントしました:

if (IsPostBack) 
    return; 

質問の2番目の部分はまだ立っています。しかし、私は自分の質問に対する回答としてこれを投稿するのか、それともこのように保つべきですか?

答えて

0

データベースに対して直接クエリを実行しようとしましたか(つまり、SQL Management Studio自体)? ASPから「START TRANSACTION ... COMMIT TRANSACTION」コマンドをどのように実装すればよいか分かりません...ストアドプロシージャ内からすべてのデータベース操作を実行する価値があるのです。

+0

私は予想より速かった!コマンドは管理スタジオで完全に機能します。そして私はそれを投稿した直後にストアドプロシージャを使ってこれを行うことを考え始めました。それは私が働いている人々が手順の大きなファンではないので、私はそれを避けようとしていただけです。 – Amarus

関連する問題