access数据库

                经过连续几天的学习,初步了解access数据库。以下是知识点的总结,对应刚刚学习的人会很有帮助。

                               ADO.NET是数据的访问架构

它主要包括   connection,command,datareader,dataadapter,dataset,datatable等六个对象

一、connection 作用:连接数据库

        string str ="连接字符串" 

        什么是连接字符串呢?

 

二、dataGridView控件

       在介绍其他对象之前说说dataGridView控件,数据库在程序里面是抽象的东西,dataGridView控件的作用就像是把数据库实列化一样,让眼睛可以看得见。先解释这么多,后面的内容要看完其他对象的介绍,回过头来看吧。

       如果你是先看过三到七的内容你才会理解下面的内容

adapter.Fill(dt);                   // 通过适配器把表的数据库表内容填充到内存dt

数据已经在内存中,我们可以通过dataGridView控件把数据展示出来

 dataGridView1.DataSource = dt;           // 把数据显示到界面

值得说明的是这个等式的两边不是相同类型,右边赋值给左边会很安全,但是当左边赋值给右边往往会报错(提示类型不同)

如何解决这个报错呢?

1、提供方法

public DataTable GetDgvToTable(DataGridView dgv)       //实现类型转换
        {
            DataTable dt = new DataTable();
            for (int count = 0; count < dgv.Columns.Count; count++)    //在数据库表的列中添加控件表格的字段
            {
                DataColumn dc = new DataColumn(dgv.Columns[count].Name.ToString());
                dt.Columns.Add(dc);
            }
            for (int count = 0; count < dgv.Rows.Count; count++)      //先行  再列  一行一行将控件表格内容添加到数据库表中
            {
                DataRow dr = dt.NewRow();
                for (int countsub = 0; countsub < dgv.Columns.Count; countsub++)
                {
                    dr[countsub] = Convert.ToString(dgv.Rows[count].Cells[countsub].Value);
                }
                dt.Rows.Add(dr);
            }
            return dt;
        }

2、控制代码书写方式

           var dt = (DataTable)dataGridView1.DataSource;    //声明一个表格变量dt

           dataGridView1.DataSource = dt                             //把这个变量赋值给控件

            重点是这个变量类型不要是DataTable类型,var 的提示信息其实也是DataTable类型,但是结果就是这样神奇,这样写就不会报错了。
            

三、dataadapter对象 

       它的作用是在连接DataSet/DataTable对象和数据库

四、command对象1、

        它是用来对数据库的内容进行增删改查。

        这里要接触SQL语句

        1、增

例:string sql = "insert into [book2]([ID],[Name],[Age]) values (" + Convert.ToDecimal(textBox1.Text.Trim()) + ",'" + textBox2.Text.Trim() + "'," + Convert.ToDecimal(textBox6.Text.Trim()) + ")";

关键词insert into [表名](字段1,字段2,字段3,……)values (数据1,数据2,数据3,……);

         2、删

例:string sql = "delete from [book2] where [ID]=" + Convert.ToDecimal(textBox1.Text.Trim()) + "";

关键字delete from [表明] where [字段n]="  "";

         3、改

例: string sql = "update [book2] set[Name] ='" + textBox2.Text.Trim() + "', [Age] =" + Convert.ToDecimal(textBox6.Text.Trim()) + "  where [ID]=" + Convert.ToDecimal(textBox1.Text.Trim()) + "";

修改之后怎么更新到数据库呢?

            dt = new DataTable();        //实例化一个表格

            OleDbCommand comm = new OleDbCommand(sql, conn);//创建OleDbCommand对象

            comm.ExecuteNonQuery();      //执行命令(insert,delete,update等)

             //返回结果是int类型,3个命令所影响的数据行数

             adp.Update(dt);         // 通过适配器把表的数据库表内容填充到内存dt

更新到数据库怎么更新dataGridView控件呢?

         
            dt.Clear();                   //清楚内存中存放的表数据
           
            adp.Fill(dt);                 //再次读取已经改变过的表数据
           

关键字   update [表名] set[字段x] ='" 字符串型 "', [字段y] ="非字符串型 "  where [字段n]="

这应该就是SQL语句了,用的符号特别多,查了很多文章都没有人具体说过。这里我就具体说下

book2是表名,中括号不是必须的,但是有更标准,可以减少出错。我在学习时一直提示语法错误,直到使用了中括号才没有再出现

字段也可以使用中括号

数据使用的是双引号和双引号+单引号,这要看数据的类型,暂时发现字符型数据使用双引号+单引号,其他使用双引号即可。

五、dataset对象

         它是一个数据库容器,还可以看做是datatable的集合

