服务器上出现Microsoft Jet 数据库引擎打不开文件''。 它已经被别的用户以独占方式打开,或没有查看数据的权限。

ws_hgo 2009-09-29 02:16:34
    //先将Excel传到服务器上面
protected void Button1_Click(object sender, EventArgs e)
{
string Excel = string.Empty;
Boolean fileOK = false;
String path = Server.MapPath("~/UploadExcel/");
if (FileUpload1.HasFile)
{
String fileExtension =
System.IO.Path.GetExtension(FileUpload1.FileName).ToLower();
String[] allowedExtensions =
{ ".xls" };
for (int i = 0; i < allowedExtensions.Length; i++)
{
if (fileExtension == allowedExtensions[i])
{
fileOK = true;
}
}
}

if (fileOK)
{
try
{
FileUpload1.PostedFile.SaveAs(path
+ FileUpload1.FileName);
Excel = FileUpload1.PostedFile.FileName;
DataTableToDB(Excel);
//Label1.Text = "File uploaded!";
}
catch (Exception ex)
{
Response.Write(ex.Message);
Label1.Text = "上传失败!";
}
}
else
{
Label1.Text = "文件格式不对.";
}



}
public static void DataTableToDB(string Ex)
{
ASP.admin_bjproduct_list_aspx list = new admin_bjproduct_list_aspx();
BJProductCategory CC = new BJProductCategory();
DataTable dtExcel = ExcelToDataTable(Ex, "Sheet1");
DT = CreateParentTable();
try
{
for (int i = 0; i < dtExcel.Rows.Count; i++)
{
if (dtExcel.Rows[i][0].ToString() != null || dtExcel.Rows[i][0].ToString() != "")
{

DR = DT.NewRow();
int PID = CategoryID(dtExcel.Rows[i][2].ToString());
CC.ID = PID;
WebManager.GetInfo(CC);
if (CC.Title == "")
{
continue;
}
else
{
DR["Title"] = dtExcel.Rows[i][1].ToString();
DR["ParentID"] = PID;
DR["tmp1"] = dtExcel.Rows[i][3].ToString();
DR["tmp2"] = float.Parse(dtExcel.Rows[i][4].ToString());
DR["tmp3"] = dtExcel.Rows[i][5].ToString();

}
DT.Rows.Add(DR);

}
else
{
list.AlertMsg("该行数据为空!");
}
}
DataRow[] Last = DT.Select("tmp2>0");
LastDT = Last[0].Table;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}


using (System.Data.SqlClient.SqlBulkCopy bulkCopy =
new System.Data.SqlClient.SqlBulkCopy(@"Data Source=PC-200906271415\WS_HGO;Initial Catalog=F:\我的单子\200904\项目\ZYT\APP_DATA\BJYZT.MDF;User ID=sa;Password=123456;max pool size=512;pooling=true;"))
{
bulkCopy.DestinationTableName =
"BJProduct";
bulkCopy.ColumnMappings.Add("Title", "Title");
bulkCopy.ColumnMappings.Add("ParentID", "ParentID");
bulkCopy.ColumnMappings.Add("tmp1", "tmp1");
bulkCopy.ColumnMappings.Add("tmp2", "tmp2");
bulkCopy.ColumnMappings.Add("tmp3", "tmp3");

try
{
bulkCopy.WriteToServer(LastDT);
list.AlertMsg("数据导入成功!");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
DT.Clear();
}
}
}
//将Excel中的内容插入到DataTable中
public static DataTable ExcelToDataTable(string strExcelFileName, string strSheetName)
{
string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + strExcelFileName + ";" + "Extended Properties=Excel 8.0;";
string strExcel = string.Format("select * from [{0}$]", strSheetName);
DataSet ds = new DataSet();

using (System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection(strConn))
{
conn.Open();
System.Data.OleDb.OleDbDataAdapter adapter = new System.Data.OleDb.OleDbDataAdapter(strExcel, strConn);
adapter.Fill(ds);
conn.Close();
conn.Dispose();
}

return ds.Tables[0];
}
//获取父类ID
public static int CategoryID(string category)
{
int CID = 1;
string s = "cn";
System.Data.SqlClient.SqlConnection Conn = new System.Data.SqlClient.SqlConnection();

Conn.ConnectionString = @"Data Source=PC-200906271415\WS_HGO;Initial Catalog=F:\我的单子\200904\项目\ZYT\APP_DATA\BJYZT.MDF;User ID=sa;Password=123456;";
Conn.Open();
string sqlcategory = "insert into BJProductCategory (Title,ParentID,Version) values('" + category + "'," + 1 + ",'" + s + "')";
System.Data.SqlClient.SqlCommand Com = new System.Data.SqlClient.SqlCommand(sqlcategory, Conn);

int i = Com.ExecuteNonQuery();
if (i > 0)
{
//取出最大值就是当前插入的ID
string str = "select max(ID) AS ID from BJProductCategory";
System.Data.SqlClient.SqlCommand Cmd = new System.Data.SqlClient.SqlCommand(str, Conn);
CID = Convert.ToInt32(Cmd.ExecuteScalar());
}
Conn.Close();
Conn.Dispose();
return CID;


}
//Title,ParentID,tmp1,tmp2,tmp3,Version
public static DataTable CreateParentTable()
{
ParentTable.Columns.Clear();
DC = new DataColumn();
DC.ColumnName = "Title";
DC.DataType = System.Type.GetType("System.String");
ParentTable.Columns.Add(DC);
DC = new DataColumn();
DC.ColumnName = "ParentID";
DC.DataType = System.Type.GetType("System.Int32");
ParentTable.Columns.Add(DC);
DC = new DataColumn();
DC.ColumnName = "tmp1";
DC.DataType = System.Type.GetType("System.String");
ParentTable.Columns.Add(DC);
DC = new DataColumn();
DC.ColumnName = "tmp2";
DC.DataType = System.Type.GetType("System.String");
ParentTable.Columns.Add(DC);
DC = new DataColumn();
DC.ColumnName = "tmp3";
DC.DataType = System.Type.GetType("System.String");
ParentTable.Columns.Add(DC);
DC = new DataColumn();
DC.ColumnName = "Version";
DC.DataType = System.Type.GetType("System.String");
ParentTable.Columns.Add(DC);
return ParentTable;
}
...全文
3623 30 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
luoxuan16899168 2010-07-14
  • 打赏
  • 举报
