最近學習了c#連接Access。下面是自己寫的一個例子,分享給大家。里面有很多注釋,大家可能看到很多重復的,這是因為我開始學的時候,對很多概念不了解。加加改改,來試驗每句話的用途和用法。里面還有個地方不是很明白
da.Fill(ds)不寫的話,發現對數據庫這些增加,刪除什么都沒有保存的進去的,重新獲取還是原來的數據。但是ds是一個DataSet,da.Fill(ds)只是用da得到的內容來填充ds而已,對數據庫的操作,應該在da = new OleDbDataAdapter(sql,conn);這句話后就完成了。我網上查了資料,也沒太搞清楚,可能是這句話可以更新到數據庫。可能da.Fill()里還有個作用跟da.update()一樣是更新數據庫的。
下面是源代碼 大家只要把oleDBString里改成自己數據庫信息就可以了。建立幾個表,sql語句用到什么表就建什么表,大家可以自己改。還要說明下,里面可能有些變量,list沒用到,是因為我是邊學編自己寫的,試驗的時候用到寫了某個方法 后來可能用不到方法,把方法注釋掉了。代碼布局可能有點亂,大家見諒。如果你自己在學Access連接,自己編代碼,遇到某些問題,這樣就可以直接到我的代碼里具體尋找有沒有解決方法,這樣比較好。如果是從頭開始學的,把代碼全部搞懂,你也就懂Access連接了,當然你要百度google各種方法,類的意思。其實知道幾個關鍵就好了,我列舉下,1查找Access的連接語句資料,2理解datable,dataset的基本用法,3GetOleDbSchemaTable這個函數的意思,基本就可以了。其實代碼很簡單,我可能會有很多冗余,方法位置不合理的情況,我也是新手,需要多學習,多寫代碼。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.Data.OleDb; using System.Data; namespace AccessTest { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { DataSet ds = new DataSet(); DataSet ds1 = new DataSet(); OleDbDataAdapter da = new OleDbDataAdapter(); public MainWindow() { InitializeComponent(); //// OleDbCommand cmd; // //數據庫連接語句 // string oleDBString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:/Users/muma/Documents/AccessTest.accdb"; // //創建連接對象 // OleDbConnection conn = new OleDbConnection(oleDBString); // string sql = "select * from student"; // // cmd = new OleDbCommand(sql,conn); // OleDbDataAdapter da = new OleDbDataAdapter(sql,conn); // DataSet ds = new DataSet(); // DataTable table1 = new DataTable(); // da.Fill(ds,"table1"); // accessGrid.DataContext = ds; //數據庫連接語句 // openAccess(); } private void openAccess() { // OleDbCommand cmd; //數據庫連接語句 string oleDBString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:/Users/muma/Documents/AccessTest.accdb"; string sql = "select * from student"; ds.Clear(); //創建連接對象 OleDbConnection conn = new OleDbConnection(oleDBString); //da = new OleDbDataAdapter(sql,conn); // da.SelectCommand = new OleDbCommand(sql, conn); //OleDbCommandBuilder cb = new OleDbCommandBuilder(da); // da.UpdateCommand = cb.GetUpdateCommand(); da = new OleDbDataAdapter(sql,conn); da.Fill(ds); accessGrid.ItemsSource = ds.Tables[0].DefaultView; conn.Close(); } private void addRow_Click_1(object sender, RoutedEventArgs e) { //更新一條記錄 //openAccess(); if (ds.Tables.Count > 0) { //DataRow drx = ds.Tables[0].NewRow(); //// drx["ID"] = 4; //drx["姓名"] = "yuanl"; //drx["學號"] = 4; //drx["班級"] = "四班"; //ds.Tables[0].Rows.Add(drx); //da.Update(ds.Tables[0]); //accessGrid.DataContext = ds; string oleDBString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:/Users/muma/Documents/AccessTest.accdb"; string sql = "insert into student(姓名,學號,班級) values('yuanl','4','四班')"; OleDbConnection conn = new OleDbConnection(oleDBString); conn.Open(); da = new OleDbDataAdapter(sql,conn); da.Fill(ds);//這里有個問題,如果這句話注釋掉的話,貌似數據庫里數據沒有插入,下面openAccess()函數再重新獲取數據,得到的表是沒有插入語句這條記錄的 // accessGrid.ItemsSource = ds.Tables[0].DefaultView; conn.Close(); openAccess(); } else { MessageBox.Show("請先顯示數據表"); } } private void showTable_Click_1(object sender, RoutedEventArgs e) { //ds.Clear(); // DataTable table1 = new DataTable(); // da.Fill(ds, "ss"); openAccess(); } private void dltRow_Click_1(object sender, RoutedEventArgs e) { // int count = accessGrid.SelectedItems.Count; // DataRow []drv=new DataRow[count]; //for (int i = 0; i < count;i++ ) //{ // drv[i] = accessGrid.SelectedItems[i] as DataRow; // ds.Tables[0].Rows.Remove(drv[i]); //} if(ds.Tables.Count>0) { if (accessGrid.SelectedItem != null) { int index = accessGrid.SelectedIndex; string strIndex = (ds.Tables[0].Rows[index]["ID"]).ToString(); string oleDBString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:/Users/muma/Documents/AccessTest.accdb"; string sql = "delete from student where ID="+strIndex; //創建連接對象 OleDbConnection conn = new OleDbConnection(oleDBString); conn.Open(); da= new OleDbDataAdapter(sql, conn); // OleDbCommandBuilder cb = new OleDbCommandBuilder(da); //da.Fill(ds, "ss"); //ds.Tables[0].Rows.RemoveAt(index); // da.Update(ds.Tables[0]); //accessGrid.DataContext = ds; da.Fill(ds); // accessGrid.ItemsSource = ds.Tables[0].DefaultView; conn.Close(); openAccess(); } else { MessageBox.Show("請選擇要刪除的數據"); } } else { MessageBox.Show("請先顯示數據表"); } } private void Button_Click_1(object sender, RoutedEventArgs e) { string oleDBString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:/Users/muma/Documents/Database1.accdb"; OleDbConnection conn = new OleDbConnection(oleDBString); conn.Open(); DataTable dt = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "Table" }); //ds.Tables.Add(dt); //accessGrid.DataContext = ds; int h = 0; int n = dt.Rows.Count; List<string> strTable = new List<string>(); string[] strColumns = new string[n]; int m = dt.Columns.IndexOf("TABLE_NAME"); foreach (DataRow item in dt.Rows) { h++; string schemaTableName = h.ToString(); strTable.Add(item["TABLE_NAME"].ToString()); getExcelTableColumn(conn, item["table_name"].ToString(), schemaTableName);//可以在這獲取下表的列 //GetTableFieldNameList(conn, item["table_name"].ToString()); } //for (int i = 0; i < n;i++ ) //{ // //strTable.Add(item["TABLE_NAME"].ToString()); // DataRow m_DataRow = dt.Rows[i]; // strTable[i] = m_DataRow.ItemArray.GetValue(m).ToString(); //} for (int i = 0; i < strTable.Count; i++) { tables.Text = tables.Text + strTable[i] + ""; } } private List<string> getExcelTableColumn(OleDbConnection conn, string tableName, string schemaTableName) { //獲取表名 string tblName = tableName.Trim(); List<string> list = new List<string>(); if (string.IsNullOrEmpty(tblName)) { return list; } // //try //{ OleDbConnection oconn = new OleDbConnection(); oconn = conn; //獲取表中的所有列信息 DataTable schemaTable = oconn.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, new object[] { null, null, tblName, null }); // DataTable schemaTable1 = oconn.GetOleDbSchemaTable(OleDbSchemaGuid.Column_Privileges, new object[] { null, null, tblName, null }); // 獲取到列名稱 if (schemaTable.TableName == "Columns") { schemaTable.TableName = schemaTableName; ds.Tables.Add(schemaTable); // ds.Tables.Add(schemaTable1); accessGrid.DataContext = ds; } //判斷ds里是否含有存在名字的table //if (ds.Tables.Count == 0) //{ // ds.Tables.Add(schemaTable); // // ds.Tables.Add(schemaTable1); // accessGrid.DataContext = ds; //} //for (int i = 0; i < ds.Tables.Count; i++) //{ // if (ds.Tables[i] != ds.Tables["Columns"]) // { // ds.Tables.Add(schemaTable); // // ds.Tables.Add(schemaTable1); // accessGrid.DataContext = ds; // } //} DataTable dt = new DataTable(schemaTableName); dt.Columns.Add("column_name", System.Type.GetType("System.String")); dt.Columns.Add("data_type", System.Type.GetType("System.String")); dt.Columns.Add("length", System.Type.GetType("System.String")); dt.Columns.Add("typesta", System.Type.GetType("System.String")); foreach (DataRow row in schemaTable.Rows) { DataRow dr = dt.NewRow(); dr["column_name"] = row["column_name"].ToString(); dr["data_type"] = row["data_type"].ToString(); list.Add(row["column_name"].ToString()); list.Add(row["data_type"].ToString()); // list.Add(row["CHARACTER_MAXIMUM_LENGTH"].ToString()); string maxLength = row["CHARACTER_MAXIMUM_LENGTH"].ToString(); string numPre = row["NUMERIC_PRECISION"].ToString(); string numSca = row["NUMERIC_SCALE"].ToString(); string datePre = row["DATETIME_PRECISION"].ToString(); if (!string.IsNullOrEmpty(maxLength)) { int length = Convert.ToInt32(maxLength); string s = length.ToString(); list.Add(s); dr["length"] = s; } if (!string.IsNullOrEmpty(numPre) ) { string s; string ss; int length = Convert.ToInt32(numPre); s = length.ToString(); if (!string.IsNullOrEmpty(numSca)) { int typesta = Convert.ToInt32(numSca); length = length - typesta; ss = typesta.ToString(); s = length.ToString(); list.Add(ss); dr["typesta"] = ss; } list.Add(s); dr["length"] = s; } if (!string.IsNullOrEmpty(datePre)) { int a = Convert.ToInt32(datePre); string s = a.ToString(); list.Add(s); dr["length"] = s; } dt.Rows.Add(dr); } ds1.Tables.Add(dt); // ds.Tables.Add(schemaTable1); dtTest.DataContext = ds1; //dtTest.ItemsSource = dt.DefaultView; for (int i = 0; i < list.Count; i++) { columns.Text = columns.Text + list[i] + ""; } //} //catch (Exception exc) //{ // //PublicMethod.MessageError("加載Access文件過程發生異常,請重試!"); //} return list; } public List<string> GetTableFieldNameList(OleDbConnection conn, string TableName) { List<string> list = new List<string>(); try { if (conn.State == ConnectionState.Closed) conn.Open(); using (OleDbCommand cmd = new OleDbCommand()) { cmd.CommandText = "SELECT TOP 1 * FROM [" + TableName + "]"; cmd.Connection = conn; OleDbDataReader dr = cmd.ExecuteReader(); //string s1 = dr[0].ToString(); //string s2 = dr[1].ToString(); //string s3 = dr[2].ToString(); //txtBox.Text = s1 + s2 + s3; for (int i = 0; i < dr.FieldCount; i++) { list.Add(dr.GetName(i)); } } return list; } catch (Exception e) { throw e; } //finally //{ // if (conn.State == ConnectionState.Open) // conn.Close(); // conn.Dispose(); //} } private void updateRow_Click_1(object sender, RoutedEventArgs e) { if (ds.Tables.Count > 0) { if (accessGrid.SelectedItem != null) { int index = accessGrid.SelectedIndex; string strIndex = (ds.Tables[0].Rows[index]["ID"]).ToString(); string oleDBString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:/Users/muma/Documents/AccessTest.accdb"; string sql = "update student set 姓名=\"哈哈\"where ID=" + strIndex; //創建連接對象 學號=5 班級=你猜啊 OleDbConnection conn = new OleDbConnection(oleDBString); conn.Open(); da = new OleDbDataAdapter(sql, conn); // da.UpdateCommand = new OleDbCommand(sql,conn); // OleDbCommandBuilder cb = new OleDbCommandBuilder(da); //da.Fill(ds, "ss"); //ds.Tables[0].Rows.RemoveAt(index); // da.Update(ds.Tables[0]); // accessGrid.DataContext = ds; da.Fill(ds); // accessGrid.ItemsSource = ds.Tables[0].DefaultView; conn.Close(); openAccess(); } else { MessageBox.Show("請選擇要更新的數據"); } } else { MessageBox.Show("請先顯示數據表"); } } } }
我解釋下,private void Button_Click_1(object sender, RoutedEventArgs e)這個事件是我獲取數據庫表的架構信息,可以得到數據庫表名,和表的列名,以及字段信息。
里面用到的一個重要方法就是DataTable dt = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "Table" });
代碼里還有2個函數,
private List<string> getExcelTableColumn()和public List<string> GetTableFieldNameList()這2個都是獲得指定表的字段信息,大家看源碼里指定了幾個參數
比較推薦用的是 private List<string> getExcelTableColumn()這個,后面沒研究過,功能也只是獲得列名。
放幾個圖片看下這個Button事件的效果
button的content是顯示所有列名,大家把datagrid的Binging改成1或者2就好了,因為大家看源碼里,上面提到的2個函數里有這個參數string schemaTableName,因為我datatable是存到dataset里的,如果不自己定義個名字會報錯,dataset里存在名字一樣的表了,我在button事件里一個循環里調用了這個函數,我就自己定義個i,每次循環i++,再把i.tostring(),傳給函數當datatable的name。改Binding在這里改,如下圖
里面可以改1或者2,因為循環了2次,循環幾次是看你Access里某個數據庫有幾個表的。
xaml文件很簡單,就是放了2個datagrid和幾個button,用例展現結果的。
下面是xaml代碼
<Window x:Class="AccessTest.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <Grid> <DataGrid ItemsSource="{Binding ss}" Name="accessGrid" AutoGenerateColumns="True" HorizontalAlignment="Left" Margin="235,87,0,0" VerticalAlignment="Top"/> <TextBox Name="txtBox" HorizontalAlignment="Left" Height="23" Margin="0,23,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="120"/> <Button Name="addRow" Click="addRow_Click_1" Content="增加一條記錄" HorizontalAlignment="Left" Margin="45,252,0,0" VerticalAlignment="Top" Width="75"/> <Button Name="showTable" Click="showTable_Click_1" Content="顯示表" HorizontalAlignment="Left" Margin="45,288,0,0" VerticalAlignment="Top" Width="75"/> <Button Name="dltRow" Click="dltRow_Click_1" Content="刪除選中記錄" HorizontalAlignment="Left" Margin="45,213,0,0" VerticalAlignment="Top" Width="75"/> <Button Content="顯示所有列名" HorizontalAlignment="Left" Margin="45,175,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click_1"/> <TextBox Name="tables" HorizontalAlignment="Left" Height="23" Margin="68,100,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="Auto"/> <TextBox Name="columns" HorizontalAlignment="Left" Height="23" Margin="45,62,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="Auto"/> <DataGrid Name="dtTest" ItemsSource="{Binding 1}" AutoGenerateColumns="True" HorizontalAlignment="Left" Margin="235,201,0,0" VerticalAlignment="Top"/> <Button Name="updateRow" Content="更新一條記錄" Click="updateRow_Click_1" HorizontalAlignment="Left" Margin="45,139,0,0" VerticalAlignment="Top" Width="75"/> </Grid> </Window>
要展現哪個DataTable內容,在ItemsSource里 設置不同Binding就行了。