六、datatable对象

         它是内存数据中的一个表

七、对象之间的关系

   conn = new OleDbConnection(str);     //建立连接对象

   adp = new OleDbDataAdapter("Select * from book2", conn) ;//导入具体的数据库表 

   dt = new DataTable();                  // 在内存中创建一个DataTable

    adp.Fill(dt);                   // 通过适配器把表的数据库表内容填充到内存dt

 

 

 

       八、深入

     1、  实际使用时我们使用SQL语句来修改数据库内容显然是不靠谱的,因为我们看到的是dataGridView控件中的数据表格 。我们当然希望能在dataGridView控件中修改数据并能更新到数据库中。这样该怎么做呢?

       

 try
            {
                if (adp== null) return;               //无语句可以不用{}

                var dt = (DataTable)dataGridView1.DataSource;       //var有大用*******
                OleDbCommandBuilder cmdb = new OleDbCommandBuilder(adp);

                //可以关联dt与数据库的对象并使之与adp 对象关联
                //控件中的表格赋值给了dt,意思就是dt 获取了控件中的表格的改变

                //cmdb对象就好像在说内存表格数据是什么样,我的数据库表数据也要什么样

                 //参数adp的修改就是我们对dataGridView1控件中数据的修改

                adp.Update(dt);   //把dt里面数据更新到数据库中   //报错时看是不是没有设置主键

                //Update作用是把dt里面数据更新到数据库中,Fill作用是把数据库中的数据填充到dt中
                MessageBox.Show("修改成功");
            }
            catch
            {
                MessageBox.Show("修改失败");
                return;
            }

2、数据修改是改完所有要修改的数据才修改,还是改完一个单元格就修改呢?

这当然是改完一个生效一个好,如果修改地方特别多,一次修改就会造成电脑运行压力

      这里我们就可以使用控件中的单元编辑完成事件,怎么做呢?

 private void dataGridView1_CellEndEdit_1(object sender, DataGridViewCellEventArgs e)
        {

            //如果做了大量修改,一次性修改耗时更多
            //要设置主键
            if (checkBox1.Checked == true)                 //可以注释掉该句
            {
                try
                {
                    if (adapter == null) return;

                    var dt = (DataTable)dataGridView1.DataSource;       
                    OleDbCommandBuilder cmdb = new OleDbCommandBuilder(adapter);
                    adapter.Update(dt);  //有时候会报错,不一定是代码的原因,可能是数据库表的原因哦 !               
                }
                catch
                {
                    MessageBox.Show("更新失败");
                    return;
                }

            }
        }

3、下面介绍一种删除当前行的方法:一般要删除某行就需要获取它的行号,而对于那些有编号的表格又怎么办呢?

  private void dataGridView1_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)   //选中时选中所在行
        {

            this.dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
            //选中模式全行选中
            row1 = e.RowIndex + 1;            //e表示所选单元格 RowIndex是它的一个属性,这个属性可以告诉我们所选单元格在那一行

             变量row1是我们要使用到的一个参数

 

 private void button1_Click(object sender, EventArgs e)       //依据ID删除,但是参数是行号
        {
            conn.Open();
            string sql = "delete from [book2] where [ID]=" + Convert.ToDecimal(row1) + "";
            //删除指定行
            OleDbCommand comm = new OleDbCommand(sql, conn);
            comm.ExecuteNonQuery();
            adapter.Update(dt);
            //清楚内存中存放的表数据
            dt.Clear();
            //再次读取已经改变过的表数据
            adapter.Fill(dt);
            conn.Close();
        }

 如果还用上面的代码显不能删除掉所选行,因为行数是8 对应的ID是12,这时代码该怎么写呢?

       private void button1_Click(object sender, EventArgs e)       //依据ID删除

  private void button18_Click(object sender, EventArgs e)
        {
            conn.Open();
            //string sql = "delete from [book2] where [ID]=" + Convert.ToDecimal(row1) + 
              "";
         
            //OleDbCommand comm = new OleDbCommand(sql, conn)
            //comm.ExecuteNonQuery();
            dataGridView1.Rows.Remove(dataGridView1.CurrentRow);  //参数不是行号
            DataTable dt1 = (DataTable)dataGridView1.DataSource;
            OleDbCommandBuilder cmdb = new OleDbCommandBuilder(adapter);//关联dt1与数据库
            adapter.Update(dt1);       //把dt1更新到数据库
            //清楚内存中存放的表数据
            dt1.Clear();
            //再次读取已经改变过的表数据
            adapter.Fill(dt1);
            conn.Close();
        }

 

 

  • 7
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值