您的位置:首页 > 职场人生

黑马程序员—ADO.NET

2013-07-28 13:45 337 查看
---------------------- ASP.Net+Android+IO开发S.Net培训、期待与您交流! ----------------------

ADO.NET

1.概念

为什么要使用ADO.Net 
程序要和数据库交互要通过ADO.Net 进行

通过ADO.Net就能在程序中执行SQL了

ADO.Net中提供了对各种不同数据库的统一操作接口

ADO.NET的组成



ADO.NET数据库操作



Connection 类

  和数据库交互,你必须连接它。连接帮助指明数据库服务器、数据库名字、用户名、密码,和连接数据库所需要的其它参数。Connection对象会被Command对象使用,这样就能够知道是在哪个数据源上面执行命令。

  与数据库交互的过程意味着你必须指明想要执行的操作。这是依靠Command对象执行的。你使用Command对象来发送SQL语句给数据库。Command对象使用Connection对象来指出与哪个数据源进行连接。你能够单独使用Command对象来直接执行命令,或者将一个Command对象的引用传递给DataAdapter,它保存了一组能够操作下面描述的一组数据的命令。
Command对象

  成功于数据建立连接后,就可以用Command对象来执行查询、修改、插入、删除等命令; Command对象常用的方法有ExecuteReader方法、ExecuteScalar()方法和ExecuteNonQuery()方法;插入数据可用ExecuteNonQuery()方法来执行插入命令。
DataReader类

  许多数据操作要求你只是读取一串数据。DataReader对象允许你获得从Command对象的SELECT语句得到的结果。考虑性能的因素,从DataReader返回的数据都是快速的且只是“向前”的数据流。这意味着你只能按照一定的顺序从数据流中取出数据。这对于速度来说是有好处的,但是如果你需要操作数据,更好的办法是使用DataSet。
DataSet对象

  DataSet对象是数据在内存中的表示形式。它包括多个DataTable对象,而DataTable包含列和行,就象一个普通的数据库中的表。你甚至能够定义表之间的关系来创建主从关系(parent-child relationships)。DataSet是在特定的场景下使用――帮助管理内存中的数据并支持对数据的断开操作的。DataSet是被所有Data Providers使用的对象,因此它并不像Data Provider一样需要特别的前缀。
DataAdapter类

  某些时候你使用的数据主要是只读的,并且你很少需要将其改变至底层的数据源。同样一些情况要求在内存中缓存数据,以此来减少并不改变的数据被数据库调用的次数。DataAdapter通过断开模型来帮助你方便的完成对以上情况的处理。当在一单批次的对数据库的读写操作的持续的改变返回至数据库的时候,DataAdapter 填充(fill)DataSet对象。DataAadapter包含对连接对象以及当对数据库进行读取或者写入的时候自动的打开或者关闭连接的引用。另外,DataAdapter包含对数据的SELECT、INSERT、UPDATE和DELETE操作的Command对象引用。你将为DataSet中的每一个Table都定义DataAadapter,它将为你照顾所有与数据库的连接。所有你将做的工作是告诉DataAdapter什么时候装载或者写入到数据库。
DataTable类

DataTable 是一个数据网格控件,理解成一张表就可以了

DataTable的实例化以及添加列:
  DataTable dt = new DataTable();
  dt.Columns.Add("ID");
  dt.Columns.Add("Name");
  DataRow dr = dt.NewRow();
  object[] objs = { 1, "Name" };
  dr.ItemArray = objs;
  dt.Rows.Add(dr);
  this.dataGridView1.DataSource = dt;
连接SQLServer(Connection)
连接字符串
static string conStr2 = @"server=.\sqlexpress;database=eam_hzht;Integrated Security=True;";
ADO.Net中通过SqlConnection类创建到SQLServer的连接

static string conStr2 = @"server=.\sqlexpress;database=eam_hzht;Integrated Security=True;";

#region 1.测试连接
/// <summary>
/// 测试连接
/// </summary>
public static void TestLJ()
{
SqlConnection conn = new SqlConnection(conStr2);
conn.Open();
conn.Close();
Console.WriteLine("连接对象成功~~~");
}
#endregion

ADO.NET对象归纳总结
Connection:Connection对象有两个属性:ConnectionString 和 State;以及两个重要方法:Open和close

Command:Command对象有一个属性:CommandType(sql语句或者存储过程);三个重要方法:ExecuteNonQuery(增、删、改影响的行数)、ExecuteReader(返回DataReader对象类型)ExecuteScalar(返回结果集的第一行第一列值)
DataReader:DataReader对象不能直接实例化,必须通过Command对象中的一个方法来创建;DataReader有很多属性,Read(是否还有下一条数据),读取数据的属性(三中方式)
DataAdapter:作用是充当适配器;其中有一个重要方法Fill,这个方法可以在不打开数据库连接的情况进行数据操作
DataSet:相当于内存中的一个数据库,使用DataAdapter对象填充DataSet或者DataTable
DataTable:(DataColumn对象和DataRow对象):它有两个属性Columns和Rows
可空数据类型

C#中值类型(int、Guid、bool等)是不可以为空的,int i=null是错误的,因此int、bool等这些类型不能表示数据库中的“Null” 。因此C#提供了“可空类型”这种语法,只要在类型后加?就构成了可空的数据类型

