最近学习了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{ ////// Interaction logic for MainWindow.xaml /// 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; ListstrTable = new List (); 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 getExcelTableColumn(OleDbConnection conn, string tableName, string schemaTableName) { //获取表名 string tblName = tableName.Trim(); List list = new List (); 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 GetTableFieldNameList(OleDbConnection conn, string TableName) { List list = new List (); 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代码
要展现哪个DataTable内容,在ItemsSource里 设置不同Binding就行了。