利用C#2005实现数据表的基本操作

摘  要   通过运用C#2005中的DataGridView控件、BindingSource和DataAdapter类,实现数据表
的基本操作。
关键词   数据库,C#编程,插入,删除,修改,更新

 
一、前言
    熟悉数据库编程的读者知道,数据表的基本操作就是指对数据表进行记录的插入、删除和修改操作。在C#2003中,笔者通过使用DataGrid控件、CurrencyManager和DataAdapter类,实现了数据表的基本操作,但在C#2005中,将DataGrid更改为DataGridView控件后,发现CurrencyManager对象控制的内存数据表很难与DataGridView显示的数据一致起来。为此,本文在研究C#2005对数据表操作的原理基础上,采用DataGridView控件、BindingSource和DataAdapter类,实现了数据表的基本操作。
二、基本原理
    DataGridView控件提供了一种强大而灵活的以表格形式显示数据的方式,直接将数据显示给用户。BindingSource 类通过提供一个间接寻址层、当前项管理、更改通知和其他服务简化了窗体中控件到数据的绑定,这是通过将BindingSource 组件附加到数据源然后将窗体中的控件绑定到BindingSource 组件来实现的;与数据的所有进一步交互,包括定位、排序、筛选和更新,都通过调用BindingSource组件实现。DataAdapter 用作DataSet和数据源之间的桥接器以便检索和保存数据,直接将内存数据表中记录更新保存到物理数据库中。这三者之间的关系如图1。



图1 基本原理
三、设计与实现
    1.设计数据库
    为了简单起见,本文采用Access数据库,数据库名为db1.mdb,在数据库中建一个db数据表,字段名称和字段类型如图2所示。 



图2 数据表字段名和类型
    注:id字段为主键。
    2.设计界面
    在【解决方案管理器】中,打开默认生成的“Form1”窗体,在窗体放置如图3所示的控件。
 



图3 界面部署图
    Form1窗体的控件属性设置如下表所示。
表1  Form1窗体控件清单
   

控件类型

对象名

属性

取值(说明)

Form

Form1

Text

利用C#2005实现数据表的基本操作

 

 

StartPosition

CenterScreen

DataGridView

dataGridView1

SelectionMode

FullRowSelect(实现整行选取)

其他

 

 

如图3所示

    3.编码实现
    (1)添加使用命名空间
    using System.Data.OleDb;
    (2)声明私有变量
private DataTable temptable = new DataTable();
private BindingSource bindingSource1 = new BindingSource();
private OleDbDataAdapter dataAdapter = new 
OleDbDataAdapter();
    (3)编写数据绑定控件状态的设置方法
private void setBool(bool b)
{
this.comboBox1.Enabled = b;
this.textBox1.Enabled = b;
this.textBox2.Enabled = b;
this.textBox3.Enabled = b;
this.dateTimePicker1.Enabled = b;            
}
    (4)窗体初始化过程中执行的代码
String connectionString = "Provider = 
Microsoft.Jet.OLEDB.4.0;Data source= db1.mdb";
//用户可以更改数据库后缀名(如改为db1.dll),提高数
//据库的安全性
String selectCommand = "select id,姓名,学号,出生时间,性别,德才表现 from db";
dataAdapter = new OleDbDataAdapter(selectCommand, 
connectionString);
OleDbCommandBuilder commandBuilder = new 
OleDbCommandBuilder(dataAdapter); 
dataAdapter.Fill(temptable);
//数据绑定
bindingSource1.DataSource = temptable;
dataGridView1.DataSource = bindingSource1;
dataGridView1.Columns[0].HeaderText = "姓名";
dataGridView1.Columns[0].DataPropertyName = "姓名";
dataGridView1.Columns[0].Width = 80;
dataGridView1.Columns[1].HeaderText = "学号";
dataGridView1.Columns[1].DataPropertyName = "学号";
dataGridView1.Columns[1].Width = 80;
dataGridView1.Columns[2].Visible = false;
dataGridView1.Columns[3].Visible = false;
dataGridView1.Columns[4].Visible = false;
dataGridView1.Columns[5].Visible = false;
textBox1.DataBindings.Add("Text", bindingSource1, "姓名");
textBox2.DataBindings.Add("Text", bindingSource1, "学号");            
textBox3.DataBindings.Add("Text", bindingSource1, "德才表现");            
comboBox1.DataBindings.Add("Text", bindingSource1, 
"性别"); 
dateTimePicker1.DataBindings.Add("Text", bindingSource1, 
"出生时间");
setBool(false);
    (5)记录定位
