ADO.Net_1_连接数据库进行简单的数据操作20110320
时间:2011-03-21 来源:狄拉克之海
好久没有写些东西了,最近一直在学习.Net,弄到ADO这部分了,写点总结做个备案
连接数据库进行对数据的操作,主要分为五个步骤:
第一、建立连接通道,并连接数据库
第二、打开数据库
第三、创建数据处理命令
第四、执行查询命令,并返回信息
第五、关闭数据库
使用环境Visual Studio 2008 + SQL Server 2005 Express
首先先创建一个表吧!
打开SQLServer新建查询,执行如下代码(不区分大小写):
create database D_database
go
use D_database
go
create table T_table
(
Fid int not null,
Fname nvarchar(20),
Fage int,
Fisdel bit default 'false',
Fcreatetime datetime default getdate(),
primary key(Fid)
)
go
insert into T_table(Fid,Fname,Fage) values(1,'jim',19)
go
insert into T_table(Fid,Fname,Fage) values(2,'Tom',21)
go
insert into T_table(Fid,Fname,Fage) values(3,'jarry',29)
go
insert into T_table(Fid,Fname,Fage) values(4,'jack',22)
go
insert into T_table(Fid,Fname,Fage) values(5,'Kent',26)
go
insert into T_table(Fid,Fname,Fage) values(6,'Lucy',26)
go
insert into T_table(Fid,Fname,Fage) values(7,'Lily',23)
go
select Fid,Fname,Fage,Fisdel,Fcreatetime from T_table
=======================================================
数据库建好了,下面开始连接数据库咯!
使用ADO.Net之前呢先引入两个命名空间
using System.Data.SqlClient;
using System.Data;
一、建立连接通道,并连接数据库
1、建立连接通道就需要连接字符串,就像是一个门牌号码一样,要找到数据库与表的位置,一般这么写:
string sqlConStr = @"server=.\sqlexpress;database=D_database;integrated security=true";
下面来简单的解释一下,这里server表示服务,即ODBC,database就是描述那个数据库啦,而后面的integrated security表示集成安全,表示本地连接安全,同样这部分可以换成用户名和密码,那么就有了
string sqlConStr = @"server=.\sqlexpress;database=D_database;usid=<nserName>;pwd=<passWords>";
2、有了连接字符串,接下来就要建立连接通道了!这里使用SqlConnection对象
SqlConnection这个类有两个构造函数,一个是带一个参数的,一个是不带参数的。带参数的构造函数的参数即为连接字符串,表示连接到连接字符串描述的数据库,所以可以这么写:
SqlConnection conn = new SqlConnection(sqlConStr);
那么无参数的构造函数同样可以开通这个通道,所要做的就是new一个SqlConnection对象出来,然后使用该对象的ConnectionString属性来赋值,得到连接字符串,那么可写成
SqlConnection conn = new SqlConnection();
conn.ConnectionString = sqlConStr;
好啦,第一步就算完成
二、打开数据库
这个比较简单,直接调用SqlConnection实例的Open()方法,即写成
conn.Open();
三、创建数据处理命令
1、要处理数据库就要有SQL语句,为了方便与重用一般可以选择一个变量专门用来存放SQL语句(当然,想玩儿就可以来点乱的,就不写单独的),
string sqlStrIn = "insert into T_table(Fid,Fname,Fage) values(8,'蒋坤',24)"; --添加一个新数据
string sqlStrUp = "update T_table set Fisdel = 'true' where Fid = 1"; --修改一个数据,软删除
string sqlStrDel = "delete T_table where fid = 2"; --完全删除一个数据
string sqlSelectSingle = "select count(*) from T_table"; --查找所有数据的条数
string sqlSelectLists = "Select Fid,Fname,Fage,Fisdel,Fcreatetime from T_table"; --查找整个表
2、有了SQL语句以后那么再建立一个执行SQL语句的空间就行了,使用SqlCommand类就行,那么要操作数据库就要将数据库和SQL语句连起来,前面已经打开了数据库通道,下面就将SQL语句和这个通道连起来就行了,用的就是SqlCommand这个类的对象。这里连接方式又有四种。因为SqlCommand的构造函数有四种重载,常用的就是三个,这里就记三个吧
(1)不带参数的构造函数SqlCommand(),那么就先new一个对象出来,然后利用实例的Connection属性赋值得到连接通道,在使用实例的CommandText属性赋值得到SQL语句,那么可以写成:
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = sqlStrIn;
(2)带一个参数的构造函数,带一个参数就是SQL语句,那么就使用Connection属性赋值得到连接通道,那么可以写成:
SqlCommand cmd = new SqlCommand(sqlStrIn);
cmd.Connection = conn;
(3)带两个参数,毫无疑问就是SQL语句和连接通道啦,这个比较常用即:
SqlCommand cmd = new SqlCommand(sqlStrIn,conn);
(4)实际上也可以不用new一个SqlCommand出来,可以引用conn的CreateCommand属性,直接得到连接通道,然后再使用实例的CommandText属性赋值得到SQL语句,那么可以写成:
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = sqlStrIn;
好啦,总算是把连接准备好了,想在就等执行啦!
四、执行查询命令,返回信息
在配置好前面的一切之后,使用cmd的执行方法就能执行了,这里要说的方法有三个(常用的):
(1)cmd.ExecuteNonQuery()方法,毫不疑问就是不查询的方法嘛!那么对于增、删、改的SQL命令都可以使用这个执行命令进行执行,它得到的返回值为所影响的行数
(2)cmd.ExecuteScalar()方法,这个方法执行select语句,但是返回的是结果集中第一行、第一列的数据,其返回值为object类型,其它数据无论有没有,都不管,一般常用来执行聚合函数的命令
(3)cmd.ExecuteReader()方法,这个方法就相当强大啦,它读取所有的数据。
cmd.ExecuteReader()方法的返回值为SqlDataReader类型,有几个常用的属性和方法
(3.1)HasRows属性,这是一个布尔类型,表示当前执行查询后结果集中是否有数据,如果有就为True,如果没有那么为False
(3.2)Read()方法,也是个布尔类型,其方法的执行是读取下一行数据,返回下一行数据的状态,如果有数据就为Ture,没数据即为False
那么如何访问读取器中的数据呢?可以使用索引或是下标两种方法,例如检查第1列的数据,可写为
SqlDataReader readers = cmd.ExecuteReader();
if(reader.HasRows)
{
while(reader.Read())
{
Console.WriteLine(reader[1].ToString());
}
}
else
{
Console.WriteLine("没有检索导数据");
}
但是不是所有人都知道下标,所以可以配合select来执行,其中索引器中可以是结果集中的列明,例如检索数据中列明为Fname的数据,可以写为:
SqlDataReader readers = cmd.ExecuteReader();
if(reader.HasRows)
{
while(reader.Read())
{
Console.WriteLine(reader["Fname"].ToString());
}
}
else
{
Console.WriteLine("没有检索导数据");
}
由于结果集,也可以使用列的别名,例如SQL语句中...Fname as 姓名...,那么可以写为:
SqlDataReader readers = cmd.ExecuteReader();
if(reader.HasRows)
{
while(reader.Read())
{
Console.WriteLine(reader["姓名"].ToString());
}
}
else
{
Console.WriteLine("没有检索导数据");
}
好啦,今天到此吧,下面附上源代码。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;
namespace ADO_NetConsole
{
class Program
{
static void Main(string[] args)
{
//Program.TestConnection();
//AddRecord();
//DelRecord();
//SoftDelRecord();
//QuerySingle();
QueryLists();
Console.ReadKey();
}
#region 1、连接数据库TestConnection()
public static void TestConnection()
{
//1、连接字符串
string str = @"Server = .\SQLEXPRESS; database = D_testdatabase; Integrated Security = True";
//2、连接数据库
SqlConnection conn = new SqlConnection(str);
//3、打开连接通道
conn.Open();
//4、关闭连接通道
conn.Close();
Console.WriteLine("连接成功~~~~~~~:)");
}
#endregion
#region 2、往数据库中添加数据AddRecord()
public static void AddRecord()
{
int res = -1;//新增受影响的行数
//1、连接字符串
string sqlCon = @"Server = .\SQLEXPRESS;database = D_testdatabase;Integrated Security = true";
//2、新建连接通道
SqlConnection conn = new SqlConnection();//此方法有两个重载
//3、手动指定连接数据库
conn.ConnectionString = sqlCon;
//4、准备新增SQl命令
string sqlStr = "insert into T_testtable(Fid,Fname,Fage) values(4,'jim4',16)";
//5、新建命令对象,并告诉它做什么,走哪条路
SqlCommand cmd = new SqlCommand(sqlStr, conn);//此方法有4个重载
//6、打开连接通道
conn.Open();
//7、调用方法去数据库执行SQL语句
res = cmd.ExecuteNonQuery();//此方法负责增删改,返回受影响行数
//8、关闭连接通道
conn.Close();
if (res > 0)
{
Console.WriteLine("数据插入成功,受影响行数为{0}", res);
}
else
{
Console.WriteLine("数据新增失败");
}
}
#endregion
#region 3、根据条件删除数据记录DelRecord()
public static void DelRecord()
{
//1、连接字符串
string sqlConStr = @"Server = .\SQLEXPRESS;database = D_testdatabase; Integrated Security=true";
//2、创建连接通道
SqlConnection conn = new SqlConnection();
//3、连接数据库
conn.ConnectionString = sqlConStr;
//4、删除语句
string sqlStr = "delete T_testtable where Fid = 1";
//5、打开数据库
conn.Open();
//6、创建命令
SqlCommand cmd = conn.CreateCommand();
//7、运行并返受影响行数
cmd.CommandText = sqlStr;
int res = cmd.ExecuteNonQuery();
//8、关闭数据库,打印结果
conn.Close();
if (res > 0)
{
Console.WriteLine("删除成功,受影响行数为{0}", res);
}
else
{
Console.WriteLine("删除失败");
}
}
#endregion
#region 4、软删除SoftDelRecord()
public static void SoftDelRecord()
{
//1、连接字符串
string sqlConStr = @"Server = .\SQLEXPRESS;database = D_testdatabase;Integrated Security=True";
//2、连接数据库,并打开数据库
//连接数据库有两种方法:
//第一,直接new一个SqlConnection对象,将连接字符串作为构造函数传入
//第二种方式创建一个SqlConnection对象,然后使用实例的ConnectionString属性赋值进行连接
SqlConnection conn = new SqlConnection(sqlConStr);
conn.Open();
//3、创建sql语句
string sqlStr = "update T_testtable set Fisdel = 'true' where Fid = 1";//需要注意的是bit类型在使用true或false时需要用单引号括起来,也可以当做int型赋值
//4、创建命令,并关联到数据库
//命令关联到数据库的方式有三种:
//1、new一个SqlCommand对象后,调用SqlCommand构造函数,并将SQL语句和数据库通道作为两个参数传入
//2、只将Sql语句作为参数,调用一个参数的构造函数,并利用实例的Connection属性赋值得到连接通道
//3、直接调用无参数构造函数SqlCommand,其后为实例的CommandText属性和Connection属性赋值,确定Sql语句与连接通道
SqlCommand cmd = new SqlCommand();//SqlCommand构造函数有四个重载
cmd.CommandText = sqlStr;
cmd.Connection = conn;
//5、执行命令,并返回所受影响行数
int res = cmd.ExecuteNonQuery();
//6、关闭数据库
conn.Close();
if (res > 0)
{
Console.WriteLine("软删除成功,所受影响行数为{0}", res);
}
else
{
Console.WriteLine("软删除失败");
}
}
#endregion
#region 5、查询单个值QuerySingle()
public static void QuerySingle()
{
SqlConnection conn = new SqlConnection(@"server=.\sqlexpress;database=d_testdatabase;integrated security=true");
conn.Open();
SqlCommand cmd = new SqlCommand("select Fname from t_testtable", conn);
//运行Sql语句有四种:
//1.不带查询类型的使用SqlCommand实例的ExecuteNonQuery方法,返回所受影响的行数
//2.查询单个值,只返回结果集中坐标为(1,1)的数据,返回类型为object,如果有其他行与列,忽略
//3.ExecuteReader()
object obj = cmd.ExecuteScalar();
Console.WriteLine(obj.ToString());
}
#endregion
#region 6、查询多行数据,使用DataReader读取器QueryList()
public static void QueryLists()
{
SqlConnection conn = new SqlConnection(@"server=.\sqlexpress;database=d_testdatabase;integrated security=true");
SqlCommand cmd = new SqlCommand("select Fid as ss ,Fname as nn from t_testtable", conn);
conn.Open();
//运行SQL语句,创建一个SqlDataReader的对象来得到返回值
SqlDataReader readers = cmd.ExecuteReader();
//SqlDataReader实例的HasRows属性为只读属性,得到返回结果判断表中是否有数据,有为true,没有则为false
//SqlDataReader实例的Read()方法读取下一条数据,返回状态,有数据为true,没有数据返回false
//SqlDataReader实例从cmd的ExecuteReader()方法那里得到数据后,可以索引每行数据,可以用数字,或字符串(对于字符串,指定结果集的列名)
if (readers.HasRows)
{
//Console.WriteLine("得到数据{0}", readers.HasRows);
while (readers.Read())
{
Console.WriteLine(readers["nn"].ToString());
}
}
else
{
Console.WriteLine("没有得到数据");
}
readers.Close();
conn.Close();
}
#endregion
}
}