Доступ к базе данных MS Access возможен в режиме отладки, но недоступен при публикации - PullRequest
0 голосов
/ 29 января 2019

Я написал некоторый базовый код в 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.что база данных не может быть найдена, но я не могу понять, почему к ней можно получить доступ в режиме отладки / выпуска, но не в опубликованном режиме.После нажатия кнопки «Опубликовать» все файлы были перемещены в папку 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 голосов
/ 30 января 2019

Небольшой совет: вы становитесь своим собственным врагом, когда обнаруживаете ошибку и ничего с ней не делаете.Это называется «проглатывание ошибки» и скрывает первопричины.

Вместо этого я бы рекомендовал сделать повторный бросок.Поместите свое (оригинальное) исключение как .InnerException.Возможно, вы захотите иметь свой connString в .Description для (внешнего) Exception.(На всякий случай, если 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;
}
...