//首记录
bindingSource1.Position = 0;
//上记录
if (bindingSource1.Position > 0)
  bindingSource1.Position--; 
//下记录
if (bindingSource1.Position < bindingSource1.Count - 1)
  bindingSource1.Position++;
//尾记录     
bindingSource1.Position = bindingSource1.Count - 1;
    (6)插入记录
//新增记录
bindingSource1.AddNew();
setBool(true);  
    (7)删除记录
//删除记录
if (MessageBox.Show("确认删除这条记录吗?", "询问", 
MessageBoxButtons.YesNo) == DialogResult.Yes)

try
{
if (bindingSource1.Count > 0)
{ bindingSource1.RemoveAt(bindingSource1.Position);}
else
{ MessageBox.Show("没有可删除的数据", "提示", 
MessageBoxButtons.OK, MessageBoxIcon.Error);}
}
catch (Exception ex)
{ MessageBox.Show(ex.Message, "错误提示", 
MessageBoxButtons.OK, MessageBoxIcon.Error);}
}
    (8)修改记录
//修改记录
setBool(true);
    (9)取消操作
//取消操作
try
{ bindingSource1.CancelEdit();}
catch (Exception ex)
{ MessageBox.Show(ex.Message, "错误提示!", 
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
    (10)保存更新
//更新数据
bindingSource1.EndEdit();
if (temptable.GetChanges() != null)
{
try
{ this.dataAdapter.Update(temptable);}
catch (Exception ex)
{ MessageBox.Show(ex.Message, "错误提示!", 
MessageBoxButtons.OK, MessageBoxIcon.Information);}
}
setBool(false);
MessageBox.Show("数据更新完毕!", "信息提示!", 
MessageBoxButtons.OK, MessageBoxIcon.Information);
    (11)关闭窗体
//关闭窗体
if (temptable.GetChanges() != null)
{
if (MessageBox.Show("数据有改动,是否保存更新!", "询问
", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
try
{ this.dataAdapter.Update(temptable);}
catch (Exception ex)
{ MessageBox.Show(ex.Message, "错误提示!", MessageBoxButtons.OK, MessageBoxIcon.Information);}
}
}
this.Close();
四、结语
    本文程序采用的是Visual Studio 2005 C# 编写的,所述代码均已在Windows XP Professional和Windows Server 2003 Enterprise Edition+SP1中运行通过。
    通过C#编程实现了对数据表的基本操作。用户在数据字段简单(如不含备注字段)的情况下,可以直接将所有的字段在DataGridView控件中显示出来,通过操作DataGridView实现数据表的基本操作。同时,用户可以通过改变SQL语句,在所选取的字段中包含关键字段的前提下实现对多个表(数据视图)的操作,也可以以此为模型,通过更改SQL语句来实现数据的查询操作。

参考文献
[1] 王晟编著.Visual C#.NET 数据库开发经典案例解析.清华大学出版社,2005
[2] Glenn JohnSon著.ADO.NET 2.0高级编程.清华大学出版社,2006
[3] Microsoft Visual Studio 2005 Documentation

posted @ 2010-03-24 14:15  与时俱进  阅读(1049)  评论(1编辑  收藏  举报
友情链接:同里老宅院民居客栈