知识点:了解 ADO.NET 的功能和组成、会使用 Connection 对象连接到数据库、掌握基本的异常处理、会使用 Command 对象查询单个值。
ADO.NET是一组用于和数据源进行交互的面向对象类库,通过这些类,我们可以访问和操作数据库。ADO.NET是数据库访问的方法和技术,主要用于完成C#应用程序访问数据库。
应用程序、ADO.NET、数据库,三者之间的关系
ADO.NET由两部分组成:DataSet(数据集)和.NET Framework数据提供程序
ADO.NET主要通过以下对象操作数据库:
ADO.NET允许和不同类型的数据源以及数据库进行交互。我们在学习《SQL Server数据库基础》时知道目前有多种数据库产品,比如我们使用的SQL Server,再比如Oracle数据库……数据库不一样,他们所用的数据源也保存在不同的命名空间里。导入命名空间的方法:Alt+Enter或者Shilt+Alt+F10。
connection对象是应用程序和数据库的桥梁,起到数据连接的作用。
前面才学过不同的数据库产品,有不同的数据库源,保存在不同的命名空间,同样,他们也会使用不同的Connection类。我们本书用的是SQL Server数据库,存放在using System.Data.SqlClient;使用的是SqlConnection类。
不同命名空间的connection对象
命名空间 |
对应的 Connection 对象 |
System.Data.SqlClient |
SqlConnection |
System.Data.OleDb |
OleDbConnection |
System.Data.Odbc |
OdbcConnection |
System.Data.OracleClient |
OracleConnection |
属性 |
说明 |
ConnectionString |
连接字符串 |
方法 |
说明 |
Open |
打开数据库连接 |
Close |
关闭数据库连接 |
第一步:创建连接对象(用已知的类创建对象)(要引入命名空间)
SqlConnection con = new SqlConnection();(在SqlServer数据库里,connection对象是SqlConnection类里的)//创建对象
第二步:定义连接信息(给对象添加属性)
con.ConnectionString = "data source=服务器名; initial catalog=数据库名; integrated security=true"; //给对象添加属性
(注意:\符号,在C#中要使用\\表示)
第三步:连接数据库(调用对象的方法)
con.Open();//调用方法,打开数据库
MessageBox.Show("打开数据库连接成功");//这里是提示语
注意:连接数据库之前,保证已开开启数据库服务,并且要连接的数据库是存在的。
前期准备工作:
第一步:在VS软件中,新建一个窗体窗体项目。并在窗体上拖放一个button按钮,设置该button按钮的text属性为“测试”
第二步:启动SQL服务,在SSMS软件中,新创建一个数据库TestDB.
使用SQL语句,在数据库中新创建一个数据库表,并插入两行数据。
--使用数据库
use TestDB;
--创建表
create table stu(
id int primary key identity (1,1),
names nvarchar(20) not null,
pwd nvarchar(20) not null
);
--插入数据到表stu中
insert into stu(names,pwd) values('赵丽颖','zly1123');
insert into stu(names,pwd) values('杨幂','ym111');
第三步:在VS软件刚创建的项目中,双击窗体上的【测试】按钮,进入代码编写模式。
双击按钮,进入的是该按钮的点击事件,我们在点击事件(方法)里编写代码
(1)创建一个connection对象。
语法:方法名 对象名 = new 方法名();
注意:当我们按照正确语法写完第一句代码时,出现红色波浪线报警,鼠标移上去以后,提示
“未能找到类型或命名空间名“SqlConnection”(是否缺少using指令或程序集引用?)
显示可能的修补程序(Alt+Enter or Ctrl+,)”
操作方法:鼠标依次点击“显示可能的修补程序”——using System.Data.SqlClient;
(2)给新创建的对象con添加ConnectionString 属性。
语法1:对象名.ConnectionString = "data source=服务器名; initial catalog=数据库名; integrated security=true";
语法2:对象名.ConnectionString = "data source=服务器名; initial catalog=数据库名; user id=登录名; pwd=登录密码 ";
(3)连接数据库,使用对象con的方法Open()
语法:对象名.Open();
注意:使用完后要关闭数据库。减小数据库所在服务器的压力。
解决办法:把 data source改成server
语法:对象名.ConnectionString = "Server=服务器名; initial catalog=数据库名; integrated security=true";
程序在运行时,可能会因为各种突发状况出现异常。比如数据库服务器出错,网络断线等。异常的出现可能会导致程序突然退出,影响用户的使用。因此,程序员要在编码时对可能出现的异常进行处理,以保证程序的正常运行。
方法:尝试出错。
语法:
try
{
//可能出现异常的代码
}
catch (处理的异常类型)
{
//处理异常的代码
}
finally
{
//无论如何都会执行的代码
}
执行try语句里的代码,如果出现异常则执行catch语句代码,没有异常则catch语句代码不会被执行。异常的类型有很多,我们一般使用Exception,它代表所有的异常类型。此语法还可以添加finally语句,来执行一些无论有无异常,都要执行的代码,如关闭数据库等。
//按钮的点击事件,实现点击按钮时,连接数据库
private void button1_Click(object sender, EventArgs e)
{
//创建链接对象
SqlConnection con = new SqlConnection();
//给对象添加属性
con.ConnectionString = "data source=LAPTOP-IN3E6IJP\\SQLEXPRESS; initial catalog=TestDB; integrated security=false";
try //将可能出现异常的代码,放在try里
{
con.Open();//打开数据库连接
MessageBox.Show("打开数据库连接成功");
}
catch (Exception ex)//如果出现异常,则允许catch里的代码
{
MessageBox.Show(ex.Message);//以消息框形式,输出异常消息
}
finally //不管程序错误与否,都会执行的代码
{
con.Close();
MessageBox.Show("关闭数据库连接成功");
}
}
程序连接上数据库后,我们需要对数据库中的数据进行操作,Command(命令)对象可以对数据表中的数据进行增删改查操作。和Connection对象一样,不同的数据库产品有不同的命名空间,对应不同的Command对象。
不同命名空间的Command对象
命名空间 |
对应的 Command 对象 |
System.Data.SqlClient |
SqlCommand |
System.Data.OleDb |
OleDbCommand |
System.Data.Odbc |
OdbcCommand |
System.Data.OracleClient |
OracleCommand |
Command对象的主要属性和方法
属性 |
说明 |
Connection |
Command对象使用的数据库连接 |
CommandText |
执行的SQL语句 |
方法 |
说明 |
ExecuteNonQuery |
执行不返回行的语句,如UPDATE等 |
ExecuteReader |
返回DataReader对象 |
ExecuteScalar |
返回单个值,如执行COUNT(*) |
ExecuteScalar()方法的返回值的数据类型是Object类型。如果执行的SQL语句是一个查询语句(SELECT),则返回结果是查询后的第一行的第一列,如果执行的SQL语句不是一个查询语句,则会返回一个未实例化的对象,必须通过类型转换来显示。
举例:查询数据表Stu表中有多少行数据记录
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Part9
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//按钮的点击事件,实现点击按钮时,连接数据库
private void button1_Click(object sender, EventArgs e)
{
//1、创建链接对象
SqlConnection con = new SqlConnection();
//2、给对象添加属性
con.ConnectionString = "data source=LAPTOP-IN3E6IJP\\SQLEXPRESS; initial catalog=TestDB; integrated security=true";
try
{
//3、打开数据库连接
con.Open();
//4、创建查询用的SQL语句
string sql = "select count(*) from Stu";
//5、创建Command对象
SqlCommand cmd = new SqlCommand(sql, con);
//6、调用Command对象的方法,
int count = Convert.ToInt32(cmd.ExecuteScalar());
//7、显示结果
string message = string.Format("Stu表中共有{0}条学员信息!", count);
MessageBox.Show(message);
}
catch (Exception ex)//如果出现异常,则允许catch里的代码
{
MessageBox.Show(ex.Message);//以消息框形式,输出错误消息
}
finally //不管程序错误与否,都会执行的代码
{
con.Close();
MessageBox.Show("关闭数据库连接成功");
}
}
}
}
要求:模拟QQ登录窗体,用户输入账号、密码,和数据库中已存的信息进行匹配,正确则提示“成功”,错误则提示“错误”
分析:此功能首先需要连接数据库(Connection对象),其次要能够将用户输入的账号密码提取出来,并和数据库里的用户信息进行匹配查询(Command对象)。如何判断输入正确?只有用户名和密码一一匹配,才可以登录。
第一步:在VS中设计窗体界面:
第二步:双击【登陆】按钮,进入事件编写代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Part9
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
//提取用户输入的账号和密码,后面要用来和数据库里的用户名和密码相匹配
string name = textBox1.Text;
string pwd = textBox2.Text;
//1、创建SqlConnection链接对象
SqlConnection con = new SqlConnection();
//2、给链接对象添加属性
con.ConnectionString = "data source=LAPTOP-IN3E6IJP\\SQLEXPRESS; initial catalog=TestDB; integrated security=true";
try
{
//3、打开数据库
con.Open();
//4、创建sql语句字符串(注意查询语句where条件里对应的列名要书写正确)
string sql = string.Format("select count(*) from stu where names='{0}' and pwd='{1}'", name, pwd);
///5、创建Command对象
SqlCommand cmd = new SqlCommand(sql, con);
//6、执行查询,并将查询结果赋值给变量i
int i = Convert.ToInt32(cmd.ExecuteScalar());
//7、判断登录是否成功
if (i > 0)
{
MessageBox.Show("登录成功");
}
else
{
MessageBox.Show("登录失败");
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
con.Close();//关闭数据库连接
}
}
}
}
思考:如果用户没有输入账号或密码,直接点击【登陆】按钮,如何提示?(先提示用户用户或密码不能为空,如何实现?)
思考:如何实现用户的注册功能?窗体界面增加一个注册按钮,当用户注册成功后,使用新账户可以直接登录。
提示:ExecuteNonQuery方法的使用
private void button2_Click(object sender, EventArgs e)
{
//提取用户输入的账号和密码,后面要用来和数据库里的用户名和密码相匹配
string name = textBox1.Text;
string pwd = textBox2.Text;
//1、创建SqlConnection链接对象
SqlConnection con = new SqlConnection();
//2、给链接对象添加属性
con.ConnectionString = "data source=LAPTOP-IN3E6IJP\\SQLEXPRESS; initial catalog=TestDB; integrated security=true";
try
{
//3、打开数据库
con.Open();
//4、创建sql语句字符串(注意插入语句时,列的值如果是字符,要用单引号引起来)
string sql = string.Format("insert into stu(names,pwd) values('{0}','{1}')", name, pwd);
///5、创建Command对象
SqlCommand cmd = new SqlCommand(sql, con);
//6、执行command对象
cmd.ExecuteNonQuery();
MessageBox.Show("注册成功"); //提示消息框
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
con.Close();//关闭数据库连接
}
}
========================这里是结束分割线===========================