您的位置:首页 > 编程语言 > C#

C#成魔之路<5>ADO.NET数据访问技术(1)

2016-03-06 10:28 405 查看
1、ADO.NET简介

ADO.NET是一组面向.NET程序员公开数据范围跟服务的类。他为创建分布式数据共享应用程序提供了丰富的组件。提供了一系列方法,用于支持对MicroSoft SQL Server和XML等数据源进行访问,还提供了通过OLE DB和XML公开的数据源一致访问的方法。客户端应用程序可以使用ADO.NET来连接到数据源,并且查询添加、删除、更新所包含的数据。可以形象的把ADO.NET比喻为数据库应用程序和数据源之间的桥梁。提供了一个面向对象的数据访问架构。

ADO.NET支持两种访问数据的模式:无连接模式和连接模式。

无连接模式将数据下载到客户机器上,并在客户机上将数据封装到内存中,然后可以像访问本地关系数据库一样访问内存中的数据。(DataSet)

连接模式依赖于逐记录访问,这种访问要求打开并且保持和数据源的连接。

关于数据库的架构模型:如下:

数据源<->数据连接(Connection)<->Command<->数据适配器(DataReader,DataAdapter)<->数据集(DataSet->DataTable)

2、连接数据库:Connection对象

通过应用程序来操作数据库的数据,首要的是建立应用程序和数据库之间的连接通道。Connection对象就实现了这样一种功能。

(1)Connection对象概述

Connection对象是一个连接对象,主要功能是建立应用程序和物理数据库之间的连接通道,主要包括四种类型访问数据库的对象,分别对应着四种数据提供程序,在每种数据提供程序中都包含着一种数据库连接类型:

SQL Server数据提供程序。位于System.Data.SqlClient命名空间,类型为SqlConnection。

ODBC数据提供程序,位于System.Data.Odbc命名空间,类型为OdbcConnection。

OLEDB数据提供程序,位于System.Data.OleDb命名空间,类型为OleDbConnection。

Oracle数据提供程序,位于System.Data.OracleClient命名空间,类型为OracleConnection。

注意:连接数据库的时候,要根据使用数据库的不同,引入不同的命名空间,然后使用命名空间中指定的连接类来创建数据库连接对象。

(2)连接数据库

以SQL Server为例。如果要连接SQL Server数据库,必须使用System.Data.SqlClient命名空间下的sqlConnection类,首先要通过using命令引用命名空间。连接数据库之后调用sqlConnection对象的Open方法打开数据库。如果进一步判断数据库的连接状态,可以读取sqlConnection对象的State属性来实现。语法:

public override ConnctionState State{get;}


该属性值是ConnectionState类型的枚举值之一。其枚举值:

Broken:和数据源的连接中断。只有在连接打开后才可以发生这种情况。可以关闭处于这种状态的连接,然后重新打开。

Closed:连接处于关闭状态。

Connecting:连接对象正在和数据源连接。

Executing:连接对象正在执行命令。

Fetching:连接对象正在检索数据。

Open:连接处于打开状态。

示例程序:

sql server数据库连接字符串是sql server数据库中最重要的字符串之一,下面就将为您介绍sql server数据库连接字符串中常用的声明,供您参考。

sql server数据库连接字符串中常用的声明有:

服务器声明 Data Source、Server和Addr等。

数据库声明 Initial Catalog和DataBase等。

集成Windows账号的安全性声明 Integrated Security和Trusted_Connection等。

使用数据库账号的安全性声明 User ID和Password等。

对于访问数据库的账号来说,通常我们在一些参考资料上看到ADO.NET的字符串连接往往有如下写法:

string ConnStr = “server = localhost;

user id = sa; password = xxx; database = northwind”;

对于集成Windows安全性的账号来说,其sql server数据库连接字符串写法一般如下:

string ConnStr = “server = localhost;

integrated security = sspi; database = northwind”;

或string ConnStr = “server = localhost;

trusted_connection = yes; database = northwind”;

