Asp.net MS Access数据库可以在调试模式下访问,但在发布时无法访问
我在ASP.NET中编写了一些访问Microsoft Access数据库的基本代码,当我在IIS Express上以调试模式运行时,该数据库可以工作,但当我发布应用程序并尝试在实际网站上运行时,我收到了错误 [IndexOutOfRangeException:位置0处没有行。] System.Data.RBTree`1.GetNodeByIndex(Int32用户索引)+2430497 NIM_工具.Default.Page_加载(对象发送者,事件参数)+2321 System.Web.UI.Control.OnLoad(EventArgs e)+106 System.Web.UI.Control.LoadRecursive()+68 System.Web.UI.Page.ProcessRequestMain(布尔includeStagesBeforeAsyncPoint,布尔includeStagesAfterAsyncPoint)+3785 通过修改我的一些代码,我确信无法找到数据库,但我不明白为什么它可以在调试/发布模式下访问,而不能在发布模式下访问。单击“发布”后,所有文件都从根目录转到bin/Release/publish/文件夹,然后我将发布文件夹的所有子文件夹复制到正确的服务器路径。子文件/文件夹还包含正确的MS Access数据库 来自DataLayer.cs文件的代码Asp.net MS Access数据库可以在调试模式下访问,但在发布时无法访问,asp.net,visual-studio,ms-access,iis,iis-express,Asp.net,Visual Studio,Ms Access,Iis,Iis Express,我在ASP.NET中编写了一些访问Microsoft Access数据库的基本代码,当我在IIS Express上以调试模式运行时,该数据库可以工作,但当我发布应用程序并尝试在实际网站上运行时,我收到了错误 [IndexOutOfRangeException:位置0处没有行。] System.Data.RBTree`1.GetNodeByIndex(Int32用户索引)+2430497 NIM_工具.Default.Page_加载(对象发送者,事件参数)+2321 System.Web.UI.C
public class DataLayer {
static OleDbConnection conn;
static OleDbCommand cmd;
static String connString;
static OleDbDataAdapter adp;
private static void CreateCommand()
{
// have also tried hardcoding this to the production server path but this failed too
connString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + HttpContext.Current.Server.MapPath("MyDatabase.mdb") + ";Persist Security Info=False;"
conn = new OleDbConnection(connString);
cmd = new OleDbCommand();
cmd.Connection = conn;
adp = new OleDbDataAdapter();
}
public static DataTable GetDefaultDeposit()
{
DataTable dt = new DataTable();
CreateCommand();
try {
cmd.CommandText = "SELECT * FROM Table1";
adp.SelectCommand = cmd;
adp.Fill(dt);
}
catch (Exception ex) {
}
return dt;
}
}
以及Default.aspx.cs代码
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
DataTable dtDeposit = DataLayer.GetDefaultDeposit();
string fixedCost = (string)dtDeposit.Rows[0]["FixedCost"];
}
}
MyDatabase.mdb文件与DataLayer.cs文件位于同一目录中。我也尝试过将数据库路径硬编码到应该在服务器上访问的位置,但也得到了相同的错误消息。一点建议:当你发现错误时,你就是你自己的敌人,不做任何处理。这被称为“吞咽错误”,它隐藏了根本原因 相反,我建议做一次重新投掷。将(原始)异常作为
.InnerException
。您可能希望在(外部)异常的.Description中包含您的connString
。(以防万一MapPath没有做您认为应该做的事情,等等)
像这样:
public static DataTable GetDefaultDeposit()
{
DataTable dt = new DataTable();
CreateCommand();
try {
cmd.CommandText = "SELECT * FROM Table1";
adp.SelectCommand = cmd;
adp.Fill(dt);
}
catch (Exception ex) {
throw new Exception("ConnString=" + connString, ex);
}
return dt;
}
哇,伊克斯。不要将数据库放在/bin
文件夹中。创建一个类似“c:\inetpub\data”的文件夹。尝试为您的IIS正在使用的应用程序池的帐户/标识读/写文件夹(或者尝试“Everyone”进行快速测试以确认)。哦,哎呀,我写错了我的帖子。。。它不在/bin文件夹中。它与其余文件和DataLayer.cs文件处于同一级别。我刚刚编辑了我的帖子来澄清这一点。我将服务器路径更改为/bin/Release/Publish/文件夹(VS在其中发布网站文件),最初我得到了您所说的权限错误。当我转到文件夹设置并将其更改为允许IIS所有权限时,我收到了我最初收到的错误消息(位置0处没有行),这表明文件权限不是缺少数据库访问的原因。一点建议:当你发现错误时,你就是你自己的敌人,不要对它做任何事情。这被称为“吞咽错误”,它隐藏了根本原因。相反,我建议执行重新抛出,但使用(原始)异常作为。InnerException
,而外部异常描述应该包含ConnString
。(以防万一它没有做你认为应该做的事情)还有一件事:出于安全原因,如果1)你在一个可以下载的路径中有一个DB(即wwwroot中的任何地方),这被认为是有风险的。请重新考虑。。2) web服务器中不应该有可写文件。请考虑一下。更改此选项可能会使管理权限、路径等更容易。