0

接続が初期化されていないという簡単な問題があります。

create メソッドを呼び出すときは、「ABC、XYZ など」のように一連の変数名を渡します。

foreach の最初のパスで、ストアド プロシージャが正しく呼び出され、問題なく動作します。しかし、2 回目のパスで、「接続文字列プロパティが初期化されていません。

myConn.open と myConn.close をループの外に移動する必要がありますか?

私のコード:

public bool Create()
{
        bool isSuccess = true;

        ConnectionStringSettings myConnectionStringSetting = ConfigurationManager.ConnectionStrings[0];
        DbProviderFactory dbFactory = DbProviderFactories.GetFactory(myConnectionStringSetting.ProviderName);

        DbConnection myConn = dbFactory.CreateConnection();
        myConn.ConnectionString = myConnectionStringSetting.ConnectionString;

        DataTable myDataTable = new DataTable();

        string[] varNamesArray = m_variableNames.Split(',');

        foreach (string varName in varNamesArray)
        {
            string vn = varName.Trim();

            //stored procedure

            DbCommand myCommand = dbFactory.CreateCommand();
            myCommand.CommandText = "s_LockVariables";
            myCommand.CommandType = CommandType.StoredProcedure;
            myCommand.Connection = myConn;

            //variables            

            DbParameter param1 = myCommand.CreateParameter();
            param1.ParameterName = "@varName";
            param1.DbType = DbType.String;
            param1.Value = vn;
            myCommand.Parameters.Add(param1);

            DbParameter param2 = myCommand.CreateParameter();
            param2.ParameterName = "@datasetID";
            param2.DbType = DbType.Int32;
            param2.Value = m_datasetID;
            myCommand.Parameters.Add(param2);

            DbParameter param3 = myCommand.CreateParameter();
            param3.ParameterName = "@userID";
            param3.DbType = DbType.Int32;
            param3.Value = m_userID;
            myCommand.Parameters.Add(param3);

            DbParameter param4 = myCommand.CreateParameter();
            param4.ParameterName = "@currentTime";
            param4.DbType = DbType.DateTime;
            param4.Value = DateTime.Now;
            myCommand.Parameters.Add(param4);

            try
            {
                using (myConn)
                {
                    myConn.Open();
                    myCommand.ExecuteNonQuery();
                    myConn.Close();
                }
            }
            catch (Exception e)
            {
                isSuccess = false;
                throw new Exception(e.Message);
                //TODO:  catch data error

                return isSuccess;
            }
        }

        return isSuccess;
    }
4

2 に答える 2

6

ここでループmyConn内で処分しています:foreach

using (myConn)
{
    myConn.Open();
    myCommand.ExecuteNonQuery();
    myConn.Close();
}

それを変更して、変数をすぐに宣言することをお勧めします。

using (DbConnection myConn = dbFactory.CreateConnection())
{
    myConn.ConnectionString = myConnectionStringSetting.ConnectionString;
    myConn.Open();
    myCommand.Connection = myConn;
    myCommand.ExecuteNonQuery();
    // Closed automatically due to being disposed
}

または、ループの外側に単一のusingステートメントを含めるだけです。すべてのコマンドに同じ接続を使用することもできますよね?

于 2012-07-05T22:46:50.353 に答える
2

このコード

using (myConn) 
{ 
    myConn.Open(); 
    myCommand.ExecuteNonQuery(); 
    myConn.Close(); 
} 

最初のループの最後で myConn 変数を破棄します
。この方法で変更してみます

    using(DbConnection myConn = dbFactory.CreateConnection())
    {
        myConn.ConnectionString = myConnectionStringSetting.ConnectionString;   
        DataTable myDataTable = new DataTable();   
        string[] varNamesArray = m_variableNames.Split(',');   
        foreach (string varName in varNamesArray)   
        {   
            ... 
            // the rest of your code
            ...
            // Then do not add the using statement here 
            myConn.Open(); 
            myCommand.ExecuteNonQuery(); 
            myConn.Close(); 
            ....
        }
    } 

また、コードの try/catch 部分を変更します。
ブール値を使用してこのコードから戻る必要がある場合は、

catch (Exception e)       
{       
    isSuccess = false;       
    // If you rethrow a new Exception here you will never reach the return statement
    // In this cases (assuming we are inside a library) I will try to save the exception
    // in a global var (GetLastError comes to mind) or log everything in a file
    return isSuccess;       
}       
于 2012-07-05T22:48:36.283 に答える