使用Windows集成的安全性验证在访问数据库时具有很多优势:安全性更高、访问速度更快、减少重新设计安全架构的工作、可以硬编码连接字符串等,还是很值得使用的。

namespace SQLtest1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
if (textBox1.Text == "")
{
MessageBox.Show("please input the name of the database");
return;
}
try {
//声明一个字符串用于存储连接数据库字符串
string strCon = "server=;database=" + textBox1.Text.Trim() +
";uid=sa; pwd=";
//创建一个SqlConnectiond对象。
SqlConnection sqlConn=new SqlConnection(strCon);
sqlConn.Open();
if(sqlConn.State==ConnectionState.Open)
{
label1.Text="已经打开数据库:"+textBox1.Text.Trim();
}
}
catch
{
MessageBox.Show("打开数据库失败!!");
}
}
}
}


(3)关闭连接

党对数据库操作完毕之后,要关闭和数据库的连接,释放占用的资源。通过调用sqlConnection对象的Close方法或者Dispose方法关闭和数据库的连接。这两种方法的主要区别是:Close方法用于关闭一个连接,而Dispose方法不仅关闭一个连接,而且还清理连接所占用的资源。

namespace SQL_Test2
{
public partial class Form1 : Form
{
SqlConnection conn;

public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
if (textBox1.Text == "")
{
MessageBox.Show("please input the name of the database");
return;
}
try
{
//声明一个字符串用于存储连接数据库字符串
string strCon = "server=;database=" + textBox1.Text.Trim() +
";uid=sa; pwd=";
//创建一个SqlConnectiond对象。
conn = new SqlConnection(strCon);
conn.Open();
if (conn.State == ConnectionState.Open)
{
label1.Text = "已经打开数据库:" + textBox1.Text.Trim();
}
}
catch (Exception ex)
{
MessageBox.Show("打开数据库失败!!");
textBox1.Text = " ";
}
}

private void button2_Click(object sender, EventArgs e)
{
try
{
string str = "";
conn.Close();
if (conn.State == ConnectionState.Closed)
{
str = "数据库已经成功关闭\n";
}
conn.Open();
if (conn.State == ConnectionState.Open)
{
str += "数据库已经成功打开\n";

d8ee
}
richTextBox1.Text = str;
}
catch(Exception ex)
{
richTextBox1.Text = ex.Message;
}
}

private void button3_Click(object sender, EventArgs e)
{
try
{
conn.Dispose();
conn.Open();
}
catch(Exception ex)
{
richTextBox1.Text = ex.Message;
}
}
}
}


3、执行SQL语句:Command对象

当应用程序建立和数据源的连接之后,可以使用Command对象来执行命令并且从数据源中返回结果。

(1)Command对象概述

Command对象是一个数据命令对象,主要功能是向数据库发送查询、更新、删除、修改操作的SQL语句。Command对象主要有以下几个方式:

SqlCommand:用于向SQL Server数据库发送SQL语句,位于System.Data.SqlClient命名空间。

SqlDbCommand:用于向使用OLEDB公开的数据库发送SQL语句,位于System.Data.OleDb命名空间。

OdbcCommand:用于向ODBC公开的数据库发送SQL语句,位于System.Data.Odbc命名空间。有些数据库没有提供相应的连接程序,则可以配置好的ODBC连接之后,使用OdbcCommand。

OracleCommand:用于向Oracle数据库发送SQL语句。位于System.Data.OracleClient

注意:在使用OracleCommand向Oracle数据库发送SQL语句的时候,要引入System.Data.OracleClient命名空间,但是默认情况下没有这个命名控件,需要将程序集System.Data.OracleClient.dll引入到项目中。

(2)设置数据源类型

Command对象有三个重要的属性,分别是Connection属性、CommandText属性和CommandType属性。Connection属性用于设置SqlCommand使用的SqlConnnection。CommandText属性用于设置要对数据源执行的SQL语句或存储过程。CommandType属性用于设置指定的CommandText的类型。CommandType属性的值是CommandType枚举值。CommandType有三个枚举值:

