C# 连接未初始化
我有一个快速的问题,我的连接没有被初始化 当我调用create方法时,我传入一组变量名,比如“ABC,XYZ,等等” 在foreach的第一个过程中,存储过程被正确调用,一切正常。但是在第二次通过时,我得到了一个“Connectionstring属性尚未初始化” 我应该将myConn.open和myConn.close移动到循环外部吗 我的代码:C# 连接未初始化,c#,asp.net,.net,C#,Asp.net,.net,我有一个快速的问题,我的连接没有被初始化 当我调用create方法时,我传入一组变量名,比如“ABC,XYZ,等等” 在foreach的第一个过程中,存储过程被正确调用,一切正常。但是在第二次通过时,我得到了一个“Connectionstring属性尚未初始化” 我应该将myConn.open和myConn.close移动到循环外部吗 我的代码: public bool Create() { bool isSuccess = true; ConnectionSt
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;
}
您正在处理
foreach
循环中的myConn
:
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 (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;
}