昨天修改了一个工具,编译后本机运行正常,但放到服务器上执行却不行,提示:
message:GetOleDbSchemaTable requires an open and available Connection. The connection's current state is closed
重新检查了office相关的dll文件都在,换到安装了offie的服务器也不行.
仔细检查一下代码,发现原来有段异常捕捉给屏蔽掉了(红色部分):
using (OleDbConnection oc = new OleDbConnection(strConn)) { if (oc.State == ConnectionState.Closed) { try { oc.Open(); } catch (Exception ex) { string ss = ex.Message; } } DataTable schemaTable = oc.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, null); string tableName = schemaTable.Rows[0][2].ToString().Trim(); string strSql = "Select * From [" + tableName + "]"; OleDbDataAdapter oda = new OleDbDataAdapter(strSql, oc); oda.Fill(ds); oda.Dispose(); oc.Close(); } return ds.Tables[0];
坑爹啊.找到最终的报错信息是:OleDbConnection.Open() 时提示:未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0
百度后最终解决办法是:在编译时将目标CPU改为x86,一切OK了.原因是编辑时默认目标CPU为任意,但在64位的系统中运行时,会尝试使用64位的驱动,但系统并不提供64位的驱动.
中间走了很多弯路,搜索GetOleDbSchemaTable requires an open and available Connection 问题找到的解决方案不多,试了几个都是白废力气.结果是其它问题引起的.
总结经验教训:一定要定位到最根本的问题,再去找解决方法