Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net MS Access数据库可以在调试模式下访问,但在发布时无法访问_Asp.net_Visual Studio_Ms Access_Iis_Iis Express - Fatal编程技术网

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

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

我在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文件的代码

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服务器中不应该有可写文件。请考虑一下。更改此选项可能会使管理权限、路径等更容易。