以下文章整理的不对。还请见谅。
注:此文档应用于WIN应用程序的开发,不是Unity3D.并且此处使用的是SQL Server数据库。
一:
今天提及的是链接数据库的ADO.NET类。它是一组向.NET程序员公开数据访问服务的类。它有一系列的方法,用于支持对Microsoft SQL Server 和XML等数据源的访问。客户端可以使用ADO.NET来链接到数据源,并且查询,添加,删除和更新所包含的数据。
ADO.NE支持无连接和链接两种模型 :
1.无连接:即使将数据下载到客户机器上,并在客户机上将数据封装在内存里面,任何可以像访问本地关系数据库一样访问内存中的数据(eg:DataSet)。
2.链接模式依赖于逐记录的访问,这种访问要求打开并保持与数据源的链接,链接OVER,你的数据也就OVER.
二:
而ADO.NET对象模型直接的关系就像一个抽水系统:
(1):数据库好比水源,储存着大量的数据。
(2):Connection(连接件)对象好比深入水源的进水龙头,保持与水的接触,只有在链接到的前提下,才可以抽到水。
(3):Command(命令件)对象好比抽水机,为抽水提供动力和执行方法,先通过水龙头取得水,然后把水传给输水管。
(4):DataAdapter,DataReader(数据适配器,数据读取器)这两个对象就是输水管,担任着水的传输任务,并起着桥梁作用。而这两个是有区别的;DataAdapter对象通过抽水机,把水源输送到水池中进行保存。而DataReader对象不也不需要把水输送到水池里面,而是单向的把水直接送到需要水的用户里,所以要比在水池中转一下速度更快。
(5):DataSet(数据集)对象则是一个大水库,把抽上来的水按照一定关系的池子进行存放。即使,抽水装置撤离或者损坏(链接断开,离线状态),也可以保持“水”的存在。这也正是DAO.NET的核心。
(6):DataTable(数据表)对象则像水池中每个独立的池子,分放着不同种类的水。一个大水池由一个或者多个这样的池子组成。
三:
那么下来具体展示代码的操作了:
(前提需要: 1.已经构建了数据库(eg:SQL Server)相应的数据源(二处描述的水),如图: 2.在Microsoft Visual Studio 中建立了客户端,如图:
。此处就不讲解这两个项目的建立过程,网络上有很多资源。
)
(当然不同数据库的所引用的命名空间不同,
1.SQL Server: 位于System.Data.SqlClient命名空间下。
2.ODBC: 位于System.Data.OleDb命名空间下。
3.OLEDB: 位于System.Data.Oabc命名空间下。
4.Oracle: 位于System.Data.OracleClient命名空间下。
)
1.建造进水龙头
首先我们先操作Connection(连接件)对象,先把进水龙头插进水源中才能获取到水,对吧?(首先创建WIN应用程序,在窗体中添加TextBox控件,Button控件和Lable空间,然后引入System.Data.SqlClient命名空间,使用 SqlConnection类链接数据库)
using System.Data.SqlClient; //必须要声明使用这个命名空间。
namespace FormApplicationStudent1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.AcceptButton = button1;
}
private void button1_Click(object sender, EventArgs e) //当点击按钮的时候
{
if(textBox1.Text == null) //判断数据库名称是否存在
{
MessageBox.Show("请输入正确的数据库名称");
}
else
{
try
{
string strCon = "server=RUWENKEJI\\SQLEXPRESS;database=" + textBox1.Text.Trim() + "; uid=sa;pwd=www090924";
//其中server为服务器名称,database为数据库名称,uid 为用户名,pwd为密码。
SqlConnection conn = new SqlConnection(strCon); //创建数据库SqlConnection对象,即我们的进水龙头
conn.Open(); //打开水龙头
if(conn.State == ConnectionState.Open) //判断链接状态,如果为打开
{
Label lab = new Label();
lab.Location = new Point(25,25);
this.Controls.Add(lab);
lab.Text = "数据库已经链接到 :" + textBox1.Text.Trim();
}
}
catch
{
MessageBox.Show("数据库连接失败","",MessageBoxButtons.OK,MessageBoxIcon.Error);
}
}
}
//其中server为服务器名称,database为数据库名称,uid 为用户名,pwd为密码。如图:
客户端执执行后下图: 此时,就打开了进水龙头。(对于关闭连接的话,通过调用SqlConnection对象的Close或者Dispose,这两个方法的主要区别: Close只是关闭了进水龙头的开关,可以通过Open再次打开。但是Dispose是直接连进水龙头都删除了,再次使用的话得从新实例个龙头,然后从新打开)。
2. 抽水机Command(命令件)
进水龙头已经准备好了,那么下来我们开始使用抽水机Command(命令件)对象来抽水,这是整个系统中最重要的一环。
Command对象是一个数据命令对象,他的作用用比喻来说,就是过滤水的。在程序中主要是让它给数据库发送查询,更新,删除,修改操作的SQL语句。
(当然不同数据库的方法不一样,
1.SqlCommand:此处我们用的是SQL Server,用于给SQL Server发送SQL指令的方法是在System.Data.SqlClient下的SqlCommand方法 。
2.OleDbCommand :用于向使用OLEDB公开的数据库发送SQL语句。位于System.Data.OleDb命名空间下。eg:
Access数据库和MySQL数据库都是OLEDB公开的数据库。
3.OdbcCommand :用于向使用ODBC公开的数据库发送SQL语句。位于System.Data.Oabc命名空间下。
4.OracleCommand :用于向使用Oracle数据库发送SQL语句。位于System.Data.OracleClient命名空间下。
)
Command对象有三个重要的属性,分别是Connection,CommandText,CommandType。这三个属性中,Connection用于设置SqlCommand(抽水机)对应的SqlConnection(进水龙头),就像是摆好了抽水机得要给定他特定的抽水管一样,不然他不知道抽哪的水。CommandText属性主要就是设置要对数据源执行的SQL语句或者储存过程,也就是要发送的SQL指令,通俗点就是去告诉数据库我要得什么样的水。CommandType属性用于设置CommandText的属性,它是一个枚举类型,有三个成员 : StoredProcedure(储存过程的名称);TableDirect(表的名称);Text(SQL文本命令)
具体操作 :首先创建WIN应用程序,在窗体中添加TextBox控件,Button控件和Lable空间,然后引入System.Data.SqlClient命名空间,使用 SqlConnection类链接数据库)
using System.Windows.Forms;
using System.Data.SqlClient;
namespace FormApplicationStudent1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.AcceptButton = button1;
}
SqlConnection conn;
private void Form1_Load(object sender, EventArgs e) //当加载窗口的时候
{
if (MessageBox.Show("是否查看窗体?", "", MessageBoxButtons.YesNo, MessageBoxIcon.Information) != DialogResult.Yes)
{
this.Close();
}
string strCon = "server=RUWENKEJI\\SQLEXPRESS;database=" + "likia"+ "; uid=sa;pwd=www090924";
conn = new SqlConnection(strCon); //创建数据库SqlConnection对象,即我们的进水龙头
conn.Open(); //打开水龙头
}
private void button1_Click(object sender, EventArgs e) //当点击按钮的时候
{
try
{
if (conn.State == ConnectionState.Open || textBox1.Text != null) //判断链接状态,如果为打开
{
SqlCommand comm = new SqlCommand(); //创建一个SqlCommand对象,即抽水机。
comm.Connection = conn; //指定他接受的进水龙头为当前comm
comm.CommandText = "SELECT Count(*) FROM " + textBox1.Text.Trim(); //指定SQL指令,用来“过滤”水。这里获取表的数据数量
comm.CommandType = CommandType.Text; //指定指令的类型,此处为text,即SQL文本命令
int i = Convert.ToInt32(comm.ExecuteScalar()); //获取数据表中的数据数量 ExecuteScalar(返回执行数量)
comm.CommandText = "SELECT * FROM " + textBox1.Text.Trim(); //指定SQL指令,用来“过滤”水。这里获取表的信息
comm.CommandType = CommandType.Text; //指定指令的类型,此处为text,即SQL文本命令
SqlDataReader sqlRead = comm.ExecuteReader();
//ExecuteReader返回一个包含数据的SqlDataReader类型的实例。其中储存着SQL语句过滤后的数据,此处为获取全部信息
Label lab = new Label();
lab.Location = new Point(50,50);
this.Controls.Add(lab);
lab.Size = new Size(new Point(200,200));
lab.Text = "数据表中共有:" + i.ToString() + " 条数据";
while (sqlRead.Read()) //当数据可以读取
{
lab.Text += sqlRead[1].ToString() + " "; //读取数据表中的第一列 即Name
lab.Text += sqlRead[2].ToString() + " "; //读取数据表中的第二列 即sex
}
button1.Enabled = false;
}
}
catch
{
MessageBox.Show("数据库连接失败","",MessageBoxButtons.OK,MessageBoxIcon.Error);
}
}
执行后如图所示:
其中要注意SqlCommand中几种执行SQL语句的方法 :
a. ExecuteNonQuery方法: 执行SQL语句并且返回受影响的行数,在向数据库发送增,减,改的时候用到。
b. ExecuteReader方法: 上述代码中我们有用到过的。ExecuteReader返回一个包含数据的SqlDataReader类型的实例。其中储存着数据表中的数据。
c. ExecuteScalar : 上述代码也用到。他获取数据表中的数据数量 。 ExecuteScalar(返回执行数量)
其中;ExecuteReader重点讨论下:它的返回值是SqlDataReader(DataReader类型对象)。而DataReader对象是数据读取对象,如果应用程序要每次从数据库中取出最新数据,或者只是要快速的读取,并不要去修改,则可以使用次此方法。如果判断锁查询的数据表中是否有数据。
可以使用SqlDataReader方法里面的HasRows(bool类型),来判断表中是否有数据。
读取数据的话就用SqlDataReader方法里面的Read方法读取,Read方法使SqlDataReader前进到下一条记录。
3.输水管(读取数据!)
2中介绍了SqlDataReader这一读取数据方法。此处介绍DataAdapter对象(数据适配器对象)。最开始部分我们介绍了它在系统中担任输水管的重任,是DataSet与数据源之间的桥梁。在DataSet与数据源之间它是不可或缺的媒介,它用于实现与数据源之间的互通。
1.DataAdapter提供了四个属性:
a.SelectCommand属性:向数据库发送查询SQL语句。
b.DeleteCommand属性:向数据库发送删除SQL语句。
c.InsertCommand属性: 向数据库发送插入SQL语句。
d.UpdateCommand属性:向数据库发送更新SQL语句。
2.以及一些主要方法:
a.Fill : 用数据填充DataSet。
b.Update : 更新数据库时,DataAdapter将调用DeleteCommand,InsertCommand,UpdateCommand,属 性。 可以及时的把修改过的数据更新到数据库中。再使用此方法之前,必须实例化一个CommandBuilder类,他能根据DataAdapter的 SelectCommand的SQL语句判断其他的DeleteCommand,InsertCommand,UpdateCommand。
3. 那么,我们现在开始抽水了,输水管也有了,现在我们用Fill把水填充到DataSet(大水库)。
string strCon = "server=RUWENKEJI\\SQLEXPRESS;database=" + "likia" + "; uid=sa;pwd=www090924";
conn = new SqlConnection(strCon); //创建数据库SqlConnection对象,即我们的进水龙头
conn.Open();
//打开水龙头
SqlCommand comm = new SqlCommand(); //创建一个SqlCommand对象,即抽水机。
comm.Connection = conn; //指定他接受的进水龙头为当前comm
comm.CommandText = "SELECT Count(*) FROM " + textBox1.Text.Trim(); //指定SQL指令,用来“过滤”水。这里获取表的数据数量
comm.CommandType = CommandType.Text; //指定指令的类型,此处为text,即SQL文本命令
SqlDataAdapter ad = new SqlDataAdapter(); //创建输水管对象(SqlDataAdapter)
ad.SelectCommand = comm; //指定输水管的SqlCommand对象(即抽水机),这样就得到了水
DataSet dset = new DataSet(); //创建一个水池对象(DataSet),用来存水
ad.Fill(dset); //输水管把谁填充到水池中
dataGridView1.DataSource = dset.Tables[0]; //把数据给dataGridView组件,让显示信息
4.水池(数据集(DataSet ))
DataSet对象像是存放在内容的小数据库。它可以包含数据表,数据列,数据行,视图,约束以及关系。通常它的来源为数据库或者XML。而为了从数据库中获取数据,必须要DataAdapter(3中提及)。然后使用DataAdapter的Fill填充数据集。
1.DataSet提供了一些方法:
a.Merge :可以将DataSet,DataTable,DataRow数组的内容一起并入现有的DataSet中。
b.Copy : 在不想修改破坏原始数据的情况下,可以创建DataSet的副本进行操作。返回一个新的DataSet。