0

Dapper ORMを使用するプロジェクトでSqlConnectionクラスとSqlCommandクラスを使用していますが、奇妙な問題が発生しています。SqlCommandを使用してdbテーブルに行を挿入すると、常に正しく機能し、更新されたデータフォームテーブルを選択するとすべてが正常に機能しますが、閉じた後、データがキャッシュに保存されているため、行ったアプリケーションの変更はコミットされません。たとえば、2つの列(UserId(PK)とUserName(Unique))のみの単純なテーブルを作成しましたが、その場合でも変更は保存されません。行を挿入するために次のコードを使用しています。

using (SqlConnection c = new SqlConnection(Settings.Default.UsersConnectionString))
        {
            c.Open();


            using (SqlCommand d = new SqlCommand())
            {
                d.CommandText = "INSERT INTO Users (UserName) VALUES ('SomeName')";
                d.CommandType = System.Data.CommandType.Text;
                d.Connection = c;
                int t = d.ExecuteNonQuery();
            }


            c.Close();
        }
4

4 に答える 4

1

ほとんどの場合、コミットされていないトランザクションの内部にいます。おそらく、Dapper ORMがトランザクションを開始したので、すべての変更をコミットするように指示する必要があります。

于 2011-05-04T08:07:54.573 に答える
1

お使いのサーバーのデフォルトは、暗黙のトランザクションがオンになっているように設定されていると思われます。これが意味することは、コマンドを実行し、現在開いているトランザクションがない場合、SQL Server は (いつものように) 自動的にトランザクションを開始するということです。ただし、コマンドが正常に完了すると、このトランザクションは開いたままになり、明示的なコミットを発行する必要があります。

これに該当するかどうかを判断するには、次のクエリを実行してください@@OPTIONS

IF @@OPTIONS & 2 > 0 
RAISERROR ('Implicit transactions are turned on', 1, 1)
于 2011-05-04T08:45:55.980 に答える
1

dapper のこのコードは次のようになります。

var name = "SomeName";
int t  = c.Execute("INSERT INTO Users (UserName) VALUES (@name)", new {name});

Dapper は内部トランザクション管理を行いません。オプションのトランザクション パラメータを使用して渡す必要があります。

私の腸は、データを挿入するために別のデータベースに接続していると言っています。ダミアンの暗黙的なトランザクションのいずれかで、検証が簡単です。

于 2011-05-05T12:54:45.453 に答える
0

データベースがコミットされていないトランザクションを自動的に作成している可能性があります。コードで独自のトランザクションを作成して手動でコミットし、それが機能するかどうかを確認してください。

using (SqlConnection c = new SqlConnection(Settings.Default.UsersConnectionString))
{
   c.Open();
   using (SqlTransaction t = c.BeginTransaction("InsertIntoUsers"))
   {
        using (SqlCommand d = new SqlCommand())
        {
            d.CommandText = "INSERT INTO Users (UserName) VALUES ('SomeName')";
            d.CommandType = System.Data.CommandType.Text;
            d.Connection = c;
            int t = d.ExecuteNonQuery();
        }
        t.Commit();
   }
}
于 2011-05-04T09:04:54.207 に答える