0

問題は、SqlConnectionこれが時々エラーを引き起こす問題である可能性があると考えて、パブリック静的接続として使用したことです。

*接続が開いていないか、接続が既に開いていた

SqlConnectionでは、静的クラスで の1 つのステートメントを使用しても問題ないでしょうか?

一度だけ宣言できるようconnectionStringに、使用できることを知っていますweb.config

ConfigurationManager.ConnectionStrings["conn"].ConnectionString ...

web.configただし、設定やサーバー名とは無関係のままにするのが好きです。

  • 再編集:

実際には同じクラス内の2つのメソッドであるため、そのメインクラスには別のクラスもありますが、すべての実行に同じ接続を使用するのではなく、これは重要ではありません! ヘルパークラスの正しいコードで編集し直したとしても、これは間違っているとあなたは言いますか?

public static class myDBhelper
{
 public static SqlConnection Conn = new SqlConnection ("server=(local);Initial Catalog=dbName;Integrated Security=True");

        public static int ExecSQLint(string TblintSQL)
        {
            int anIntValue=0;
            SqlCommand TblintCMD = new SqlCommand(TblintSQL, Conn);
            try
            {
                Conn.Open();
                anIntValue = Convert.ToInt32(TblintCMD.ExecuteScalar());
            }
            catch (System.Data.SqlClient.SqlException ex)
            {
                throw new Exception("No Can Do: " + ex.Message);
            }
            finally
            {
                Conn.Close();
            }
          return anIntValue;
        }



        public static string ExecSQLstring(string TblStrSQL)
        {
          string strValue="";
          SqlCommand TblStrCMD = new SqlCommand(TblStrSQL, Conn);
            try
            {
                Conn.Open();
                strValue = TblStrCMD.ExecuteScalar().ToString();
            }
            catch (System.Data.SqlClient.SqlException ex)
            {
                throw new Exception("No Can Do: " + ex.Message);
            }
            finally
            {
                Conn.Close();
            }

            return strValue;
        }


}

私が疑う主な問題は、次の2つのオプションです。

SqlConnection Conn = new SqlConnection("Data Source=(local);Integrated Security=True;database=dbName")

私のDBhelperクラスでは、この宣言を使用していました

SqlConnection Conn = new SqlConnection("server=(local);Initial Catalog=dbName;Integrated Security=True");

それは不安定またはエラーが発生しやすい可能性がありますか?

ps: try catch でコマンドを実行しています

            try
            {
                Conn.Open();
                cmd.ExecuteNonQuery();
            }
            catch (System.Data.SqlClient.SqlException ex)
            {
                throw new Exception("No Can Do: " + ex.Message);
            }
            finally
            {
                Conn.Close();
            }

Usingステートメントはより適切ですか?それは私の問題ではありませんが、私は考えていました...もし私がすでに「本で」それをやろうとしているなら...

ここで実際に間違っている方法はありますか?

4

3 に答える 3

6

接続を静的に保持することは、データベースへの接続を使用する一般的な方法ではありません。アプリケーションがWebまたはマルチスレッド環境で動作している場合、あなたが言及したように例外につながる可能性があります。

コマンド 1 を実行するスレッド 1 が、コマンド 2 を実行するスレッド 2 と同じ接続であることをイメージしてください。たとえば、TblintCMD と TblStrCMD です。スレッド 1 が終了すると、接続が閉じられますが、スレッド 2 はまだ接続を閉じたときにコマンドを実行しています。

あなたの2つのオプションは問題ではありません。

最善の方法はusing、必要に応じてキーワードを使用して接続を作成することです。

using (var connection = new SqlConnection("yourConnectionString"))
{
    connection.Open();
    ...
}

usingは次のものと似ています:

var connection =  new SqlConnection("connectionString");
try
{
    connection.Open();
    ....
}
finally
{
    connection.Close();
}

したがって、接続をいつ閉じるかを知る必要はありません。

バックグラウンドでは、ADO.NET は接続プールを使用して接続を自動的に管理するため、開いている接続の数を気にする必要はありません。

于 2012-09-24T17:12:15.783 に答える
0
using(var conn=new. SqlConnection( "server=(local);Initial Catalog=dbName;Integrated Security=True"))
{
    conn.Open();
}
于 2012-09-24T17:43:41.463 に答える
-1
public SqlConnection GetSqlConnection()
{
    SqlConnection sql = new SqlConnection();
    sql.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["SchoolContext"].ToString();
    return sql;
}
于 2017-08-09T08:58:02.397 に答える