博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#连接Access和增删改查基本方法
阅读量:4974 次
发布时间:2019-06-12

本文共 15551 字,大约阅读时间需要 51 分钟。

最近学习了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;            List
strTable = 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就行了。

转载于:https://www.cnblogs.com/yzfmuma/p/3300855.html

你可能感兴趣的文章
OPENSSL使用方法
查看>>
接口操作XML
查看>>
idhttp访问DATASNAP有密码验证的中间件
查看>>
libmidas.so.2
查看>>
开发WINDOWS服务程序
查看>>
httpencode编码
查看>>
cross socket和msgpack的数据序列和还原
查看>>
解决跨操作系统平台JSON中文乱码问题
查看>>
DELPHI搭建centos开发环境
查看>>
IdHTTPServer允许跨域访问
查看>>
更新.net core 3.0,dotnet ef命令无法使用的解决办法
查看>>
React躬行记(13)——React Router
查看>>
前端利器躬行记(1)——npm
查看>>
前端利器躬行记(2)——Babel
查看>>
前端利器躬行记(6)——Fiddler
查看>>
Forbidden You don't have permission to access / on this server.
查看>>
Intellij Idea新建web项目(转)
查看>>
用JAVA编写浏览器内核之实现javascript的document对象与内置方法
查看>>
centos iptables
查看>>
unity3d 移动与旋转 2
查看>>