2012-09-04 42 views
1

我寫一個應用程序,必須具備以下能力:如何使用C#Web應用程序更新.mdb文件?

  • GUI應該在網絡界面上看到(因此我使用C#Web應用程序)
  • 能夠選擇的.mdb文件
  • 添加行
  • 刪除行
  • 編輯行
  • 保存一切回到.mdb文件。

我已經GOOGLE了很長時間了。

我在一個正常的C#窗體窗體應用程序中編寫了類似的應用程序,我使用OLEdb來完成所有工作,並且工作正常,它不僅限於一個.mdb文件。

在C#Windows窗體應用程序中,我使用了Gridview控件。 由於Web應用程序沒有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文件
  • 獲取文件,並顯示在表它
  • 讀取所選表格中的數據並將其顯示在gridview中
  • 添加編輯刪除按鈕

現在,當我點擊編輯按鈕,它使所選行編輯。 但是,當我點擊更新按鈕,我得到「對象引用未設置爲對象的實例。」 該代碼在窗體應用程序工作..

有什麼辦法adapter.Update(userTable);將能夠在表單應用程序中工作相同的工作嗎?

任何人都可以請幫我看看我的問題。如果我只能將它保存到.mdb文件中,我將非常高興。

+0

你有沒有檢查adapter'的'值不爲空的datagrid_RowUpdating方法? – Blachshma

+0

它是空的,但我不明白爲什麼?因爲我確實聲明瞭它並創建它的一個實例 – Gillan

回答

0

私有變量的行爲在Web應用程序與WinForms中不同。 簡而言之: 您應該初始化Page_Load方法中的變量(具體爲adapter)。它將不是空的,你可以使用它。

注意:您還需要保存在你的數據集進行了哪些變化? 我建議你閱讀,稍微介紹一下它是如何工作? 可以使用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

相關問題