回复
标记 呵呵
foolmicky 2009-12-12
  • 打赏
  • 举报
回复
我的ASP程序在访问ACCESS数据库时出错,错误码如下:Microsoft OLE DB Provider for ODBC Drivers error '80004005'
[Microsoft][ODBC Microsoft Access Driver] The Microsoft Jet 数据库引擎打不开文件'(未知的)'。 它已经被别的用户以独占方式打开,或没有查看数据的权限。
后在网上找到篇资料,按照该方法问题解决。
原因:
这个错误发生在当IIS使用匿名帐号(通常是IUSR)时,该帐号在NT中对数据库所在的目录
没有正确的权限.(这就是为什么在Win95和PWS下没问题,因为win95根本就没有目录权限这一说)
检查文件和目录的权限. 确定你能够在该目录中有能够新建和删除临时文件的权限。
这些临时文件其实是数据库建立在同一个目录下的文件, 但是要注意的是,有可能这些文件
也可能建立在别的目录,(例如 /Winnt. ,2003server有可能是:c:\windows\temp)

使用NT的文件监视程序监视文件失败时到底是访问了什么目录。 程序名为:ProcessMonitor
这个NT的文件监视程序可以在这个地方下载 http://www.sysinternals.com.

使用Process Monitor ,我查找到ASP程序在访问目录c:\windows\temp时遭deny,后赋予该目录iuser用户权限后问题解决。在此非常感谢该文章作者AFly
该文章出处:http://www.playes.net/Blog/257.asp
ws_hgo 2009-09-29
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 cpio 的回复:]
速度不快是指上传速度不快还是把Excel文件变成DataTable不快?
[/Quote]
当我获取到
对应的DataTable在用BCP导入的是时候
我估计速度应该是很快的

