C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


■85916 / )  Re[10]: LINQ to SQL:
□投稿者/ WebSurfer (1390回)-(2017/12/01(Fri) 11:35:20)
No85913 (ぬる さん) に返信

検証結果の連絡をありがとうございました。

自分でもちょっと調べてみましたが、以下の記事に書いてあるように Linq to SQL は ADO.NET 上で動いていて、
その記事の「接続」のセクションに書いてあるように、ADO.NET コマンドと DataContext の間で接続を共有でき
るようです。

ADO.NET and LINQ to SQLADO.NET および LINQ to SQL
https://docs.microsoft.com/ja-jp/dotnet/framework/data/adonet/sql/linq/ado-net-and-linq-to-sql

なので、最初の質問にあった、

> ' Delete
> db.ExecuteCommand("delete from Student where Id = 1")

もトランザクションに束ねることはできるということのようですね。

ADO.NET コマンドと DataContext の間で接続を共有できるのであれば、異なる DataContext の間でも接続を
共有できるのではないかと思って調べてみました。

一応以下のコードで可能でした。(ホントにこれでいいのか自信はありません。どこかに見落としがあるかも。
分散トランザクションが使えるならそちらの方が良いと思います)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;

namespace ConsoleAppLinqToSQL
{
    class Program
    {
        static void Main(string[] args)
        {
            string connString = ConsoleAppLinqToSQL.Properties.Settings.Default.TestDatabaseConnectionString;
            SqlConnection connection = new SqlConnection(connString);

            try
            {
                connection.Open();
                SqlTransaction sqltx = connection.BeginTransaction();

                using (var db = new DataClasses1DataContext(connection))
                {
                    db.Transaction = sqltx;

                    db.Table.InsertOnSubmit(new Table() { Id = 15, Name = "ABCDEF", Price = 100 });
                    db.SubmitChanges();

                    db.ExecuteCommand("delete from [Table] where Id = 15");
                }

                using (var db = new DataClasses1DataContext(connection))
                {
                    db.Transaction = sqltx;

                    db.Table.InsertOnSubmit(new Table() { Id = 15, Name = "newABC", Price = 200 });
                    db.SubmitChanges();
                }

                // Commit するまでは SSMS から Table を読めない(ロックされている?)
                // Commit されると SSMS から Table を読める。上の最後の InsertOnSubmit が反映されている
                // コメントアウトすると Close で Rollback され、上記の結果は SQL Server には反映されない
                sqltx.Commit();
            }
            finally
            {
                // 未コミット状態のトランザクションは Close でロールバックされるので
                // 明示的に Rollback をかける必要はない
                connection.Close();
            }
        }
    }
}

返信 編集キー/


管理者用

- Child Tree -