Как обновить файлы .mdb с помощью веб-приложения C#?

Я пишу приложение, которое должно иметь возможность:

  • Графический интерфейс должен отображаться в веб-интерфейсе (поэтому я использую веб-приложение С#)
  • Уметь выбирать файлы .mdb
  • Добавить строки
  • Удалить строки
  • Изменить строки
  • Сохраните все обратно в файл .mdb.

Я гуглил целую вечность.

Я написал аналогичное приложение в обычном приложении формы Windows на С#, я использовал OLEdb, чтобы делать все, и оно работало нормально, оно не ограничивалось только одним файлом .mdb.

В приложении C# Windows Form я использовал элемент управления Gridview. Поскольку в веб-приложении нет Gridview, я использовал сетку данных.

Вот код, который есть до сих пор:

public partial class _Default : System.Web.UI.Page
{

    string databasePath = "____________.mdb";
    DataTable userTable = new DataTable();
    OleDbDataAdapter adapter;
    OleDbConnection connection;
    OleDbCommand command;
    OleDbCommandBuilder builder;
    DataSet ds;
    DataSet tempDs;
    public string DatabaseName = null;
    string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=";



    protected void Page_Load(object sender, EventArgs e)
    {
        tbDatabasePath.Text = databasePath;
    }

    protected void btnLoadData_Click(object sender, EventArgs e)
    {
        ReadRecords();
    }

    protected void btnGetTables_Click(object sender, EventArgs e)
    {
        try
        {
            ddTables.Items.Clear();
            ddTables.Text = null;
            getTables();

        }
        catch (Exception ex)
        {
            ClientScript.RegisterStartupScript(this.GetType(), "myalert", "alert('Could not retrieve the Tables');", true);
        }
    }


    private void getTables()
    {

        string tempstring = "";
        string getTConnection = connectionString + databasePath; ;

        OleDbConnection myConnection = new OleDbConnection(getTConnection);

        myConnection.Open();

        DataTable datT = myConnection.GetSchema("Tables");

        for (int i = 0; i < datT.Rows.Count; i++)
        {
            tempstring = datT.Rows[i][2].ToString();

            if (tempstring.Contains("MSys"))
            {
            }
            else
            {
                ddTables.Items.Add(datT.Rows[i][2].ToString());
            }
        }
        myConnection.Close();
    }

    private void ReadRecords()
    {
        datagrid.DataSource = null;

        OleDbDataReader reader = null;

        try
        {
            connection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; " + "Data Source=" + databasePath);
            OleDbCommand cmd = new OleDbCommand("Select * FROM " + ddTables.Text, connection);
            adapter = new OleDbDataAdapter(cmd);
            builder = new OleDbCommandBuilder(adapter);
            ds = new DataSet("MainDataSet");
            tempDs = new DataSet("TempDataSet");

            connection.Open();
            adapter.Fill(tempDs);
            tempDs.Clear();
            tempDs.Dispose();
            adapter.Fill(ds, ddTables.Text);
            userTable = ds.Tables[ddTables.Text];

        }
        catch
        {
            ClientScript.RegisterStartupScript(this.GetType(), "myalert", "alert('Could not load the data');", true);
        }
        finally
        {
            if (reader != null) reader.Close();
            //if (connection != null) connection.Close();
            datagrid.ShowFooter = true;
        }
        CreateTempTable(0, 10);
        ClientScript.RegisterStartupScript(this.GetType(), "myalert", "alert('DONE');", true);

    }

    private void ReadRecords2()
    {
       // datagrid.DataSource = null;

        OleDbDataReader reader = null;

        try
        {
            connection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; " + "Data Source=" + databasePath);
            OleDbCommand cmd = new OleDbCommand("Select * FROM " + ddTables.Text, connection);
            adapter = new OleDbDataAdapter(cmd);
            builder = new OleDbCommandBuilder(adapter);
            ds = new DataSet("MainDataSet");
            tempDs = new DataSet("TempDataSet");

            connection.Open();
            adapter.Fill(tempDs);
            tempDs.Clear();
            tempDs.Dispose();
            adapter.Fill(ds, ddTables.Text);
            userTable = ds.Tables[ddTables.Text];

        }
        catch
        {
            ClientScript.RegisterStartupScript(this.GetType(), "myalert", "alert('Could not load the data');", true);
        }
        finally
        {
            if (reader != null) reader.Close();
            //if (connection != null) connection.Close();
        }
        CreateTempTable(0, 10);
        ClientScript.RegisterStartupScript(this.GetType(), "myalert", "alert('DONE');", true);

    }

    private void CreateTempTable(int startRecord, int noOfRecords)
    {
        try
        {
            userTable.Rows.Clear();
            adapter.Fill(ds, "");
            userTable = ds.Tables[""];
        }
        catch (Exception ex)
        {
            ClientScript.RegisterStartupScript(this.GetType(), "myalert", "alert('Could not load the data in  CreateTempTable');", true);
        }


        datagrid.DataSource = userTable.DefaultView;
        datagrid.DataBind();

    }

    protected void datagrid_RowEditing(object sender, GridViewEditEventArgs e)
    {
        datagrid.EditIndex = e.NewEditIndex;
        ReadRecords();

    }

    protected void datagrid_SelectedIndexChanged(object sender, EventArgs e)
    {

    }

    protected void datagrid_RowUpdated(object sender, GridViewUpdatedEventArgs e)
    {
        adapter.Update(userTable);
    }

    protected void datagrid_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {

        adapter.Update(userTable);
        ReadRecords();
    }

    protected void datagrid_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
    {

       datagrid.EditIndex = -1;
       ReadRecords();

    }

    protected void datagrid_RowDeleting(object sender, GridViewDeleteEventArgs e)
    {
        int rowToDelete = e.RowIndex;
        datagrid.DeleteRow(rowToDelete);
        adapter.Update(userTable);
        ReadRecords();

    }
}

}

Он может :

  • получить файл .mdb
  • получить таблицы в файле и отобразить его
  • прочитать данные из выбранной таблицы и отобразить их в виде сетки
  • добавить кнопки редактирования удаления

Теперь, когда я нажимаю кнопку редактирования, выбранная строка становится доступной для редактирования. Но когда я нажимаю кнопку обновления, я получаю «Ссылка на объект не указывает на экземпляр объекта». Код работал в приложении Forms.

Есть ли способ adapter.Update(userTable); сможет ли он работать так же, как в приложении форм?

Может ли кто-нибудь помочь мне увидеть мою проблему. Если бы я мог заставить его сохранить изменения обратно в файл .mdb, я был бы очень рад.


person Gillan    schedule 04.09.2012    source источник
comment
Вы проверили, что значение adapter не равно нулю в методе datagrid_RowUpdating?   -  person Blachshma    schedule 04.09.2012
comment
Это ноль, но я не понимаю, почему? Потому что я объявляю это и делаю экземпляр   -  person Gillan    schedule 04.09.2012


Ответы (1)


Поведение частных переменных отличается в веб-приложениях от WinForms. Вкратце: вы должны инициализировать переменные (в частности, adapter) в методе Page_Load. Тогда он будет не нулевым, и вы сможете его использовать.

Примечание. Вам также потребуется сохранить изменения, внесенные в ваш набор данных... Я рекомендую прочитать немного больше о том, как все это работает... Вы можете использовать Session или, что еще лучше, проверьте ViewState

Общие сведения о состоянии представления ASP.NET: http://msdn.microsoft.com/en-us/library/ms972976.aspx

IsPostBack: http://msdn.microsoft.com/en-us/library/system.web.ui.page.ispostback.aspx

person Blachshma    schedule 04.09.2012