-1

Execute non query .. ExecuteNonQuery を呼び出すときにこれを取得します....

   clsConnection.ExecuteNonQuery("ADD_CUSTOMERS", CommandType.StoredProcedure, paramList);

例外ポップアップcmd.Connection.Open();

これは ExecuteNonQuery 全体です

 public static void ExecuteNonQuery(string sql, CommandType type, List<SqlParameter> paramList)




        try
        {
            DataAccess.clsConnection clsDB = new DataAccess.clsConnection();
            using (SqlConnection cn =clsDB.OpenCon())
            {
                SqlCommand cmd = new SqlCommand();
                cmd = CreateCommand(sql, type, paramList);
                cmd.Connection = cn;
                cmd.CommandType = type;
                cmd.CommandText = sql;
                cmd.ExecuteNonQuery();


            }  
4

4 に答える 4

3

接続オブジェクトをコマンドに割り当てません

SqlCommand がクエリを実行するときは、開いている接続が必要です。したがって、最初のステップは、接続プロパティを検索して、初期化されているかどうかを確認することです。プロパティが null であるため、エラーが発生します

単純に修正する

 cmd.Connection = MainCon;

もちろん、すでに接続を開いているので、回線は必要ありません

 cmd.Connection.Open();

そうは言っても、グローバル接続オブジェクトをそのように保持することは避けることをお勧めします。OpenConが開いた接続を返すように変更し、必要がなくなったときに using ステートメントを使用してリソースを解放するように変更することは、パフォーマンスと、プログラムが使用するシステム リソースへの影響にとってより良い方法です。

namespace DataAccess
{
    public class clsConnection
    {
        public SqlConnection OpenCon()
        {           
                DBN = "PMS";
                SERVER = "server-PC\\SQLEXPRESS";
                USER = "SA";
                PWD = "Sysadmin123";

                SqlConnection cn = new SqlConnection("Initial Catalog=" + DBN + ";Data Source=" + SERVER + "; User id =" + USER + "; Password =" + PWD + ";CONNECT Timeout=10");
                .....
                cn.Open();                   
                return cn;

        }        

    }
}

したがって、接続を使用するコードは次のように変更できます

try
{
   DataAccess.clsConnection clsDB = new DataAccess.clsConnection();
   using(SqlConnection cn = clsDB.OpenCon())
   {
       SqlCommand cmd = new SqlCommand();
       cmd = CreateCommand(sql, type, paramList);
       cmd.Connection = cn;
       cmd.CommandType = type;
       cmd.CommandText = sql;
       cmd.ExecuteNonQuery();

    // Here the closing braces closes and disposes the connection freeing the resources used
    // also in case of exceptions 
    }  
}
catch (Exception ex)
{
    ....
}

編集: 以下のコメントを見て、メソッド OpenCon にコンテキストを追加しました。コードを変更してusing ステートメントを利用することを強くお勧めします

于 2013-07-31T13:19:18.327 に答える
2

コマンドに接続を割り当てる必要があります

cmd = CreateCommand(sql, type, paramList);
cmd.Connection = MainCon;
于 2013-07-31T13:19:00.163 に答える
1

Connection Timeoutの代わりに使用Connect Timeout

于 2013-07-31T13:18:24.067 に答える
0

そして、SqlConnectionStringBuilder を使用することをお勧めします!

var builder = new SqlConnectionStringBuilder();
builder.DataSource = "server-PC\\SQLEXPRESS";
builder.InitialCatalog = "PMS";
builder.UserID = "SA";
builder.Password = "Sysadmin123";

using (var connection = new SqlConnection(builder.ToString()))
{
    using (var cmd = new SqlCommand())
    {
        cmd.CommandText = "ADD_CUSTOMERS";
        cmd.CommandType = System.Data.CommandType.StoredProcedure;
        cmd.Connection = connection;

        connection.Open();
        cmd.ExecuteNonQuery();
        connection.Close();
    }
}
于 2013-07-31T13:23:09.363 に答える