C#连接Access和增删改查基本方法

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

posted @ 2013-09-04 14:33  YzfMuma  阅读(12352)  评论(0编辑  收藏  举报