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

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

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

Re[3]: SQL Server テーブルのロックアウト


(過去ログ 104 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■62378 / inTopicNo.1)  SQL Server テーブルのロックアウト
  
□投稿者/ 半人前 (1回)-(2011/10/05(Wed) 21:26:32)

分類:[.NET 全般] 

Visual Studio 2005 C# DB:SQL Server 2005

以下のソースで今までは問題なく処理できていたのですが
本日、BBBTableのロック?が発生してしまい、SQL Server ManagementStudioからもテーブルが開けず、
「タイムアウトに達しました。操作が完了する前にタイムアウト期間が過ぎたか、またはサーバーが応答していま・・・」
というメッセージが出ます。その他のテーブルは開けます。
どの部分に問題があるのでしょうか。
  
----------------------------------------------------------------------------------------------------------------
try
{
	//トランザクション
	using (TransactionScope tranScope = new TransactionScope())
	using (SqlConnection conn = new SqlConnection(Database.settings.DBSETConnection.ConnectionString))
	{
		//コネクション生成
		conn.Open();

		AAATableAdapter adpAAA = new AAATableAdapter();
		adpAAA.Connection = conn;
		BBBTableAdapter adpBBB = new BBBTableAdapter();
		adpBBB.Connection = conn;
		CCCTableAdapter adpCCC = new CCCTableAdapter();
		adpCCC.Connection = conn;

		AAADataSet.AAADataTable dtAAA = adpAAA.GetTargetDataBy(引数);

		for (int i = 0; i < dtAAA.Rows.Count; i++)
		{
			AAADataSet.AAARow rowTARGET = (AAADataSet.AAARow)dtTARGET.Rows[i];
			AAADataSet.BBBDataTable dtBBB = adpBBB.GetTargetDataBy(rowTARGET.キー);

			for (int j = 0; j < dtBBB.Rows.Count; j++)
			{
				//フラグ更新
				dtBBB.Rows[j][○○○] = false;
			}
			adpBBB.Update(dtBBB);
		}

		//対象データ取得
		AAADataSet.AAADataTable dtAAA = adpAAA.GetTargetDataBy(nendo);

		//文字コード設定
		System.Text.Encoding enc = System.Text.Encoding.GetEncoding("shift_jis");

		//ファイル名に日付追加
		string filePath = Environment.CurrentDirectory;
		//ファイル名に日付追加
		filePath += "\\abcde_" + DateTime.Today.ToString("yyyyMMdd") + ".log";

		StringBuilder sbErr = new StringBuilder();

		sbErr.AppendLine("****************************************************************************************");
		sbErr.AppendLine("処理日時     : " + DateTime.Now.ToString());
		sbErr.AppendLine("****************************************************************************************");

		for (int i = 0; i < dtAAA.Rows.Count; i++)
		{
			AAADataSet.AAARow rowAAA = (AAADataSet.AAARow)dtAAA.Rows[i];
			AAADataSet.BBBDataTable dtBBB = adpBBB.GetTargetDataBy(rowAAA.キー);

			//対象データの判定
			if (rowAAAの判定内容判定)
			{
				for (int j = 0; j < dtSYO.Rows.Count; j++)
				{
					AAADataSet.BBBRow rowBBB = (AAADataSet.BBBRow)dtBBB.Rows[j];
					//更新
					rowBBB["あ"] = true;
					adpBBB.Update((DataRow)rowBBB);
				}
			}
			else
			{
				for (int j = 0; j < dtBBB.Rows.Count; j++)
				{
					AAADataSet.DBBBRow rowBBB = (AAADataSet.DBBBRow)dtBBB.Rows[j];

					rowBBB["い"] = false;
					adpBBB.Update((DataRow)rowBBB);
				}
			}
		}

		sbErr.AppendLine("終了");
		//ファイルの末尾に内容を追加
		System.IO.File.AppendAllText(filePath, sbErr.ToString(), enc);

		//完了
		tranScope.Complete();

		//終了報告
		Console.WriteLine("処理終了");
	}
}
catch (Exception e)
{
	//エラー報告
	Console.WriteLine(e.Message + "の例外が発生しました。" );
}
finally
{
	//しばらく表示
	Thread.Sleep(TimeSpan.FromSeconds(5.0));
}

引用返信 編集キー/
■62402 / inTopicNo.2)  Re[1]: SQL Server テーブルのロックアウト
□投稿者/ くだん (11回)-(2011/10/07(Fri) 13:23:38)
No62378 (半人前 さん) に返信
プログラム側の問題は、ざっと見ただけで気になるのが、

using 使ってても close は要るんじゃないかと思います。
dispose から close が呼ばれている事を確認したのですか?
TransactionScope.Complete もコミットするだけじゃないか
と思います。
データベース側で接続ユーザの情報を見れると思いますので、
using だけで close しない場合と、close する場合で変化
しないか確認してみては?
今のところ、接続しっぱなしで後始末しないプログラムに見えます。

log ファイル出力して sbErr とか変数名をつけてる割に
実行ログだけでエラーログは残さないのです?
Console を別に保存する仕組みがあるんです?
エラーが起こったときに不備のあるプログラムに見えます。

> SQL Server ManagementStudioからもテーブルが開けず
管理ツールで開けない時点でプログラムの範疇ではないですから、
データベース管理の話は省きます。
プログラムに不備があってテーブルを壊したと考えるのが
妥当では?
引用返信 編集キー/
■62404 / inTopicNo.3)  Re[2]: SQL Server テーブルのロックアウト
□投稿者/ みきぬ (989回)-(2011/10/07(Fri) 13:45:56)
No62402 (くだん さん) に返信
> using 使ってても close は要るんじゃないかと思います。
> dispose から close が呼ばれている事を確認したのですか?
> TransactionScope.Complete もコミットするだけじゃないか
> と思います。

他人に指摘する側に確認しましょうよ。

↓すぐできるでしょ?

http://msdn.microsoft.com/ja-jp/library/system.data.sqlclient.sqlconnection.close(v=VS.80).aspx

> SqlConnection は、適用範囲外では閉じられません。
> したがって、コードを using ステートメント内に配置しない限り、
> Close または Dispose を使用して明示的に接続を閉じる必要があります。
> どちらも同じ機能を提供します。
引用返信 編集キー/
■62409 / inTopicNo.4)  Re[3]: SQL Server テーブルのロックアウト
□投稿者/ くだん (12回)-(2011/10/07(Fri) 19:34:46)
No62404 (みきぬ さん) に返信
> http://msdn.microsoft.com/ja-jp/library/system.data.sqlclient.sqlconnection.close(v=VS.80).aspx
>
>>SqlConnection は、適用範囲外では閉じられません。
>>したがって、コードを using ステートメント内に配置しない限り、
>>Close または Dispose を使用して明示的に接続を閉じる必要があります。
>>どちらも同じ機能を提供します。
この日本語で分からないんですけど、私は日本語の経験不足ですかね。。。

今、見直したら、サンプルコードのほうで
> 接続は、using ブロックの末尾で自動的に閉じられます。
って書いてあるので閉じるんだなぁと思った始末。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -