ADO,NET中简单三层SQLHelper封装介绍
一、这个东西好久没有用过了,感觉都快要忘记了,老了老了,自从用了EF,感觉这个sql封装真是low,但是这确实最底层的使用,一直都在接触CSDN,以前都没有写过文章,一方面是自己不想写,然而我却犯二的写了五六个笔记本的笔记,想想真是让人恶心至极,好了。开车:
二、全部源码
config配置
<connectionStrings>
<add name="mysqlkey" connectionString="Data Source=NDFI4HIE0FE6Z1R;Initial Catalog=USER;Integrated Security=True"/>
</connectionStrings>
public static class Sqlhelp
{
//定义一个连接字符串,readonly修饰的变量,只能在初始化的时候赋值,以及构造函数中赋值,其他地方只能读取不能设置值
private static readonly string constr = ConfigurationManager.ConnectionStrings["mysqlkey"].ConnectionString;
//1、执行增(insert)、删(delete)、改(update)的方法 ExecuteNonQuery()可变参数用params关键字
public static int ENonQuery(string sql,params SqlParameter[]pms)
{
using (SqlConnection con=new SqlConnection(constr))
{
using(SqlCommand cmd=new SqlCommand(sql,con))
{
if (pms.Length>0)
{
cmd.Parameters.AddRange(pms);
}
con.Open();
return (int)cmd.ExecuteNonQuery();
}
}
}
//2、执行查询,返回单个值的方法 ExecuteScalar()
public static object EScalar(string sql, params SqlParameter[] pms)
{
using (SqlConnection con = new SqlConnection(constr))
{
using (SqlCommand cmd = new SqlCommand(sql, con))
{
if (pms != null)
{
cmd.Parameters.AddRange(pms);
}
con.Open();
return cmd.ExecuteScalar();
}
}
}
//3、执行查询,返回多行多列的方法
public static SqlDataReader EReader(string sql, params SqlParameter[] pms)
{
SqlConnection con = new SqlConnection(constr);
using (SqlCommand cmd=new SqlCommand(sql,con))
{
if (pms!=null)
{
cmd.Parameters.AddRange(pms);
}
try
{
con.Open();
//System.Data.CommandBehavior.CloseConnection这个枚举参数,表示将来使用完毕SqlDataReader后,
//在关闭reader的同时,在SqlDataReader内部会将关联的对象也关闭掉
return cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
}
catch
{
con.Close();
con.Dispose();
throw;
}
}
}
}
1、注意这里的运用的静态类和静态方法,一个线程始终都是一个对象,因为静态类没办法实例化
2、ExecuteNonQuery方法:
通常使用它来执行Update、Insert和Delete语句,对于Update、Insert和Delete语句,返回值为该命令所影响的行数,对于所有其他类型的语句,返回值为-1。
3、ExecuteScalar方法:
ExecuteScalar()方法也用来执行SQL语句,但是ExecuteScalar()执行SQL语句后的返回值与ExecuteNonQuery()并不相同,ExecuteScalar()方法的返回值的数据类型是Object类型。如果执行的SQL语句是一个查询语句(SELECT),则返回结果是查询后的第一行的第一列,如果执行的SQL语句不是一个查询语句,则会返回一个未实例化的对象,必须通过类型转换来显示。
4、ExecuteReader方法:
- ExecuteReader()执行后返回的SqlDataReader对象
- 返回的结果多行多列,注意读取,注意在读取SqlDataReader一定要保证链接不能断开
5、SqlDataReader对象的使用
SqlDataReader reader= Sqlhelp.EReader(失去了,pms);
if (reader.HasRows)//HasRows判断reader中是否有数据
{
while(reader.Read()) //Read()方法读取下一条记录,如果没有下一条,返回false,则表示读取完成
{
int id = reader.GetInt32(0);
string name = reader.GetString(1);
string gender = reader.GetBoolean(3) == true ? "男" : "女"; //运用了三元表达式
int age = reader.GetInt32(2);
Console.WriteLine("\t{0}\t{1}\t{2}\t{3}\r\n",id,name,gender,age);
}
Console.ReadKey();
注意:
- SqlDataReader的HasRows属性可以判断SqlDataReader中是否有(一行或多行)数据,返回bool值,有数据时为true,程序向下执行,开始进入读取数据环节
- SqlDataReader的Read方法可以使SqlDataReader前进到下一条记录,同样返回bool值,当下一条无记录返回false,则表示记录读取完毕;当下一条有数据时为true,将读取到的数据(当前的一条记录)暂存在SqlDataReader中
- SqlDataReader的一系列get方法可以获取SqlDataReader中不同类型的值,保存到指定的变量中
- get方法参数为列数,即第几列
关于链接断开在Sqlhelper进行了处理
三、调用示例
string sql = "select COUNT(*) from user1 where Name=@name and Psw=@psw";
SqlParameter[]pms=new SqlParameter[]{
new SqlParameter("@name",SqlDbType.NVarChar,50){ Value=textBox1.Text.Trim()},
new SqlParameter("@psw",SqlDbType.NVarChar,50){Value=textBox2.Text}
};
//Sqlhelp sqlhelp = new Sqlhelp();
int r = (int)Sqlhelp.EScalar(sql,pms);
if (r > 0)
{
MessageBox.Show("登录成功");
}
else
{
MessageBox.Show("登录失败");