public class OleConn
{
private static OleDbConnection conn; private OleConn()
{
} public static OleDbConnection getConn()
{
string db = @"Provider=Microsoft.Jet.OleDb.4.0;Data Source=";
string str = @"E:\C#\addressBook\addressBook\DataBase\MyBook.mdb";
conn = new OleDbConnection(db+str);
return conn;
}
}这样的单例oleconn 连接类//执行sql 带参数的数组
public static bool ExecSQLParamters(OleDbParameter[] par, string sql)
{
try
{
using (OleDbCommand comm = new OleDbCommand(sql, OleConn.getConn()))
{ foreach (OleDbParameter pars in par)
{
comm.Parameters.Add(pars);
}
OleConn.getConn().Open();
comm.ExecuteNonQuery(); return true;
}
}
catch
{
return false;
}
finally
{
OleConn.getConn().Close();
}
} 错误是ExecuteNonQuery 要求已打开且可用的连接。连接的当前状态为已关闭。 OleConn.getConn().Open();
这句话断点调式确实执行了。并却状态显示为open 可会出现这样的错误.我实在没招了。access 为2003版本的 没有设置过用户名和密码这样的方法在sql 数据库中写的非常熟练.本人自认为不是特别的菜.所以回答要有点水平.
{
private static OleDbConnection conn; private OleConn()
{
} public static OleDbConnection getConn()
{
string db = @"Provider=Microsoft.Jet.OleDb.4.0;Data Source=";
string str = @"E:\C#\addressBook\addressBook\DataBase\MyBook.mdb";
conn = new OleDbConnection(db+str);
return conn;
}
}这样的单例oleconn 连接类//执行sql 带参数的数组
public static bool ExecSQLParamters(OleDbParameter[] par, string sql)
{
try
{
using (OleDbCommand comm = new OleDbCommand(sql, OleConn.getConn()))
{ foreach (OleDbParameter pars in par)
{
comm.Parameters.Add(pars);
}
OleConn.getConn().Open();
comm.ExecuteNonQuery(); return true;
}
}
catch
{
return false;
}
finally
{
OleConn.getConn().Close();
}
} 错误是ExecuteNonQuery 要求已打开且可用的连接。连接的当前状态为已关闭。 OleConn.getConn().Open();
这句话断点调式确实执行了。并却状态显示为open 可会出现这样的错误.我实在没招了。access 为2003版本的 没有设置过用户名和密码这样的方法在sql 数据库中写的非常熟练.本人自认为不是特别的菜.所以回答要有点水平.
using (OleDbCommand comm = new OleDbCommand(sql, OleConn.getConn()))
using (OleDbCommand comm = new OleDbCommand(sql, OleConn.getConn()))如果这样已经打开的话。那应该是显示 未关闭呀。怎么会显示已经关闭的呢
然后
在执行之前,又打开了一个
OleConn.getConn().Open();//又打开了一个
comm.ExecuteNonQuery(); //这句取的应该是第一个的链接using (OleDbCommand comm ...
skep99 我测试过了,去掉下面的OleConn.getConn().Open();// 依然还是这个错误》 using (OleDbCommand comm = new OleDbCommand(sql, OleConn.getConn())) 断电放在 OleConn.getConn()显示状态为关闭的.
public static bool ExecSQLParamters(OleDbParameter[] par, string sql)
{
try
{
OleDbConnection myConn= OleConn.getConn();
using (OleDbCommand comm = new OleDbCommand(sql, myConn))
{ foreach (OleDbParameter pars in par)
{
comm.Parameters.Add(pars);
} myConn.Open(); comm.ExecuteNonQuery(); return true;
}
}
catch
{
return false;
}
finally
{
OleConn.getConn().Close(); }
}
{
OleConn.getConn().Close();
}
删掉看看,用using会自动释放资源的
{
string db = @"Provider=Microsoft.Jet.OleDb.4.0;Data Source=";
string str = @"E:\C#\addressBook\addressBook\DataBase\MyBook.mdb";
conn = new OleDbConnection(db+str); return conn;
}
}调用的getConn()你获得的是一个新的对象,虽然已经打开了,但是是不同的实例对象,注意红色字体,5楼方法可以解决,另外,用using会自动释放资源的,为什么还要加上finally
{
OleConn.getConn().Close();
}
求解。
那这里为什么呢? 这样的是不是我理解为 派生类调用基类的引用. 我 private static OleDbConnection conn; private OleConn()
{
} public static OleDbConnection getConn()
{
这个单例类 私有的构造,静态的目的就是要让它自己创建自己。外面只能调用.不能创建.OleDbConnection myConn= OleConn.getConn();这样实际上是生成了一个新的对象了、
多虑了,和你说的这个没关系
源代码中,执行到下面这句的时候,connection还没有打开
using (OleDbCommand comm = new OleDbCommand(sql, OleConn.getConn()))