//在值类型后加?就成了可空类型
int? i = null;
i = 1;
i++;
Console.WriteLine(i);//-------2
Console.ReadKey();
判断可空类型是否为空,i==null或者i.HasValue;得到可空变量的值,int i1=(int)i.Value或者int i1=i.Value。

类型转换:不可空类型赋值给可空类型无需显式转换(一定成功),可空类型赋值给不可空类型则需显式转换(不一定成功)
DBNull.value  
DataRow dr = dt.Rows[0];
如果数据库里边存的是NULL,那么 dr["TelPhone"]取出来的数值是DBNull.value ,
ADO.Net对于C#中int不可以为null,数据库中int可以为null的一个权衡
(DBNull.value==null)是bool类型 --False
DBNull.value不等于null
//判断字段值在数据库是否为null的写法
if(dr["TelPhone"] == DBNull.value)
{
}
或者
if(dr.IsNull("TelPhone"))
{
}
SQL注入漏洞攻击
登录判断:select * from T_Users where UserName=... and Password=...,将参数拼到SQL语句中。

构造恶意的Password:' or '1'='1
using (SqlCommand cmd = conn.CreateCommand())
{
string password = "' or '1'='1";
cmd.CommandText = "select * from T_Users where UserName='admin' and Password='" + password+"'";
using (SqlDataReader reader = cmd.ExecuteReader())
{
if (reader.Read())
{
Console.WriteLine("登录成功");
}
else
{
Console.WriteLine("登录失败");
}
}
}
防范注入漏洞攻击的方法:不使用SQL语句拼接,通过参数赋值

2.自己写的SQLHelper类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using System.Data.SqlClient;
using System.Data;

namespace ClassLibrary
{
static class SQLHelper
{
//获取连接字符串
public static readonly string conStr = ConfigurationManager.ConnectionStrings["conStr"].ConnectionString;

/// <summary>
/// 执行 增,删,改,查操作,返回受影响行数
/// </summary>
/// <param name="sql"></param>
/// <param name="paras"></param>
/// <returns></returns>
public static int ExecuteNonQuery(string sql, params SqlParameter[] paras)
{
using (SqlConnection conn = new SqlConnection(conStr))
{
conn.Open();
try
{
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = sql;
cmd.Parameters.AddRange(paras);
return cmd.ExecuteNonQuery();
}
}
catch (Exception ex)
{
throw ex;
}
}
}

/// <summary>
/// 执行查询操作,返回首行首列的值
/// </summary>
/// <param name="sql"></param>
/// <param name="paras"></param>
/// <returns></returns>
public static object ExecuteScalar(string sql, params SqlParameter[] paras)
{
using (SqlConnection conn = new SqlConnection(conStr))
{
conn.Open();
try
{
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = sql;
cmd.Parameters.AddRange(paras);
return cmd.ExecuteScalar();
}
}
catch (Exception ex)
{
throw ex;
}
}
}

/// <summary>
/// 执行查询操作,返回一个数据表
/// </summary>
/// <param name="sql"></param>
/// <param name="paras"></param>
/// <returns></returns>
public static DataTable ExecuteDataTable(string sql, params SqlParameter[] paras)
{
using (SqlConnection conn = new SqlConnection(conStr))
{
conn.Open();
try
{
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = sql;
cmd.Parameters.AddRange(paras);
using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))
{
DataTable dt = new DataTable();
adapter.Fill(dt);
return dt;
}
}
}
catch (Exception ex)
{
throw ex;
}
}
}

/// <summary>
/// 执行查询操作,返回 SqlDataReader
/// </summary>
/// <param name="sql"></param>
/// <param name="parameters"></param>
/// <returns></returns>
public static SqlDataReader ExecuteDataReader(string sql, params SqlParameter[] parameters)
{
using (SqlConnection conn = new SqlConnection(conStr))
{
conn.Open();
try
{
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = sql;
cmd.Parameters.AddRange(parameters);
return cmd.ExecuteReader(CommandBehavior.CloseConnection);
}
}
catch (Exception ex)
{
throw ex;
}
}
}

/// <summary>
/// 执行存储过程,非查询,返回受影响行数
/// </summary>
/// <param name="usp_Name"></param>
/// <param name="paras"></param>
/// <returns></returns>
public static int ExecuteUsp(string usp_Name, params SqlParameter[] paras)
{
using (SqlConnection conn = new SqlConnection(conStr))
{
conn.Open();
try
{
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = usp_Name;
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddRange(paras);
return cmd.ExecuteNonQuery();
}
}
catch (Exception ex)
{
throw ex;
}
}
}

/// <summary>
/// 执行存储过程,返回一个数据表
/// </summary>
/// <param name="usp_Name"></param>
/// <param name="paras"></param>
/// <returns></returns>
public static DataTable ExecuteProc(string usp_Name, params SqlParameter[] paras)
{
using (SqlConnection conn = new SqlConnection(conStr))
{
conn.Open();
try
{
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = usp_Name;
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddRange(paras);
using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))
{
DataTable dt = new DataTable();
adapter.Fill(dt);
return dt;
}
}
}
catch (Exception ex)
{
throw ex;
}
}
}
}
}


---------------------- ASP.Net+Android+IO开发S.Net培训、期待与您交流! ----------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ADO.NET