2012-09-04 34 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

相关问题