2009-08-13 13 views
0

いずれかが、私はADO.NETを使用して、このプログラムでエラーを識別するのに役立ちます...私のADO.NETコードで何が問題になっていますか?

コード:

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Data; 
using System.Data.SqlClient; 
using System.Transactions; // the code is showing an error in this line 

class Program 
{ 
    static void Main(string[] args) 
    { 
    try 
    { 
     string connectString = "Initial Catalog=AdventureWorks; 
           Data Source=SQLSERVER01; 
           User id =user;password=password"; 
     SqlConnection con = new SqlConnection(); 
     con.ConnectionString = connectString; 

     con.Open(); 

     SqlTransaction tr = null; 
     tr = con.BeginTransaction(); 

     SqlCommand cmd = new SqlCommand("INSERT INTO sunny1(name, id, city, phone, pincode) VALUES ('sandy', 01441, 'abc', 'phone', 122001)", con, tr); 
     cmd.ExecuteNonQuery(); 
     tr.Commit(); 

     Console.WriteLine("transaction completed "); 
    } 
    catch (SqlException e) 
    { 
     tr.Rollback(); 
     Console.WriteLine("teansaction not completed " + e.Message); 
    } 
    catch (System.Exception ex) 
    { 
     Console.WriteLine("system error " + ex.Message); 
    } 
    finally 
    { 
     cn.Close(); 
    } 

    Console.ReadLine(); 
} 
} 

コードもいくつか不足しているアセンブリに関連したエラーメッセージが表示されます。

+0

あなたがのために、任意の特定の理由はあります – marcgg

+0

任意の有用な答えを得ることはありません、他のより詳細な情報を与える必要がありますかタイトルにすべての帽子を書く? – hlovdal

答えて

4

のリストから、「System.Transactionsの」を選択します。とSqlCommandusing()ブロックにあります。これにより、生存期間の終わりに処分され、バグを避けることが保証されます。代わりにあなたが使用する必要があります

SqlConnection con = new SqlConnection(); 
    con.ConnectionString = connectString; 

    con.Open(); 

    SqlTransaction tr = null; 
    tr = con.BeginTransaction(); 

    SqlCommand cmd = new SqlCommand("INSERT INTO sunny1(name, id, city, phone, pincode) VALUES ('sandy', 01441, 'abc', 'phone', 122001)", con, tr); 
    cmd.ExecuteNonQuery(); 
    tr.Commit(); 

のだから、

using(SqlConnection con = new SqlConnection(connectString)) 
    { 
     SqlTransaction tr = con.BeginTransaction(); 

     using(SqlCommand cmd = new SqlCommand("....", con, tr)) 
     { 
     con.Open(); 
     cmd.ExecuteNonQuery(); 
     tr.Commit(); 
     con.Close(); 
     }  
    }  

も覚えている:あなたはまだ他のオブジェクトを作成する必要があるときは常に(できるだけ遅く、それを開くために必要があなたの接続を開けません - 単にExecuteNonQuery()コールの直前に開いておく必要があります)、できるだけ早く明示的に閉じます(開いたままにして、finally {}ブロックが発生するまで待ちません)。

あなたは問題のある行削除する必要がマルク・

+0

SqlCommand.Dispose()は(コンポーネントがISiteにある場合のみ)SqlCommand.Dispose()も何も実行しません(ただし、IDisposableの場合はルールとして処理されますが、cn.Close()(SqlConnectionのDisposeと同じです)とにかくそれを呼び出す方が良い) –

+0

@Pop Catalin:彼はcn.Close()を呼び出していますが、使用するブロックははるかに簡潔で簡単です。 –

+0

@PopCatalin:はい、彼です - しかし、彼は早くそれをすることができます。遅く開いて、できるだけ早く閉じることはマントラです。 –

3

あなたはあなたのコードでそれを参照することができます前に、System.Transactionsにアセンブリ参照を追加する必要があります。

  1. 右プロジェクト
  2. に「参考文献」フォルダをクリックして選択し、「参照の追加...」
  3. ジョンは答えたものを、私は強くあなたはを入れて起動をお勧めしますまた、.NETアセンブリ
2

using System.Transactions; 

あなたのコード内のSystem.Transactionsからは何も使いません。

またはusingディレクティブを使用する場合は、System.Transactionsアセンブリへの参照を追加します。

0

この例では、トランザクションで1つのコマンドをラップする必要はありません。この代わりに:

con.Open(); 

    SqlTransaction tr = null; 
    tr = con.BeginTransaction(); 

    SqlCommand cmd = new SqlCommand("INSERT INTO sunny1(name, id, city, phone, pincode) VALUES ('sandy', 01441, 'abc', 'phone', 122001)", con, tr); 
    cmd.ExecuteNonQuery(); 
    tr.Commit(); 

あなたは、コードの以下の行と同じ操作を行います。

con.Open(); 

    SqlCommand cmd = new SqlCommand("INSERT INTO sunny1(name, id, city, phone, pincode) VALUES ('sandy', 01441, 'abc', 'phone', 122001)", con); 
    cmd.ExecuteNonQuery(); 
関連する問題