机器环境:服务器+IIS7:winserver 2008 R2 Enterprice
软件平台:Sharepoint 2010(moss2010) 系统安装office 2010 (64bit)标准版
开发的sharepoint 2010 可视webpart,在服务器本机运行一切正常。可以正常导入指定的excel(32位)制作的数据源。在局域网内PC机在进行数据导入时候报错。
已做操作:
1、应用程序池里设置“启用32位应用程序”为TRUE,或者生成项目时候any CPU 改为 X86;这样的话,moss2010应用程序池会自动停止或者无法使用;不可行。
2、权限设置:服务器上关闭简单共享,并把%system%/windows/temp权限加入everyone并给与完全控制权限,同时,服务器虚拟目录(上传的位置)也给与同样的权限;不可行。
代码如下:
public DataSet ExecleDs(string filepath,string tablename)
{
string strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filepath + ";Extended Properties='Excel 12.0;HDR=Yes;IMEX=1;'";
OleDbConnection conn = new OleDbConnection(strConn);
conn.Open();
OleDbDataAdapter odda = new OleDbDataAdapter("select * from [Sheet1$]", conn);
DataSet ds = new DataSet();
odda.Fill(ds, tablename);
conn.Close();
return ds;
}
/// <summary>
/// 导入运单号excel
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void BtnInPut_Click(object sender, EventArgs e)
{
if (FileUploadXls.HasFile == false)
{
Page.ClientScript.RegisterStartupScript(GetType(), "message", "<script>alert('请选择excel文件');</script>");
return;
}
string IsXls = System.IO.Path.GetExtension(FileUploadXls.FileName).ToString().ToLower();
if (IsXls != ".xlsx" )
{
Page.ClientScript.RegisterStartupScript(GetType(), "message", "<script>alert('只可选择excel 2007以后版本');</script>");
return;
}
string filename = FileUploadXls.FileName;
string savepath = FileUploadXls.PostedFile.FileName;
DataSet ds = ExecleDs(savepath,filename);
DataRow[] dr = ds.Tables[0].Select();
int insertcount = 0;//记录插入信息条数
int exitcount = 0;//记录已存在信息条
if (ds.Tables[0].Rows.Count == 0)
{
Page.ClientScript.RegisterStartupScript(GetType(), "message", "<script>alert('excel为空表,无数据!');</script>");
}
else
{
for (int i = 0; i < dr.Length; i++)
{
string StrSql = "select BillMainInfo.BillNo from BillMainInfo where BillNo='" + dr[i]["BillNo"].ToString() + "'";
DataTable dt = Conn.GetTable(StrSql);
string BillNo = dr[i]["BillNo"].ToString();
string BillStatus = "未完成";
string LastDate = SysDatetime;
string LastOperator = UserName;
if (dt.Rows.Count == 0 && dr[i]["BillNo"].ToString() != "")
{
string Sql = "insert into BillMainInfo (BillNo,BillStatus,LastDate,LastOperator) values ('" + BillNo + "','" + BillStatus + "','" + LastDate + "','" + LastOperator + "')";
Conn.ExNoQuery(Sql);
insertcount++;
}
if (dt.Rows.Count > 0 && dr[i]["BillNo"].ToString() != "")
{
exitcount++;
}
}
}
string message = insertcount + "条数据导入成功!" + exitcount + "条数据重复未导入成功!";
Page.ClientScript.RegisterStartupScript(GetType(), "message", "<script>alert('" + message + "');</script>");
BindGv();
}
错误如下:
“/”应用程序中的服务器错误。
未指定的错误
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。
异常详细信息: System.Data.OleDb.OleDbException: 未指定的错误
源错误:
执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息。 |
堆栈跟踪:
[OleDbException (0x80004005): 未指定的错误] System.Data.OleDb.OleDbConnectionInternal..ctor(OleDbConnectionString constr, OleDbConnection connection) +1828554 System.Data.OleDb.OleDbConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningObject) +100 System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection, DbConnectionPoolGroup poolGroup) +45 System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) +6264718 System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) +6265031 System.Data.OleDb.OleDbConnection.Open() +47 WPDocumentManage.VisualWebPart1.VisualWebPart1UserControl.ExecleDs(String filepath, String tablename) +210 WPDocumentManage.VisualWebPart1.VisualWebPart1UserControl.BtnInPut_Click(Object sender, EventArgs e) +251 System.Web.UI.WebControls.Button.OnClick(EventArgs e) +115 System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +140 System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +29 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +2981 |
建议检查一下运行时filepath的值是否正确?
我用弹出对话框的方式进行过测试,弹出来的filepath路径有些奇怪的,显示为 d:tz的模式,感觉都少一个斜杠。但是在本机(服务器)导入正常。
@james-ye: 检查一下获取filepath的代码
@dudu: string savepath = FileUploadXls.PostedFile.FileName;这个就是filepath的代码,这里我命名为了savepath。虽然有点蹊跷,但是我用另一个方式进行测试过。我把filepath写死测试了,如:写成filepath="d:\tz\1.xlsx",然后进行导入,结果还是服务器上正常,局域网PC机上错误依旧。谢谢!
@james-ye: 应该还是权限的问题,局域网PC机上的临时文件夹可能在C:\Document settings\中,参考System.Data.OleDb.OleDbException: Unspecified error
@dudu: 我也觉得权限问题的可能性比较大。按照你提供的这个资料(我之前也找过),在服务器上找不到对应的文件夹(ASPNET)。win2008的权限控制的很严,documents and settings连administrator都不能访问的。只能通过用户文件夹去访问,但里面一些例如local settings都是快捷方式,且无法访问。我今天也在找这方面的查看权限。谢谢!
@james-ye: 补充一点,权限只是问题之一,解决后我才发现。filepath确实也存在问题。filepath是服务器端的路径,我现在取得客户端路径也会报错。解决办法我能想到的就是把excel上传到服务器比赋值到路径就OK了。
卸载一下 AccessDatabaseEngine 组件 然后重装
我试试看,现在只要是方法,我都的测试下,活马当死马医了。折腾的有点糊涂了,,嘿嘿
重新安装后PC机还是一样的错误,谢谢。PS:我卸载后,在本机测试的时候还是可以正常运行的。可能office 2010安装的时候自动就注册了。
@james-ye: 参考这个
http://msdn.microsoft.com/zh-cn/library/system.data.oledb.oledbexception.aspx
把ERROR抓出来
string strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filepath + ";Extended Properties='Excel 12.0;HDR=Yes;IMEX=1;'";
替换为Excel 12.0 xml 试试,貌似和你遇到的问题不一样!
谢谢各位的意见,本人以解决此问题。现在与大家分享,在这里要谢谢dudu,虽然我周五也试过去找temp的权限问题,但是没能找到对应的ASPNET文件夹,最后放弃了。今天在DUDU的提醒下,我再一次把问题焦点放在了权限问题上,且设置在服务器上不是客户机PC。不啰嗦了,我就直接写明解决方案了。
windows server 2008 的安全性做的比较好,首先进入系统盘(一般都是C:\),点击工具--文件夹选项--查看,把“使用共享向导(推荐)”的勾去掉,把“隐藏受保护的操作系统文件(推荐)”勾去掉,勾上“显示隐藏的文件、文件夹和驱动器”。点击确定!然后,点击用户--mossadmin(这个用户是我moss2010的管理员用户,是域用户,你们可以选择administrator)--local settings(这个是关键,这个文件夹默认无权限访问,我后面有访问注释)--右键点击temp--安全选项--编辑--添加everyone用户,并赋予完全控制权限。测试成功!!
PS:local settings的访问:右键属性--高级--选择everyone--更改权限--点击编辑,把拒绝一列的勾全部去掉。这样everyone被自动删除。回到local settings--右键属性---编辑---添加everyone,赋予完全控制权限即可。
以上,请参考。