知识大全 微软提供的数据访问组件SqlHelper
Posted 语句
篇首语:没有一贯的蔑视,又怎能不断地欣赏呢?本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 微软提供的数据访问组件SqlHelper相关的知识,希望对你有一定的参考价值。
微软提供的数据访问组件SqlHelper 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
数据访问组件是一组通用的访问数据库的代码 在所有项目中都可以用 一般不需要修改 本节使用的是Microsoft提供的数据访问助手 其封装很严密 且应用简单 首先要先添加一个类 并命名为SqlHelper 系统会提示是否将类放在App_Code文件夹中 此时一定要选择 是 因为放在此文件夹下 系统会自动进行编译 程序员就可以直接使用 无需另外编译了 SqlHelper的目的是从数据库获得信息或将信息保存到数据库 本实例的SqlHelper主要功能如下 ( )执行不返回数据的T Sql命令 例如修改会员卡信息 添加会员资料等 ( )返回一个字段的T Sql命令 例如获取会员卡类型的积分规则 ( )返回一组数据 例如获取会员资料 获取所有会员卡类型等 ( )缓存参数列表 在执行一条语句时 可能有多个参数 为了提高速度 将参数缓存 ( )读取缓存的参数 下面用图表的方式描述SqlHelper类的功能 如图 所示 在SqlHelper类中添加数据库处理 代码如下
//编号 using System;using System Data;using System Configuration;using System Web;using System Web Security;using System Collections;using System Data SqlClient;//编号 /**//// <summary>/// 数据库的通用访问代码/// 此类为抽象类 不允许实例化 在应用时直接调用即可/// </summary>public abstract class SqlHelper //获取数据库连接字符串 其属于静态变量且只读 项目中所有文档可以直接使用 但不能修改 //编号 public static readonly string ConnectionStringLocalTransaction = ConfigurationManager ConnectionStrings[ connstring ] ConnectionString; // 哈希表用来存储缓存的参数信息 哈希表可以存储任意类型的参数 //编号 private static Hashtable parmCache = Hashtable Synchronized(new Hashtable());//编号 /**//// <summary> ///执行一个不需要返回值的SqlCommand命令 通过指定专用的连接字符串 /// 使用参数数组形式提供参数列表 /// </summary> /// <remarks> /// 使用示例 /// int result = ExecuteNonQuery(connString CommandType StoredProcedure /// PublishOrders new SqlParameter( @prodid )); /// </remarks> /// <param name= connectionString >一个有效的数据库连接字符串</param> /// <param name= mandType >SqlCommand命令类型 (存储过程 T SQL语句 等等 ) /// </param> /// <param name= mandText >存储过程的名字或者 T SQL 语句</param> /// <param name= mandParameters >以数组形式提供SqlCommand命令中用到的参数列表 /// </param> /// <returns>返回一个数值表示此SqlCommand命令执行后影响的行数</returns> //编号 public static int ExecuteNonQuery(string connectionString CommandType cmdType string cmdText params SqlParameter[] mandParameters) SqlCommand cmd = new SqlCommand(); //编号 using (SqlConnection conn = new SqlConnection(connectionString)) //通过PrePareCommand方法将参数逐个加入到SqlCommand的参数集合中 PrepareCommand(cmd conn null cmdType cmdText mandParameters); int val = cmd ExecuteNonQuery(); //清空SqlCommand中的参数列表 cmd Parameters Clear(); //编号 return val; /**//// <summary> ///执行一条不返回结果的SqlCommand 通过一个已经存在的数据库连接 /// 使用参数数组提供参数 /// </summary> /// <remarks> /// 使用示例 /// int result = ExecuteNonQuery(conn CommandType StoredProcedure /// PublishOrders new SqlParameter( @prodid )); /// </remarks> /// <param name= conn >一个现有的数据库连接</param> /// <param name= mandType >SqlCommand命令类型 (存储过程 T SQL语句 等等 ) /// </param> /// <param name= mandText >存储过程的名字或者 T SQL 语句</param> /// <param name= mandParameters >以数组形式提供SqlCommand命令中用到的参数列表 /// </param> /// <returns>返回一个数值表示此SqlCommand命令执行后影响的行数</returns> //编号 public static int ExecuteNonQuery(SqlConnection connection CommandType cmdType string cmdText params SqlParameter[] mandParameters) SqlCommand cmd = new SqlCommand(); PrepareCommand(cmd connection null cmdType cmdText mandParameters); int val = cmd ExecuteNonQuery(); cmd Parameters Clear(); return val; /**//// <summary> /// 执行一条不返回结果的SqlCommand 通过一个已经存在的数据库事物处理 /// 使用参数数组提供参数 /// </summary> /// <remarks> /// 使用示例 /// int result = ExecuteNonQuery(trans CommandType StoredProcedure /// PublishOrders new SqlParameter( @prodid )); /// </remarks> /// <param name= trans >一个存在的 sql 事物处理</param> /// <param name= mandType >SqlCommand命令类型 (存储过程 T SQL语句 等等 ) /// </param> /// <param name= mandText >存储过程的名字或者 T SQL 语句</param> /// <param name= mandParameters >以数组形式提供SqlCommand命令中用到的参数列表 /// </param> /// <returns>返回一个数值表示此SqlCommand命令执行后影响的行数</returns> //编号 public static int ExecuteNonQuery(SqlTransaction trans CommandType cmdType string cmdText params SqlParameter[] mandParameters) SqlCommand cmd = new SqlCommand(); PrepareCommand(cmd trans Connection trans cmdType cmdText mandParameters); int val = cmd ExecuteNonQuery(); cmd Parameters Clear(); return val; /**//// <summary> /// 执行一条返回结果集的SqlCommand命令 通过专用的连接字符串 /// 使用参数数组提供参数 /// </summary> /// <remarks> /// 使用示例 /// SqlDataReader r = ExecuteReader(connString CommandType StoredProcedure /// PublishOrders new SqlParameter( @prodid )); /// </remarks> /// <param name= connectionString >一个有效的数据库连接字符串</param> /// <param name= mandType >SqlCommand命令类型 (存储过程 T SQL语句 等等 ) /// </param> /// <param name= mandText >存储过程的名字或者 T SQL 语句</param> /// <param name= mandParameters >以数组形式提供SqlCommand命令中用到的参数列表 /// </param> /// <returns>返回一个包含结果的SqlDataReader</returns> public static SqlDataReader ExecuteReader(string connectionString CommandType cmdType string cmdText params SqlParameter[] mandParameters) SqlCommand cmd = new SqlCommand(); SqlConnection conn = new SqlConnection(connectionString); // 在这里使用try/catch处理是因为如果方法出现异常 则SqlDataReader就不存在 //CommandBehavior CloseConnection的语句就不会执行 触发的异常由catch捕获 //关闭数据库连接 并通过throw再次引发捕捉到的异常 try PrepareCommand(cmd conn null cmdType cmdText mandParameters); SqlDataReader rdr = cmd ExecuteReader(CommandBehavior CloseConnection); cmd Parameters Clear(); return rdr; catch conn Close(); throw; //编号 /**//// <summary> /// 执行一条返回第一条记录第一列的SqlCommand命令 通过专用的连接字符串 /// 使用参数数组提供参数 /// </summary> /// <remarks> /// 使用示例 /// Object obj = ExecuteScalar(connString CommandType StoredProcedure /// PublishOrders new SqlParameter( @prodid )); /// </remarks> /// <param name= connectionString >一个有效的数据库连接字符串</param> /// <param name= mandType >SqlCommand命令类型 (存储过程 T SQL语句 等等 ) /// </param> /// <param name= mandText >存储过程的名字或者 T SQL 语句</param> /// <param name= mandParameters >以数组形式提供SqlCommand命令中用到的参数列表 /// </param> /// <returns>返回一个object类型的数据 可以通过 Convert ToType方法转换类型</returns> public static object ExecuteScalar(string connectionString CommandType cmdType string cmdText params SqlParameter[] mandParameters) SqlCommand cmd = new SqlCommand(); using (SqlConnection connection = new SqlConnection(connectionString)) PrepareCommand(cmd connection null cmdType cmdText mandParameters); object val = cmd ExecuteScalar(); cmd Parameters Clear(); return val; /**//// <summary> /// 执行一条返回第一条记录第一列的SqlCommand命令 通过已经存在的数据库连接 /// 使用参数数组提供参数 /// </summary> /// <remarks> /// 使用示例 /// Object obj = ExecuteScalar(connString CommandType StoredProcedure /// PublishOrders new SqlParameter( @prodid )); /// </remarks> /// <param name= conn >一个已经存在的数据库连接</param> /// <param name= mandType >SqlCommand命令类型 (存储过程 T SQL语句 等等 ) /// </param> /// <param name= mandText >存储过程的名字或者 T SQL 语句</param> /// <param name= mandParameters >以数组形式提供SqlCommand命令中用到的参数列表 /// </param> /// <returns>返回一个object类型的数据 可以通过 Convert ToType方法转换类型 /// </returns> public static object ExecuteScalar(SqlConnection connection CommandType cmdType string cmdText params SqlParameter[] mandParameters) SqlCommand cmd = new SqlCommand(); PrepareCommand(cmd connection null cmdType cmdText mandParameters); object val = cmd ExecuteScalar(); cmd Parameters Clear(); return val; /**//// <summary> /// 缓存参数数组 /// </summary> /// <param name= cacheKey >参数缓存的键值</param> /// <param name= cmdParms >被缓存的参数列表</param> public static void CacheParameters(string cacheKey params SqlParameter[] mandParameters) //编号 parmCache[cacheKey] = mandParameters; /**//// <summary> /// 获取被缓存的参数 /// </summary> /// <param name= cacheKey >用于查找参数的KEY值</param> /// <returns>返回缓存的参数数组</returns> public static SqlParameter[] GetCachedParameters(string cacheKey) SqlParameter[] cachedParms = (SqlParameter[])parmCache[cacheKey]; if (cachedParms == null) return null; //新建一个参数的克隆列表 SqlParameter[] clonedParms = new SqlParameter[cachedParms Length]; //通过循环为克隆参数列表赋值 for (int i = j = cachedParms Length; i < j; i++) //使用clone方法复制参数列表中的参数 //编号 clonedParms[i] = (SqlParameter)((ICloneable)cachedParms[i]) Clone(); return clonedParms; /**//// <summary> /// 为执行命令准备参数 /// </summary> /// <param name= cmd >SqlCommand 命令</param> /// <param name= conn >已经存在的数据库连接</param> /// <param name= trans >数据库事物处理</param> /// <param name= cmdType >SqlCommand命令类型 (存储过程 T SQL语句 等等 ) </param> /// <param name= cmdText >Command text T SQL语句 例如 Select * from /// Products</param> /// <param name= cmdParms >返回带参数的命令</param> //编号 private static void PrepareCommand(SqlCommand cmd SqlConnection conn SqlTransaction trans CommandType cmdType string cmdText SqlParameter[] cmdParms) //判断数据库连接状态 if (conn State != ConnectionState Open) conn Open(); cmd Connection = conn; cmd CommandText = cmdText; //判断是否需要事物处理 if (trans != null) cmd Transaction = trans; cmd CommandType = cmdType; if (cmdParms != null) foreach (SqlParameter parm in cmdParms) cmd Parameters Add(parm);代码是一个比较完整的数据访问组件 下面分析这些代码的具体实现
( )Using关键字 见代码编号 Using处理对命名空间的引用 通常 如果系统提示找不到某个类 一定要仔细检查是否引用了这个类的命名空间 在C# 中Using还可以实现命名空间的别名 例如 Using sc =System Collections 别名就是用来简化命名空间的 别名的使用语句是 sc::ArrayList list=new sc::Arraylist( )
( )注释 见代码编号 在方法上面一行如果输入 /// 系统会自动将此方法的注释架构搭建好 主要包括Summary和param name 如果方法有返回值 还包括returns 如果需要特殊说明可以使用remarks标志 根据这个结构 可以很容易地描述清楚整个方法的组成及使用方法 在注释中使用 /// 将来在代码调用时 会出现提示 提示的内容就是所添加的注释
( )CommandType的使用 见代码编号 SQL Server数据处理的两种方法 存储过程和T SQL语句 每条执行语句都有个参数CommandType 这是个枚举类型 有 个选项 StoredProcedure TableDirect和Text 它们分别表示存储过程 表和T SQL语句 如果CommandType参数选择StoredProcedure 则cmdText参数就是存储过程的名字 如果CommandType是Text 则cmdText是SQL语句 如果CommandType是TableDirect 则cmdText是表名称
( )Using语句 见代码编号 在Using语句中 用 定义一个范围 在语句完成时释放语句内使用的资源 Using语句通常用在获取数据的方法中 语句的范围是从打开数据库连接开始 到所有使用连接的资源都运行完毕后终止 Using语句可以与多个对象一起使用 使用Using语句的对象必须继承IDispose接口 此接口实现了Dispose方法 该方法才是释放对象资源的执行者
( )参数数组 见代码编号 在C#中不允许使用可选参数 所以参数通常由不指定大小的数组来实现 数组中参数的添加由PrepareCommand方法完成
( )SQL事务处理 见代码编号 事务是指一组相关联的操作 在事务处理时 通常锁住相关的表 等事务处理完成后才解锁 这样保证了数据的完整性 事务一般包括 个方法 开始事务 执行事务和事务回滚(RollBack) 如果事务中的一条语句出现问题 则事务回滚 其他语句的执行也被取消
( )throw 见代码编号 再次引发捕获的异常 目的是向文本中添加异常处理信息 如果要引发异常 throw和catch一定要搭配使用 如果catch有参数 则throw也要带参数 相反亦然
( )哈希表 见代码编号 表示键/值(key/value)对的组合 通过键值的映射来访问哈希代码 NET中的哈希表是System Collections命名空间提供的一个容器 英文名称为HashTable 通过key来实现快速查找 key区分大小写 value存储key对应的值 通常表现为object类型 当取值时要进行相应的类型转换
( )哈希表的同步包装 见代码编号 private static Hashtable parmCache = Hashtable Synchronized(new Hashtable( ))这条语句实现了哈希表的同步包装 包装是基于线程安全的 此处的哈希表是static类型的静态变量 既然是static 就是一次定义 全局使用 所有的参数都使用这个哈希表 那如何保证其他人在修改的时候不影响自己的读取呢?以前可以使用lock的方法先锁定表 不允许他人修改 读取完毕后再解锁 现在 NET提供了HashTable的Synchronized方法 实现同样的功能 不需要手动加锁 直接由系统框架完成
( )缓存参数列表 见代码编号 缓存参数列表就是将参数信息保存在已经定义的静态HashTable中 因为HashTable是静态的 一旦定义 就分配了内存地址 在项目中随时都可以使用 起到了缓存数据的作用
( )clone 克隆 见代码编号 在 NET中 几乎所有继承Collections类的集合都具有clone的方法 在获取缓存参数的方法中有下面这句代码 clonedParms[i] = (SqlParameter) ((ICloneable)cachedParms[i]) Clone( ) 因为所有的参数都保存在一个HashTable中 表中保存的只是参数的名字 而参数的内容则是由不同的调用给予不同的值 为了正确反映调用者的值 必须克隆出一个参数列表 由调用者根据功能赋予对应的值
( )方法重载 见代码编号 定义了两个或多个具有相同名称但参数不同的方法 在SqlHelper中 ExcuteNonQuery被重载了 次 通过代码中的注释可以很清楚地看出参数列表的不同 在实际应用中 根据功能环境调用相应的方法
( )ConfigurationManager 见代码编号 是ASP NET 中新加的一个类 主要对nfig文件进行管理 可以轻松获取在nfig文件中定义的配置 通常用来获取数据库连接字符串和个性化配置信息 本例在nfig中添加了下面这行数据库连接字符串配置
<connectionStrings ><add name= connstring connectionString = server= ;database=membercard; uid=sa; pwd= /></connectionStrings> cha138/Article/program/net/201311/12489相关参考
摘要 学习向应用程序公开数据的最佳方式以及如何实现一个有效的策略以便在分布式应用程序的层间传递数据 简介 在设计分布式应用程序时需要确定如何访问和表示与该应用程序相关联的业务数据本文提供一些
知识大全 不用.net和其组件用asp访问webservice
可能大多数的人认为我们需要运行或使用soaptoolkit以访问webservice但是这不是必需的使用微软的xmlparser我们同样可以利用传统的asp页面来访问webservice下面我就展
这就需要我们在实际开发过程中将这些数据库访问类再作一次封装经过这样的封装不仅可以达到上述的目标还可以减少操作数据库的步骤减少代码编写量在这个方面微软为我们提供了ApplicationBlock但是可惜
知识大全 用.NET新提供的managed provider来访问Oracle数据
用.NET新提供的managedprovider来访问Oracle数据 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶
MicrosoftSyncFramework(MSF)为我们提供了进行同步应用开发的基础框架和API这些API即有基于托管代码的也有基于非托管代码的也就是说我们既可以开发基于NET平台使用托管AP
JavaScript访问JSF组件的方法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 先看下面
知识大全 设置sqlplus访问远程oracle数据库的方法
如果要连接远程数据库传统的一定可行的方法是在本地装一个oracle然后使用NeorkConfigurationAssistant配置之后用PL/SQLDev连接 oracle官网上提供了最小访问
知识大全 101个微软提供的Visual Studio 2005示例
101个微软提供的VisualStudio2005示例 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧
让你认清BOOT.INI文件的目的[微软提供] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!本论文
知识大全 SqlHelper.FillDataset 的一个Bug
SqlHelper.FillDataset的一个Bug 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