那么就是那个Excel导入到DataTable的时候速度不快
cpio 2009-09-29
  • 打赏
  • 举报
回复
速度不快是指上传速度不快还是把Excel文件变成DataTable不快?
加油馒头 2009-09-29
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 ws_hgo 的回复:]
引用 20 楼 cpio 的回复:

Excel = FileUpload1.PostedFile.FileName;
改成
Excel = path + FileUpload1.FileName;
就可以了啊

经过测试确实可以啦
谢谢
貌似速度不快

大家帮忙看下代码
那些可以完善下
提高下效率
[/Quote]


原来是没找到文件。。。。。。。。
加油馒头 2009-09-29
  • 打赏
  • 举报
回复
你操作的 时候
是不是开着 你当前的excel文件》?

如果是,请关了 要操作的excel文件


加油馒头 2009-09-29
  • 打赏
  • 举报
回复
权限问题

以前做ASP,连接数据库常遇到

要么是数据库没有关闭 要么就是 没有读取的权限
ws_hgo 2009-09-29
  • 打赏
  • 举报
回复
up
ws_hgo 2009-09-29
  • 打赏
  • 举报
回复
分可以在加
ws_hgo 2009-09-29
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 cpio 的回复:]

Excel = FileUpload1.PostedFile.FileName;
改成
Excel = path + FileUpload1.FileName;
就可以了啊
[/Quote]
经过测试确实可以啦
谢谢
貌似速度不快啊

大家帮忙看下代码
那些可以完善下
提高下效率
cpio 2009-09-29
  • 打赏
  • 举报
回复

Excel = FileUpload1.PostedFile.FileName;
改成
Excel = path + FileUpload1.FileName;
就可以了啊
ws_hgo 2009-09-29
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 ncjcz 的回复:]
另外
Server.MapPath容易出问题,建议用
System.AppDomain.CurrentDomain.BaseDirectory替换,得到根目录,再拼
[/Quote]

LS的兄弟
能不能说具体点
ncjcz 2009-09-29
  • 打赏
  • 举报
回复
另外
Server.MapPath容易出问题,建议用
System.AppDomain.CurrentDomain.BaseDirectory替换,得到根目录,再拼
ncjcz 2009-09-29
  • 打赏
  • 举报
回复
FileUpload1.PostedFile.SaveAs(path
+ FileUpload1.FileName);
Excel = FileUpload1.PostedFile.FileName;
改下

Excel =(path + System.IO.Path.GetFileName(FileUpload1.FileName));
FileUpload1.PostedFile.SaveAs(Excel);

另外只要服务器上office版本高于你上传文件的版本(也就是能向下兼容),就没问题
ojekleen 2009-09-29
  • 打赏
  • 举报
回复
连接数据库之前,先check excel 文件是否存在,

如果是因为路径错误。。这个exception throw的太垃圾了。。让人浮想不到啊。。
ojekleen 2009-09-29
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 ws_hgo 的回复:]
我的文件名路径改成这样吗?
  Excel=path + FileUpload1.FileName;
[/Quote]
如果是你的路径不对的话,应该是服务器保存的地址。
ws_hgo 2009-09-29
  • 打赏
  • 举报
回复
我的文件名路径改成这样吗?
Excel=path + FileUpload1.FileName;
cpio 2009-09-29
  • 打赏
  • 举报
回复
FileUpload1.PostedFile.FileName表示的是客户机的文件名加路径,

FileUpload1.FileName才表示文件名
ws_hgo 2009-09-29
  • 打赏
  • 举报
回复
cpio还有个问题
如果
服务器office版本跟我本地上传的不一样
会不会出现这个问题啊
cpio 2009-09-29
  • 打赏
  • 举报
回复
我知道了,应该是路径没对

Excel = FileUpload1.FileName; 表示的是客户机的文件名,并不表示服务器存放的文件名。
加载更多回复(10)

62,248

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