2011-12-10 14 views
1

MySQLテーブルを作成し、Monoでデータを入力する必要があります。私はそうするために、次のコードを使用しています:MySQLでトランザクションオブジェクトを使用する必要があります

public class TestModel 
{ 
    protected IDbConnection dbcon; 

    public TestModel() 
    { 
     string connectionString = "Server=localhost;" 
           + "Database=cikdata;" 
           + "User ID=root;" 
           + "Password=password;" 
           + "Pooling=false"; 
     dbcon = new MySqlConnection(connectionString); 
     dbcon.Open(); 

     IDbCommand dbcmd = dbcon.CreateCommand(); 

     // Create table 
     dbcmd.CommandText = "CREATE TABLE employee (firstname varchar(32), lastname varchar(32))"; 
     dbcmd.ExecuteScalar(); 

     // fill this table with some data 

     dbcmd.CommandText = "SELECT firstname, lastname FROM employee"; 
     IDataReader reader = dbcmd.ExecuteReader(); 
     while(reader.Read()) { 
      string FirstName = (string) reader["firstname"]; 
      string LastName = (string) reader["lastname"]; 
      Console.WriteLine("Name: " + FirstName + " " + LastName); 
     } 

     // clean up 
     reader.Close(); 
     reader = null; 

     dbcmd.Dispose(); 
     dbcmd = null; 
    } 

    ~TestModel() 
    { 
     dbcon.Close(); 
     dbcon = null; 
    } 
} 

私はIDbTransactionが使用されているモノでMySQLを操作する方法の多くの例を見てきました。上のコードは、トランザクションオブジェクトを一切使わずに動作します。私は本当に自分のコードにトランザクションオブジェクト(とIDbTransaction.Commit)を使用する必要がありますか?

このような初心者の質問には申し訳ありません。私は主にC++/PHP開発者であり、C#とMonoの経験はほとんどありません。

+1

ファイナライザが悪いなどです –

+0

ラップIDisposableをオブジェクトブロック「を使用して」にファイナライザは、既に述べたように、ここでは悪い考えです。 – skolima

+0

ありがとう、@スカリマ。なぜそれが悪いのか分かりました。また、 'TestModel'オブジェクトがまだ削除されていない間、データベースへの永続的な接続を維持する必要がありますか?特定のデータベースクエリ/トランザクションで 'Open'と' Close'接続を行うほうが良いでしょうか? – ezpresso

答えて

1

seperate sqlコマンドのセットとして1つの操作を実行しているときは、トランザクションは良い習慣です。

この場合、フィルコードが失敗した場合にcreate tableをロールバックするかどうかによって異なります。

したがって、次の手順で見ることができます。あなたが明示的なトランザクションを持っていない場合は、create table文にはいくつかのINSERT文を追加ので、もし

Start a transaction 
Create the table 
Insert some data 
Commit transaction 

は、その後、imlicitものがある、とExcuteScalarと呼ばれる、あなたは同じ効果を得ると思います。

基本的にstart transaction/commitトランザクションは、何も変更したくない場合、その一部が失敗した場合に使用します。

操作のバッチが実行されている間に他のユーザーが何も変更しない場合は、

+1

理論的には正しいです。しかし、MySQLでは、CREATE TABLEはトランザクション内に存在することはありません。そのため、ロールバックを実行してもテーブルは作成されます。私はこれがExecuteScalarでも当てはまると思います。何もCREATE TABLEと同じトランザクション内の何かを囲むことができないからです。 –

+0

私はそれについて疑問を抱いていましたが、取引の説明にもっと関心を持っていました。 –

+1

MySQLにネストされたトランザクションがありません:) –

3

トランザクションでは、そのコードを絶対に囲まないようにしてください。あなたがそれを行うならば、あなた自身または他のコード読者を混乱させるだけです。

この場合、その理由は、すでにあなたのトランザクションをコミットしているし、コマンドの残りの部分はとにかく外での取引が起こるのだろう、あなたの最初のコマンド(CREATE TABLE)後のようCREATE TABLEは、MySQLでimplicit commitを引き起こすことです。ロールバックやコミットは何もしません。

あなたはテーブルがまだそこにあるどのようCREATE TABLE

mysql [localhost] {msandbox} (test) > start transaction; 
Query OK, 0 rows affected (0.01 sec) 

mysql [localhost] {msandbox} (test) > create table transtest(id int); 
Query OK, 0 rows affected (0.32 sec) 

mysql [localhost] {msandbox} (test) > rollback; 
Query OK, 0 rows affected (0.02 sec) 

mysql [localhost] {msandbox} (test) > select * from transtest; 
Empty set (0.00 sec) 

お知らせをロールバックしようとする場合、これは、それがどのように見えるかです...

+0

だから私はテーブルにいくつかのデータを挿入するときにだけ、トランザクションオブジェクトを使用する必要がありますか?このようにして、何かが悪くなった場合、トランザクション内で操作をロールバックすることができます。 – ezpresso

+0

2つ以上の挿入/更新/削除を「すべて」または「何もない」単位で一緒に実行する場合は、その内容をトランザクション内に配置します。 –

関連する問題