StoredProcedure:存储过程的名称。

TableDirect:表的名称。

Text:SQL文本命令。

如果要设置数据源的类型。可以通过设置CommandType属性来实现,下面通过实例进行演示:

示例程序:关于Command属性的相关运用。

经典SQL语句大全

namespace SQLCommandTest
{

public partial class Form1 : Form
{
SqlConnection sqlConn = null;//声明一个变量
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
sqlConn = new SqlConnection("server= ;database=;uid=;pwd=");
sqlConn.Open();
}

private void button1_Click(object sender, EventArgs e)
{
try
{
//判断打开连接或者文本框不为空
if (sqlConn.State == ConnectionState.Open || textBox1.Text != "")
{
SqlCommand sqlCmd = new SqlCommand();
//创建一个sqlCommand对象
sqlCmd.Connection = sqlConn;
//设置Connection属性
sqlCmd.CommandText = "select count(*) from" + textBox1.Text.Trim();
//设置CommandText属性,设置SQL语句
sqlCmd.CommandType = CommandType.Text;
//设置CommandType属性为Text,使其只执行SQL语句文本模式
int i = Convert.ToInt32(sqlCmd.ExecuteScalar());
// ExecuteScalar方法获取指定数据表中的数据数量
label2.Text = "数据表中有:" + i.ToString() + "条数据";
}

}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
}


(3)执行SQL语句

Command对象需要取得将要执行的SQL语句,通过调用该类提供的多种方法,向数据库提交SQL语句。下面介绍SqlCommand几种执行SQL语句的方法。

ExecuteNonQuery方法

执行SQL语句,并且返回收到影响的行数。语法:

public override intExecuteNonQuery();
//该方法返回受影响的行数


示例程序:

namespace SQLCommandTest1
{
public partial class Form1 : Form
{
SqlConnection sqlConn = null;

public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
sqlConn = new SqlConnection("server= ;database= ;uid= ;pwd= ");
sqlConn.Open();

SqlCommand sqlCmd = new SqlCommand();
//创建一个command对象
sqlCmd.Connection = sqlConn;
//设置Connection属性,指定使用conn作为数据库。
sqlCmd.CommandText = "update tb_command set 奖金=800 where 性别='女'";
//设置其属性为text,并且设置其执行的SQL语句。
sqlCmd.CommandType = CommandType.Text;
//使用相关ExecuteNonQuery方法执行SQL语句。
int i = Convert.ToInt32(sqlCmd.ExecuteNonQuery());
label1.Text = "一共有:" + i.ToString() + "个员工收到奖金";
}
}
}


ExecuteReader方法

执行SQL语句,并且生成一个包含数据的SqlDataReader对象的实例。语法:

public SqlDataReader ExecuteReader()
//返回一个SqlDataReader对象


示例程序:

根据select*from tb_command 语句进行查询,调用ExecuteReader方法返回一个包含tb _command 表中所有数据的SqlDataReader对象。

namespace SQLCommandTest2
{
public partial class Form1 : Form
{
SqlConnection sqlConn = null;

public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
sqlConn = new SqlConnection("server= ;database= ;uid= ;pws= ");
sqlConn.Open();
SqlCommand sqlCmd = new SqlCommand();
sqlCmd.Connection = sqlConn;
sqlCmd.CommandText = "select*from tb_command";
sqlCmd.CommandType = CommandType.Text;
SqlDataReader sdr = sqlCmd.ExecuteReader();
while (sdr.Read())//调用while语句读取
{
listView1.Items.Add(sdr[1].ToString());
}
sqlConn.Dispose();//释放连接。
button1.Enabled = false;
//禁用按钮。
}
}
}


ExecuteScalar方法

执行SQL语句,返回结果集当中的第一行的第一列。

语法:

public override Object ExecuteScalar()
//返回值为结果集中的第一行的第一列或者空引用。(如果结果集为空)


该方法通常和聚合函数一起使用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  sql server C# ADO-NET