可以在调试模式下访问MS Access数据库,但在发布时无法访问

时间:2019-01-29 17:06:54

标签: asp.net visual-studio ms-access iis iis-express

我已经在ASP.NET中编写了一些访问Microsoft Access数据库的基本代码,当我在IIS Express上以调试模式运行时,该代码可以工作,但是当我发布该应用程序并尝试在实际网站上运行时,我得到了错误。

  

[IndexOutOfRangeException:在位置0没有行。]

     

System.Data.RBTree`1.GetNodeByIndex(Int32 userIndex)+2430497

     

NIM_Tool.Default.Page_Load(对象发送者,EventArgs e)+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文件中的代码

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文件位于同一目录中。我尝试过对数据库路径以及在服务器上应该访问的位置进行硬编码,但是也收到了相同的错误消息。

1 个答案:

答案 0 :(得分:1)

一些建议:当您发现错误并且不采取任何措施时,您就是自己的敌人。它被称为“吞咽错误”,它隐藏了根本原因。

相反,我建议重新抛出。将您的(原始)异常作为.InnerException。您可能希望将connString放在(外部)Exception的.Description中。 (以防万一,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;
}