经过连续几天的学习,初步了解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();
}
更多推荐
access数据库
发布评论