質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

7回答

21467閲覧

C# データベースの接続

dekky0910

総合スコア93

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

1クリップ

投稿2017/04/06 00:50

編集2017/04/06 02:02

###前提・実現したいこと
おせわになります。
今回はエラーではなく質問なのですが
データベースと接続をする際、そのデータベースを使用する際に毎回接続をし操作が終わったら切断をするものだと思っていますが、
起動時にデータベース接続をし終了する際に接続を切断する書き方では利点等はありますでしょうか?
また、他にいい接続のパターンがありましたらご教授お願いいたします。

追記
数多くの回答ありがとうございます!
いろいろと知らなかった部分が多く勉強になりました。
個人個人に返事を書こうと思ったのですが皆様に同じような返事を書いてしまうことになるので
ここをお借りしてお礼いたします。

###該当のソースコード

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答7

0

ベストアンサー

毎回接続をして(c = new SqlConnection("..."); c.Open();)毎回切断するようなプログラミングをしているつもりでも、内部的には毎回接続と切断を繰り返しているわけではなく、接続文字列が同じだったら以前の接続が使い回されます。

https://msdn.microsoft.com/ja-jp/library/8xx3tyca(v=vs.110).aspx

よって、今のままのプログラミングで十分に効率的な動作となっており問題ありません。

投稿2017/04/06 01:14

yuba

総合スコア5568

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SVC34

2017/04/06 01:24

.NETではアプリケーションが意識せずともコネクションプールを使用できるのですね。
yuba

2017/04/06 01:37

SVC34さんの回答を翻案しただけの回答なんですけどね。はい、そうなんです。
guest

0

接続と切断が ADO.NET の Connection の Open と Close と仮定して。
プログラムの起動時と終了時に接続と切断を行う利点は無いと思っています。
必要最小限のスコープで接続と切断を行うのが最も良いと個人的には思います。
(Connection を Close してもコネクションプールに退避されるだけで、同一の接続文字列で Open し直せばコネクションプールの同一のコネクションを再利用するので)

投稿2017/04/06 01:34

workaholist

総合スコア559

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

workaholist

2017/04/06 01:37

接続文字列に明示的に「Pooling=false」と書くとプールせずにすぐ破棄するので再利用はできなくなります。
guest

0

アプリケーションサーバのような常駐プロセスの場合、外部からのリクエストの都度接続・切断を繰り返すと効率が悪いので、起動時またはDBへの初回アクセス時に接続を行いそのままつなぎっぱなしにすることが多いです。このような手法はコネクションプーリングと呼ばれます。Webアプリケーションでは通常コンテナ・フレームワークのレイヤで機能提供されるため、そのAPIを使用することになります。

投稿2017/04/06 01:08

編集2017/04/06 01:11
SVC34

総合スコア1149

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

体感できるかはわかりませんが、接続・切断の回数が減ることで動作は早くなるんじゃないでしょうか。
デメリットとしてはクライアントが増えた場合(大人数で接続する場合)に時間当たりの接続数が跳ね上がるので
DB側が耐えられなくなる場合があります。

投稿2017/04/06 00:55

Clor

総合スコア883

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

C#をどのように使うかによって大きく異なります。

スマートクライアント型やクラサバ型やWEBシステムの場合、
たとえばMVVM(MVC)を取っている場合、
ADO.NETでコネクションプーリングさせているので、
フロントサイド側は、毎回そのコネクションに向けて接続して切断し効率を重視します。
Windows FormアプリであろうがWPFであろうがSOAPであろうが違いはあまりありません。

しかし、SQLite3などを用いたクライアントのみのアプリケーションといった場合ですと、
クライアントだけで完結するため、DBコネクションを張ったままでも問題が起こりにくいので
張ったままにしていたりします。もちろん毎回接続切断したりもします。
システムによってどの形態をとるかは、システム設計の方針に従うことになります。

前提としてDB切断はすぐにできるのですが、
接続する際はDBを探しに行きコネクションを張りますので時間が掛かってしまいます。
その時間を許容できるかどうかで接続方針を判断していたりします。

.NET アプリケーションモデルで検索すると色々出てくると思いますよ。

投稿2017/04/06 01:47

編集2017/04/06 02:46
lazhuward

総合スコア1294

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

解決済みなので今さらながらですが・・・

コネクションリーク防止のため、使い始める直前に Open し使い終わったら即 Close する、例外等が発生して処理が中断された場合でも必ず Close されるようにコーディングするのが基本です。

SQL Server に SqlClient を用いた例ですが、以下の記事が上記のことを考えるのに非常に役に立つと思いますので、一読することをお勧めします。

.NETの例外処理 Part.2
https://blogs.msdn.microsoft.com/nakama/2009/01/02/net-part-2/

その他、Access では、C#/VB.NET のコード上で更新操作を行った後 Close しないと DB 上に結果が反映されないということもあるのでご注意ください。

投稿2017/04/06 02:20

編集2017/04/06 02:26
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dekky0910

2017/04/06 07:49

返事遅くなってしまい申し訳ありません。 わざわざ記事まで載せていただきありがとうございます。 Access等で反映されないなども初耳だったので勉強になりました。
guest

0

DBに対してどの程度アクセスするかで使い分けた方がいいと思います。ほぼ常時なら
起動で接続のままですし、時々であれば接続と終了を繰り返してもいいと考えます。
既に回答されている方の答えにもあるように他とのユーザーとの兼ね合い、あとは自分の好み?でいのではと思います。

投稿2017/04/06 01:20

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問