数据库访问
数据访问是开发Windows和Web应用程序的一个关键问题,由于数据访问在应用程序中使用得非常普遍,如果开发人员需要不断为数据库访问任务而编写程序就会相当的繁琐。正是基于此Microsoft公司提出了一种新的数据库访问技术--ADO.NET。
ADO.NET提供对Microsoft SQL Server ,Access等数据源,以及通过OLE DB和XML公开的一致访问。应用程序可以使用ADO.NET来连接这些数据源,并检索、操作和更新其中的数据。
ADO.NET由两大组件组成:DataSet(数据集)和.NET Framework数据提供程序。在.NET框架中,称处理数据的应用程序为.NET Framework数据提供程序或托管提供程序。其中,.NET Framework数据提供包括Connection、Command、DataReader和DataAdapter对象。这些对象都是连接对象(需要保持与数据源的连接才能够使用的对象),而DataSet为非连接对象。ADO.NET组成的结构图如图11.6所示。
图11.6 ADO.NET组成结构
DataSet对象是ADO.NET的断开式应用结构的核心组件,实现独立于任何数据源的数据访问,它就象一个蓄水池,用于缓存从数据库中检索出的数据,即使与原数据源的连接断开了,应用程序也可直接对其进行访问。Connection对象提供与数据源的连接,是操作数据库的基础,
示应用程序和数据源之间的惟一会话,它就如同一个水管一样,提供数据源与蓄水池或其它应用之间的数据流连接。Command对象能够访问用于返回数据、修改数据、运行存储过程以及发送或检索参数信息的数据库命令(Sql语句等),实现对数据源的操作,如查询、插入、修改和删除等。DataReader对象用于保存来自数据源且只读的数据流。DataAdapter对象是DataSet对象和数据源之间关系的桥梁,用于数据源填充DataSet并解析更新。设计ADO.NET组件的目的是为了从“数据操作”中分解出“数据访问”,把程序员从数据访问的繁琐事务中解放出来。
数据绑定技术
数据库应用程序开发过程中,面对大量的数据,采用数据库存储势在必行。如何将数据库应用与各类显示控件相结合是一门重要的技术。对于此类问题,最简单的办法是利用ADO.NET技术获取数据,然后通过大量的赋值运算将数据传送到控件中显示。同时,C#还提供了数据绑定技术,满足开发人员快速、方便的开发需求。数据绑定技术就是把已有的数据绑定到控件的某些属性上面的一种技术,即将以经打开数据源的某个或者某些字段绑定到文本框控件、列表控件、数据窗口等控件上的能够显示数据的属性上面。
数据绑定可以分为简单数据绑定和复杂数据绑定。简单数据绑定能够将控件的属性绑定到数据源中的单个值。这些值可以在运行时确定。复杂数据绑定能够将一组或一列绑定到指定的控件。这些控件被称为数据绑定控件,如ListBox、ComboBox、DataGridView等控件。
数据绑定技术的优点非常明显,即对控件完成数据绑定后,其显示内容将随着数据库内容的变化而变化,这样开发人员就无须担心数据的同步问题。因此,数据绑定技术是C#进行数据库方面编程的重要手段。
所有的数据绑定控件都派生于DataBoundControl类,该类提供了数据绑定控件的共同属性:
(1)、DataSource:控件的数据源,控件从其中检索数据项列表,通常一个DataSource中包含多个DataMember。
(2)、DataMember:当控件的数据源包含多个不同的数据成员(对应于数据库表),该属性指定控件的数据成员名称。
(3)、DataSourceID:一种被称为数据项的ID,数据绑定控件从该数据源的数据成员中检索其数据项列表。
ADO.NET概述
Connection对象
Command对象
DataReader对象
DataAdapter对象
DataSet对象
BindingSource组件
C#命名空间
System.Data
System.Data.SqlClient
System.Data.OleDb
System.Data.Odbc
System.Data.OracleClient
数据库连接方法(模式)
数据库连接的方法
方法一
1) 建立Connection对象,使用该对象的Open方法打开数据库连接
2) 建立Command对象,用于执行ExecuteReader方法
3) 建立DataReader对象(不支持对数据库的离线访问和处理操作),执行ExecuteReader方法,该方法返回DataReader对象。
4) 关闭数据库连接,使用Connection对象的Close方法。
方法二
1) 建立DataAdapter对象(自动生成连接对象)
2) 建立DataSet对象
3) 建立BindingSource对象
4) 建立数据绑定控件,例如 DataGrid DataGridView TextBox等数据绑定控件
5) 将BindingSource对象与DataSet对象绑定
6) 将数据绑定控件如DataGridView控件与BindingSource 对象绑定
7) 通过DataAdapter对象的Fill方法填充DataSet对象,实现对数据库的检索。
8) 通过DataAdapter对象的Update方法对DataSet对象进行的修改操作更新到数据库中
string constr= "workstation id=XAUT;packet size=4096;integrated security=SSPI;data source=XAUT;persist security info=False;initial catalog=xsgl";
SqlConnection cn1=new SqlConnection(constr);
string sq1="select * from j where (jno='"+textBox1.Text+"')";
SqlDataAdapter sqlDataAdapter1=new SqlDataAdapter(sq1,cn1);
DataSet dt1=new DataSet();
sqlDataAdapter1.Fill(dt1,"j");
dataGrid1.SetDataBinding(dt1,"j");
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
//using System.Data.OleDb;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections;
namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
BindingManagerBase b1;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
// TODO: 这行代码将数据加载到表“yqzDataSet.FDY”中。您可以根据需要移动或移除它。
// this.fDYTableAdapter.Fill(this.yqzDataSet.FDY);
// TODO: 这行代码将数据加载到表“yqzDataSet.BZR”中。您可以根据需要移动或移除它。
this.bZRTableAdapter.Fill(this.yqzDataSet.BZR);
b1 = this.BindingContext[yqzDataSet,"BZR"];
}
private void fillByToolStripButton_Click(object sender, EventArgs e)
{
try
{
this.bZRTableAdapter.FillBy(this.yqzDataSet.BZR);
}
catch (System.Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message);
}
}
private void button1_Click(object sender, EventArgs e)
{
bZRTableAdapter.Update(this.yqzDataSet.BZR);
}
private void button2_Click(object sender, EventArgs e)
{
b1.Position=dataGridView1.CurrentRow.Index;
// b1.Position = 8;
// this.yqzDataSet.Tables["BZR"].Rows[b1.Position].Delete(); 首先确定光标的当前位置,然后删除当前行内容。
this.yqzDataSet.Tables["BZR"].Rows.RemoveAt(b1.Position);
bZRTableAdapter.Update(this.yqzDataSet.BZR);
}
}
}
BindingManagerBase b1;
b1 = this.BindingContext[yqzDataSet,"BZR"];
b1.Position=dataGridView1.CurrentRow.Index; //设置b1当前行位置
// b1.Position = 8;
// this.yqzDataSet.Tables["BZR"].Rows[b1.Position].Delete(); 首先确定光标的当前位置,然后删除当前行内容。
this.yqzDataSet.Tables["BZR"].Rows.RemoveAt(b1.Position);
bZRTableAdapter.Update(this.yqzDataSet.BZR);
数据绑定
private void LoadData()
{
// The xml to bind to.
string xml = @"
"
+ @"WashingtonOlympia"
+ @"OregonSalem"
+ @"CaliforniaSacramento"
+ @"NevadaCarson City"
+ @"";
// Convert the xml string to bytes and load into a memory stream.
byte[] xmlBytes = Encoding.UTF8.GetBytes(xml);
MemoryStream stream = new MemoryStream(xmlBytes, false);
// Create a DataSet and load the xml into it.
DataSet set = new DataSet();
set.ReadXml(stream);
// Set the DataSource to the DataSet, and the DataMember
// to state.
bindingSource1.DataSource = set;
bindingSource1.DataMember = "state";
textBox1.DataBindings.Add("Text", bindingSource1, "name");
textBox2.DataBindings.Add("Text", bindingSource1, "capital");
}
DataBingingControl
BindingSource
DataSet
DataAdapter
Command
Connection
DataReader
Command
DataBase
数据库
.
NET Framework
数据提供程序
DataAdapter
SelectCommand
InsertCommand
UpdataCommand
DelectCommand
Connection
事务
Command
参数
DataReader
DataSet
DataTableCollection
DataRowCollection
DataColumnCollection
ConstraintCollection
数据表
XML
DataRelationCollection