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