2 changwen313 changwen313 于 2017.09.07 21:25 提问

.net excel导入到数据库本地测试正常,部署在网络里就不能成功。请大神指点

代码占这么多,大神应该可以看明白,现在是部署后,网络访问,本地文件已经拷贝到服务器上了,但是就是不往下走了,请指点。
if (fuload.FileName == "")
{
lbmsg.Text = "请选择文件";
return;
}

            if (this.RadioButtonList1.SelectedValue == "")
            {
                lbmsg.Text = "请选择人人员类型";
                return;
            }

            string fileExtenSion;
            fileExtenSion = Path.GetExtension(fuload.FileName);
            if (fileExtenSion.ToLower() != ".xls" && fileExtenSion.ToLower() != ".xlsx")
            {
                lbmsg.Text = "上传的文件格式不正确";
                return;
            }
            try
            {
                string FileName = "App_Data/" + Path.GetFileName(fuload.FileName);

                if (File.Exists(Server.MapPath(FileName)))
                {

                    File.Delete(Server.MapPath(FileName));

                }
                fuload.SaveAs(Server.MapPath(FileName));


                //HDR=Yes,这代表第一行是标题,不做为数据使用 ,如果用HDR=NO,则表示第一行不是标题,做为数据来使用。系统默认的是YES
                string connstr2003 = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath(FileName) + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'";
                string connstr2007 = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Server.MapPath(FileName) + ";Extended Properties=\"Excel 12.0;HDR=YES\"";
                OleDbConnection conn;
                if (fileExtenSion.ToLower() == ".xls")
                {
                    conn = new OleDbConnection(connstr2003);
                }
                else
                {
                    conn = new OleDbConnection(connstr2007);
                }
                conn.Open();
                string sql = "select * from [Sheet1$]";
                OleDbCommand cmd = new OleDbCommand(sql, conn);
                DataTable dt = new DataTable();
                OleDbDataReader sdr = cmd.ExecuteReader();
                dt.Load(sdr);
                sdr.Close();
                conn.Close();
                Label2.Text = "Excel里的数据内容:";
               // GridView1.DataSource = dt;
              // GridView1.DataBind();

       if (dt.Columns.Count != 14)
                {
                    lbmsg.Text = "请选择正确的数据表格1";
                    return;
                }
                if (dt.Rows.Count < 1)
                {
                    lbmsg.Text = "请选择正确的数据表格2";
                    return;
                }
                if (dt.Columns[0].ColumnName.ToString() != "核算单元代码" ||
                    dt.Columns[1].ColumnName.ToString() != "险种代码" ||
                    dt.Columns[2].ColumnName.ToString() != "财务代码" || 
                    dt.Columns[3].ColumnName.ToString() != "险种名称" || 
                    dt.Columns[4].ColumnName.ToString() != "渠道属性" || 
                    dt.Columns[5].ColumnName.ToString() != "人员属性" || 
                    dt.Columns[6].ColumnName.ToString() != "期交首年计佣保费" || 
                    dt.Columns[7].ColumnName.ToString() != "期交续年计佣保费" || 
                    dt.Columns[8].ColumnName.ToString() != "趸交计佣保费" || 
                    dt.Columns[9].ColumnName.ToString() != "期交首年直接佣金" || 
                    dt.Columns[10].ColumnName.ToString() != "期交续年直接佣金" || 
                    dt.Columns[11].ColumnName.ToString() != "趸交直接佣金" || 
                    dt.Columns[12].ColumnName.ToString() != "直接佣金合计" || 
                    dt.Columns[13].ColumnName.ToString() != "日期")
                {

                    lbmsg.Text = "请选择正确的数据表格3";
                    return;
                }

3个回答

showbo
showbo   Ds   Rxr 2017.09.08 09:29
已采纳

是不是导入xlsx出错?而且报什么错误也没用说

一般服务器是没有Microsoft.ACE.OLEDB.12.0这个驱动的,因为服务器不会安装office2007+,要下载后再服务器安装,而且注意64位系统程序池要启用32位应用程序

Access2007/2010系统驱动程序下载地址
window2012 未在本地计算机上注册“microsoft.ACE.oledb.12.0”

showbo
showbo 回复changwen313: 这个中文的https://support.microsoft.com/zh-cn/help/894435/how-to-switch-between-the-32-bit-versions-of-asp-net-1-1-and-the-64-bi有用记得采纳哟。。
2 个月之前 回复
showbo
showbo 回复changwen313: 具体看这个:https://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/13f991a5-45eb-496c-8618-2179c3753bb0.mspx?mfr=true不能删除系统盘下的默认inetpub这个文件夹,要使用到里面的脚本
2 个月之前 回复
showbo
showbo 回复changwen313: iis6没有界面设置,要用脚本来设置。cscript.exe adsutil.vbs set W3SVC/AppPools/Enable32BitAppOnWin64 “true”
2 个月之前 回复
changwen313
changwen313 ii6里的应用池实在是没有什么太多东西,找不到设置32位的地方
2 个月之前 回复
showbo
showbo 回复changwen313: 不是那个,是运行你这个网站的程序池的属性里面找,不是网站属性
2 个月之前 回复
changwen313
changwen313 windows2003 64位,我看了下iis里的web服务扩展里asp.net v4.0.30319(32-bit)已经是允许,但是还是不行。
2 个月之前 回复
showbo
showbo 回复changwen313: 2003 64位的没用过,iis6建立的程序池属性中你看下是否有启用32位应用程序的配置,要启用。你这个是找不到32位oledb驱动的问题导致的。
2 个月之前 回复
showbo
showbo 回复changwen313: iis
2 个月之前 回复
changwen313
changwen313 大神你好,我再服务器上已经安装了office2010,我的服务器是windows2003server 64位,现在还是报错,打印出来的拨错信息是‘未在本地计算机上注册“microsoft.ACE.oledb.12.0”’,你的意思是iis的任务池要启用32位应用程序,这句话的意思我理解有两种情况,1,iis调应用池为32位?这个没有找到. 2,vs部署的时候变异成32位的应用程序,这个我也没有找到具体怎么设置。您的意思是1还是2?
2 个月之前 回复
caozhy
caozhy 很可能就是这样
2 个月之前 回复
caozhy
caozhy   Ds   Rxr 2017.09.08 08:25

本地正常,服务器不正常,可能是权限的原因,或者服务器缺少库

li1340089590
li1340089590   2017.09.08 09:25

权限问题,看下excel上传到服务器上面的文件夹,路径地址是不是对everyone开放读写权限

Csdn user default icon
上传中...
上传图片
插入图片