问题描述
在一个程序中,同样的数据库连接语句在一个窗口中可以运行,在别的窗口中都提示如图:这里把数据库连接语句也贴出来。如下:try{SqlConnectioncon=newSqlConnection(@"Server=.;AttachDbFilename="+dir_db+"\data2.mdf;Database=data2;Trusted_Connection=Yes;");//dir_db为数据库的路径。SqlCommandcmd=con.CreateCommand();con.Open();cmd.CommandText="Select*fromrenwu";SqlDataAdapteradp=newSqlDataAdapter();adp.SelectCommand=cmd;DataSetds=newDataSet();adp.Fill(ds,"renwu");this.dataGridView1.DataSource=ds;this.dataGridView1.DataMember="renwu";con.Close();}catch(Exceptione){MessageBox.Show(e.ToString());}请大侠们不吝赐教!!!不胜感激!!!
解决方案
解决方案二:
同一个程序中数据库不用连接两次,如果非要这么做,那先把前一个连接关闭了再重新去连接。
解决方案三:
为啥要用attechdb的方式呢?
解决方案四:
引用2楼starfd的回复:
为啥要用attechdb的方式呢?
因为需要灵活设置数据库路径的。
解决方案五:
引用2楼starfd的回复:
为啥要用attechdb的方式呢?
前面的数据库连接都关闭了哦!
解决方案六:
可以把Database=data2去掉吗?
解决方案七:
什么叫做“在别的窗口中”?难道说你想用一个文件在两个进程中附件?哪里的文档说过允许多进程附加数据库文件了?
解决方案八:
引用楼主pittyboy的回复:
这里把数据库连接语句也贴出来。如下:try{SqlConnectioncon=newSqlConnection(@"Server=.;AttachDbFilename="+dir_db+"\data2.mdf;Database=data2;Trusted_Connection=Yes;");//dir_db为数据库的路径。SqlCommandcmd=con.CreateCommand();con.Open();cmd.CommandText="Select*fromrenwu";..........
可以保证,在任意需要使用con的地方,临时new一个SqlConnection对象并且.Open()它,并且多线程并发地“创建、打开、关闭、创建、打开、关闭.....”完全没有问题。并不需要什么“先关闭、再创建打开”。你完全可以并发这样做,不会报你的这种错误。你需要看看你的进程“之外”,还有什么东西(例如查询分析器)在锁住.mdf文件。最主要地,你在#3楼的回答是“有些过”的。使用AttahcDbFileName要尽量收缩在进程内使用。例如应该写成using(varcon=newSqlConnection(@"DataSource=(LocalDB)MSSQLLocalDB;AttachDbFilename=|DataDirectory|mdfabcd.mdf;IntegratedSecurity=True")){.......}
注意这里应该使用DataDirectoty来约束在你的进程以内。不要胡乱使用绝对路径。
解决方案九:
引用4楼pittyboy的回复:
Quote: 引用2楼starfd的回复:
为啥要用attechdb的方式呢?前面的数据库连接都关闭了哦!
绝对不需要如此!关闭数据库逻辑连接在编程中是必要的,因为连接池可以充分复用物理连接(特别是在服务器端编程中必须如此)。但是不是你这个目的、你这个异常的原因而需要关闭数据库连接。
解决方案十:
你这样操作数据库效率很低的了,还是老老实实把数据库以正常的方式用sqlserver加载,用平常的连接串吧。