当前位置: 首页 > 编程日记 > 正文

一步步写自己SqlHelper类库(五):Command对象

1.Command对象基础

当我们使用Connection对象里面的方法打开数据库后,要查询自己所需的数据或对数据库的内容进行增删改时,Command对象就派上用场了!

MSDN定义:建立与数据源的连接后,利用Command对象来执行命令并从数据源中返回结果。

.NET Framework 提供的每个 .NET Framework 数据提供程序都具有一个 Command 对象。

名称命名空间描述
SqlCommandSystem.Data.SqlClient表示与SQL Server的操作对象
OleDbCommandSystem.Data.OleDb表示与OleDb数据源的操作对象
OdbcCommandSystem.Data.Odbc表示与ODBC数据源的操作对象
OracleCommandSystem.Data.OracleClient表示与Orale数据库的操作对象

2.Command对象属性和方法 

2.1属性

CommandText: 获取或设置对数据源执行的文本命令。默认值为空字符串。

CommandType: 命令类型,指示或指定如何解释CommandText属性。CommandType属性的值是一个枚举类型,定义结构如下:

 public enum CommandType{// 摘要://     SQL 文本命令。(默认。)Text = 1,//// 摘要://     存储过程的名称。StoredProcedure = 4,//// 摘要://     表的名称。TableDirect = 512,}

需要特别注意的是,将CommandType 设置为 StoredProcedure 时,应将 CommandText 属性设置为存储过程的名称。 当调用 Execute 方法之一时,该命令将执行此存储过程。

Connection: 设置或获取与数据源的连接。

  Parameters: 绑定SQL语句或存储过程的参数。防止SQL注入,参数化查询中不可或缺的对象,非常重要。

  Tranction: 获取或设置在其中执行 .NET Framework 数据提供程序的 Command 对象的事务。

  2.2方法

   

命令返回值
ExecuteNonQuery

对连接执行 Transact-SQL 语句并返回受影响的行数。

对于 UPDATE、INSERT 和 DELETE 语句,返回值为该命令所影响的行数。对于所有其
他类型的语句,返回值为 -1。如果发生回滚,返回值也为 -1。

ExecuteScalar执行查询,并返回查询所返回的结果集中第一行的第一列。
ExecuteReader执行查询,并返回一个 DataReader 对象
ExecuteXMLReader返回 XmlReader。 只用于 SqlCommand 对象。

 

3.使用参数化Parameter

3.1 基础知识点

对数据库进行增删改查操作时,如果使用普通的字符串拼接SQL语句,会造成SQL注入,泄露数据库中的信息,所以使用参数化的操作可以防止这一问题。

对于不同的数据源来说,Parameter对象不同,但都派生自DbParameter对象。下表列举了不同数据源对应的Parameter对象。

数据提供程序对应Paramter对象                                                           命名空间                                                                                                                  
SQLServer 数据源使用SqlParamter对象System.Data.SqlClient.SqlParameter
Ole DB 数据源使用OleDbParameter对象System.Data.OleDb.OleDbParameter
ODBC 数据源使用OdbcParamter对象System.Data.Odbc.OdbcParameter
Oracle数据源使用OracleParameter对象System.Data.OracleClient.OracleParameter

3.2属性

Paramter对象的属性很多,其中常见而且非常重要的主要有以下几个:

DbType: 获取或设置参数的数据类型。

Direction: 获取或设置一个值,该值指示参数是否只可输入、只可输出、双向还是存储过程返回值参数。

IsNullable: 获取或设置一个值,该值指示参数是否可以为空。

ParamteterName: 获取或设置DbParamter的名称。

Size: 获取或设置列中数据的最大大小。

Value: 获取或设置该参数的值。

3.3方法

Paramter对象Add方法:该方法每次只能添加一个SqlParameter。下面代码的功能是将ID值等于1的字段name更新为Terrychan。

SqlParameter sp = new SqlParameter("@name", "Terrychan");
command.Parameters.Add(sp);
sp = new SqlParameter("@ID", "1");
command.Parameters.Add(sp);

Paramter对象Add方法:add方法在添加多个SqlParameter时不方便,此时,可以采用AddRange方法

SqlParameter[] paras = new SqlParameter[] { new SqlParameter("@name", "Pudding"), new SqlParameter("@ID", "1") };
cmd.Parameters.AddRange(paras);

4.SqlHelper类

Command对象里面的几个方法很重要,基本上可以实现数据库的增删改查操作,在封装方法时,应该注意方法的重载。

View Code
  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Web;
  5 using System.Data;
  6 using System.Data.SqlClient;
  7 using System.Configuration;
  8 
  9 /// <summary>
 10 ///SqlHelper create by TerryChan 2012-04-17
 11 /// </summary>
 12 public class SqlHelper
 13 {
 14     #region 全局配置
 15     /// <summary>
 16     /// 连接字符串
 17     /// </summary> 
 18     public readonly static string connectionString = ConfigurationManager.ConnectionStrings["connstring"].ToString();
 19   
 20     /// <summary>
 21     /// SqlConnection对象
 22     /// </summary> 
 23     private static SqlConnection conn = new SqlConnection(connectionString);
 24 
 25     #endregion
 26 
 27     #region 打开数据库
 28     /// <summary>
 29     /// 打开数据库
 30     /// </summary>
 31     public static void OpenConnection()
 32     {
 33         if (conn.State != ConnectionState.Open)
 34         {
 35             try
 36             {
 37                 conn.Open();
 38             }
 39             catch (Exception ex)
 40             {
 41                 conn.Dispose();
 42                 throw new Exception("打开数据库失败!" + ex.Message);
 43             }
 44         }
 45     }
 46     #endregion
 47 
 48     #region 关闭数据库
 49     /// <summary>
 50     /// 关闭数据库
 51     /// </summary>
 52     public static void CloseConnection()
 53     {
 54         if (conn.State == ConnectionState.Open)
 55         {
 56             try
 57             {
 58                 conn.Close();
 59             }
 60             catch (Exception ex)
 61             {
 62                 conn.Dispose();
 63                 throw new Exception("关闭数据库失败!" + ex.Message);
 64             }
 65         }
 66     }
 67     #endregion
 68 
 69     #region ExecuteNoQuery 执行不返回数据行的操作,并返回一个int类型的数据
 70 
 71     /// <summary>
 72     /// 执行不返回数据行的操作,返回一个int类型的数据
 73     /// </summary>
 74     /// <param name="sql">要执行的SQL文本命令</param>
 75     /// <returns>返回受影响的行数</returns>
 76     public static int ExecuteNoQuery(string sql)
 77     {
 78         return ExecuteNoQuery(sql, CommandType.Text, null);
 79     }
 80 
 81     /// <summary>
 82     /// 执行不返回数据行的操作,返回一个int类型的数据
 83     /// </summary>
 84     /// <param name="sql">要执行的SQL文本命令或存储过程名称</param>
 85     /// <param name="type">要执行的查询语句的类型,存储过程或SQL文本命令</param>
 86     /// <returns>返回受影响的行数</returns>
 87     public static int ExecuteNoQuery(string sql, CommandType type)
 88     {
 89         return ExecuteNoQuery(sql, type, null);
 90     }
 91 
 92     /// <summary>
 93     /// 执行不返回数据行的操作,返回一个int类型的数据
 94     /// </summary>
 95     /// <param name="sql">要查询的SQL文本命令或存储过程名称</param>
 96     /// <param name="type">要执行的查询语句的类型,存储过程或SQL文本命令</param>
 97     /// <param name="sp">T-SQL语句或存储过程的参数数组</param>
 98     /// <returns>返回受影响的行数</returns>
 99     public static int ExecuteNoQuery(string sql, CommandType type, SqlParameter[] sp)
100     {
101         try
102         {
103             OpenConnection();
104             SqlCommand command = new SqlCommand(sql, conn);
105             command.CommandType = type;
106             if (sp != null)
107             {
108                 foreach (SqlParameter parameter in sp)
109                 {
110                     command.Parameters.Add(parameter);
111                 }
112             }
113             int result = command.ExecuteNonQuery();
114             return result;
115         }
116         catch (Exception ex)
117         {
118             throw new Exception("ExecuteNoQuery错误:" + ex);
119         }
120         finally
121         {
122             CloseConnection();
123         }
124     }
125 
126     #endregion
127 
128     #region ExecuteScalar 执行查询,并返回查询结果集中第一行的第一列
129 
130         /// <summary>
131         /// 执行查询结果,返回第一行的第一列
132         /// </summary>
133         /// <param name="sql">要执行的SQL文本命令</param>
134         /// <returns>返回第一行的第一列</returns>
135         public static object ExecuteScalar(string sql)
136         {
137             return ExecuteScalar(sql, CommandType.Text, null);
138         }
139 
140         /// <summary>
141         /// 执行查询结果,返回第一行的第一列
142         /// </summary>
143         /// <param name="sql">要查询的SQL文本命令或存储过程名称</param>
144         /// <param name="type">要执行的查询语句的类型,存储过程或SQL文本命令</param>
145         /// <returns>返回第一行的第一列</returns>
146         public static object ExecuteScalar(string sql, CommandType type)
147         {
148             return ExecuteScalar(sql, type, null);
149         }
150 
151         /// <summary>
152         /// 执行查询结果,返回第一行的第一列
153         /// </summary>
154         /// <param name="sql">要查询的SQL文本命令或存储过程名称</param>
155         /// <param name="type">要执行的查询语句的类型,存储过程或SQL文本命令</param>
156         /// <param name="sp">T-SQL语句或存储过程的参数数组</param>
157         /// <returns>返回第一行的第一列</returns>
158         public static object ExecuteScalar(string sql,CommandType type,SqlParameter [] sp)
159         {
160             try
161             {
162                 object result = null;
163                 OpenConnection();
164                 SqlCommand command = new SqlCommand(sql,conn);
165                 command.CommandType = type;
166                 if (sp != null)
167                 {
168                     foreach (SqlParameter parameter in sp)
169                     {
170                         command.Parameters.Add(parameter);
171                     }
172                 }
173                 result = command.ExecuteScalar();
174                 return result;
175             }
176             catch (Exception ex)
177             {
178                 throw new Exception("ExecuteScalar错误:" + ex);
179             }
180             finally
181             {
182                 CloseConnection();
183             }
184         }
185         #endregion
186 
187         #region ExecuteReader 执行查询,并返回一个 DataReader 对象
188 
189         /// <summary>
190         /// 执行查询,并返回一个 DataReader 对象
191         /// </summary>
192         /// <param name="sql">要执行的SQL文本语句</param>
193         /// <returns>返回DataReader对象实例</returns>
194         public static SqlDataReader ExecuteReader(string sql)
195         {
196             return ExecuteReader(sql, CommandType.Text, null);
197         }
198 
199         /// <summary>
200         /// 执行查询,并返回一个 DataReader 对象
201         /// </summary>
202         /// <param name="sql">要查询的SQL文本命令或存储过程名称</param>
203         /// <param name="type">要执行的查询语句的类型,存储过程或SQL文本命令</param>
204         /// <returns>返回DataReader对象实例</returns>
205         public static SqlDataReader ExecuteReader(string sql,CommandType type)
206         {
207             return ExecuteReader(sql, type, null);
208         }
209 
210         /// <summary>
211         /// 执行查询,并返回一个 DataReader 对象
212         /// </summary>
213         /// <param name="sql">要查询的SQL文本命令或存储过程名称</param>
214         /// <param name="type">要执行的查询语句的类型,存储过程或SQL文本命令</param>
215         /// <param name="sp">T-SQL语句或存储过程的参数数组</param>
216         /// <returns>返回DataReader对象实例</returns>
217         public static SqlDataReader ExecuteReader(string sql, CommandType type, SqlParameter[] sp)
218         {
219             try
220             {
221                 OpenConnection();
222                 SqlCommand command = new SqlCommand(sql, conn);
223                 command.Parameters.Clear();
224                 if (sp != null)
225                 {
226                     foreach (SqlParameter parameter in sp)
227                     {
228                         command.Parameters.Add(parameter);
229                     }
230                 }
231                 SqlDataReader reader = command.ExecuteReader();
232                 return reader;
233             }
234             catch (Exception ex)
235             {
236                 throw new Exception("ExecuteReader错误:" + ex);
237             }
238             finally
239             {
240                 CloseConnection();
241             }
242         }
243 
244         #endregion
245 }

作者: ForEvErNoME
出处: http://www.cnblogs.com/ForEvErNoME/
欢迎转载或分享,但请务必声明文章出处。如果文章对您有帮助,希望你能 推荐关注

转载于:https://www.cnblogs.com/ForEvErNoME/archive/2012/05/23/2475742.html

相关文章:

MVC-前台调用后台action 传递upload file 参数问题

在后台获取upload file 数量的时候发现count一直为0&#xff0c;经检查发现了问题 &#xff0c;代码如下&#xff1a; 前台&#xff1a; var data $("#DetailForm").serialize(); $.ajax({ url: Url.Action("SaveRequest", "RegistrationRequest&quo…

Storybook 5.0正式发布:有史以来变化最大的版本\n

Storybook 5.0&#xff08;SB5&#xff09;于近日正式发布&#xff0c;这是目前为止最大的一个版本。新版本的内容包括&#xff1a; 全新的开发者体验&#xff1b;带有主题的组件库&#xff1b;改进的前端插件架构&#xff1b;全新的Storybook网站。 Storybook的进展和未来 Sto…

linux6直连存储挂载磁盘,CentOS7mount网络磁盘的详细步骤

在配置前一定先关闭防火墙systemctl disable firewalldsystemctl stop firewalldsystemctl mask firewalld一.修改iscsi客户端的用户名vi /etc/iscsi/initiatorname.iscsiInitiatorName iqn.************&#xff1b;【注&#xff1a;eg&#xff1a;iqn.2017-09.com.centos:cl…

如何将Java源代码文件的编码从GBK转为UTF-8?

有时候看到有意思的demo&#xff0c;在头痛导入项目的编码和workspace的编码不一样的时候 我试着将 笔记本打开一个类一个类的复制&#xff0c; demo的类比较少的时候 可以忍受&#xff0c;demo的类多的时候 除了靠之外 别无办法 今天再找仿ios样式demo的时候 实在受不了乱码&a…

电子书格式怎么在线转换为PDF格式

电子书格式怎么在线转换为PDF格式&#xff0c;现在很多朋友喜欢用PDF格式的电子书&#xff0c;因为其有纸质书的排版和格局&#xff0c;但实际生活中出现的最多的是TXT等格式的电子书&#xff0c;那如何将其进行转换成PDF格式的呢&#xff0c;下面就由小编来告诉大家转换的解决…

设计模式笔记(18)---迭代器模式(行为型)

Gof定义 提供一种方法顺序访问一个聚合对象中的各个元素&#xff0c; 而又不暴露该对象的内部表示。 动机 在软件构建过程中&#xff0c;集合对象内部结构常常变化各异。但对于这些集合对象&#xff0c;我们希望在不暴露其内部结构的同时&#xff0c;可以让外部客户代码透明地访…

linux卸载mpfr,Red Hat Linux在安装gcc时遇到的问题汇总

找到了一个比较老的RedHatlinux&#xff0c;想要装上apachetomcat。由于是在虚拟机中运行&#xff0c;我想先装一个vmware-tools提高性能。但是安装的过程中我发现竟然找不到gcc。于是我就去网上(] http://www.linuxidc.com/Linux/2009-01/18242.htm 与 http://www.linuxidc.co…

【数据结构】某些难理解点

1 typedef char ListData;2 //表示以后可以用ListData来代替char类型3 4 typedef struct node{ //此处node&#xff0c;只在结构体中出现和使用5 ListData data;6 struct node *link;7 }ListNode; //表示将整个结构体命名为ListNode&#xff0c;也就是说…

利用jQuery实现用户名片小动画

我爱撸码&#xff0c;撸码使我感到快乐&#xff01;大家好&#xff0c;我是Counter。下面给大家介绍利用jQuery实现的小动画&#xff0c;非常的简便&#xff0c;如果有原生js操作的话&#xff0c;那么就不止这么多行了。至于CSS&#xff0c;个人觉得&#xff0c;这边CSS布局也蛮…

Linux二进制导出配置文件,Go打包二进制文件的实现

背景众所周知&#xff0c;go语言可打包成目标平台二进制文件是其一大优势&#xff0c;如此go项目在服务器不需要配置go环境和依赖就可跑起来。操作需求&#xff1a;打包部署到centos7笔者打包环境&#xff1a;mac os方法&#xff1a;进入main.go所在目录&#xff0c;输入如下命…

crud springmvc

实体类&#xff1a;Student.java Java代码 package demo.entity; public class Student { private int id; private String name; private String sex; private String address; public int getId() { r…

从 Flutter 的视频渲染到 App 落地经验

3月23日周六&#xff0c;由 RTC 开发者社区主办的 “RTC Dev Meetup 北京站”如约举行&#xff0c;超过100位求知若渴的开发者参加了活动。来自 LeanCloud、声网 Agora、阿里、美团点评的资深工程师&#xff0c;与他们共同分享了 Flutter 开发中的实践经验。 我们在这里回顾一下…

screen命令

原文链接 screen其实就是linux虚拟终端&#xff0c;你可以用它创建很多虚拟终端&#xff0c;每个终端可以创建1~10个窗口&#xff0c;每个窗口相当于一个linux shell窗口&#xff0c;可以执行的操作和正常shell完全一样。 【终端操作】 &#xff08;需要在物理shell中操作&a…

linux 565显示格式,RGB565转BMP格式 C语言程序

#include#include#include#include"rgb2bmp.h"int RGB2BMP(char *,int ,int ,FILE *);int main(int argc,char *argv[]){double num_tmp 0;FILE *p;/*************** input data ***********filename :RGB数据文件名称nWidth :所生成文件的水平像素n…

Spring Boot @ConfigurationProperties使用指导

1.简介 Spring Boot的一个非常有用的功能是外部化配置&#xff0c;并且可以轻松访问属性文件中定义的属性。 我们现在将详细地探索ConfigurationProperties注释。 2.设置 本文使用相当标准的设置。我们首先在我们的pom.xml中添加spring-boot-starter-parent作为父项&#xff1a…

UVA 10494 - If We Were a Child Again(高精度除法和取余)

题目链接&#xff1a;http://uva.onlinejudge.org/index.php?optioncom_onlinejudge&Itemid8&pageshow_problem&problem1435 这个题做的好没状态。上几天刷的高精度都白刷了啊。。。首先代码除法和取余以前都做过&#xff0c;还要查看以前的代码&#xff0c;模板还…

python显示当前时间

import time time.strftime("%Y%m%d %X", time.localtime()) #当前时区 time.strftime("%Y%m%d %X", time.gmtime(time.time()))#0时区 下面是format字符串的解释&#xff1a; strftime(format[, tuple]) -> string 将指定的struct_time(默认为当前时间…

linux系统 插优盘安装xvidcap,linux下的视频录制软件xvidcap

1.xvidcap简介在linux如果我们想要进行视频录制&#xff0c;那么xvidcap是一个不错的选择。Xvidcap 是一个可将屏幕上的操作过程录制下来并保存为视频的小工具。对于需要制作产品演示和教学的朋友来说&#xff0c;这个屏幕录像机十分实用。Xvidcap 支持生成 avi、mpeg、asf、fl…

ASP.NET Cookie

最经在使用Cookie的过程中遇到了一些疑问&#xff0c;查阅参考MSDN&#xff0c;记录Cookie相关知识点 什么是Cookie Cookie是一小段文本信息&#xff0c;伴随着用于的请求和页面在Web服务器和浏览器之间传递,并将它存储在用户硬盘上的某个文件夹中。Cookie包含每次用户访问站点…

1111 评论

201406114205 陈嘉慧 http://www.cnblogs.com/hui1005039632/ 201406114219 林宇粲 http://www.cnblogs.com/zlcan/ 201406114220 蔡舜 http://www.cnblogs.com/caishun/ 201406114215 林志杰 http://www.cnblogs.com/15linzhijie/ 201406114252 王俊杰 http://www.cnblogs.c…

React 16.8.6 发布,构建用户界面的 JavaScript 库

React 16.8.6 已发布&#xff0c;该版本更新如下&#xff1a; React DOM 修复 useReducer() 中的问题&#xff08;acdlite in #15124&#xff09;修复 Safari DevTools 中的 iframe 警告&#xff08;renanvalentin in #15099&#xff09;若 contextType 设置为 Context.Consume…

linux禁止路由器,FCC 新规可能禁止在 WiFi 路由器安装 OpenWRT

FCC(美国联邦通讯委员会)的新规则可能会禁止在 WiFi 路由器安装 OpenWRT。OpenWrt 类似于 Buildroot 的路由器固件&#xff0c;为嵌入式设备所研发的 Linux 发行版。目前 OpenWrt 已支持多个平台(如 ARM、mips、x86 等)&#xff0c;且提供了许多开源应用程序&#xff01;许多便…

智销功能_Shiro权限框架

Shiro是什么&#xff1f; Spring security 重量级安全框架 Apache shiro 轻量级安全框架 Shiro是一个强大且易用的Java权限框架 四大基石 身份验证&#xff0c;授权&#xff0c;密码学&#xff0c;会话管理 /*** String algorithmName, Object source, Object salt, int hashIt…

ARM、FPGA和DSP的特点和区别是什么?(转)

发布时间&#xff1a;2009-5-8 14:25 发布者&#xff1a;ARM 关键词&#xff1a;DSP, ARM, FPGA, 特点 DSP&#xff08;digital singnal processor&#xff09;是一种独特的微处理器&#xff0c;有自己的完整指令系统&#xff0c;是以数字信号来处理大量信息的器件。一个…

unix to linux,UNIX to Linux 的关键问题都有哪些?

答&#xff1a;针对问题描述有一些不同的观点。1、第一个问题就是应用架构的改造问题&#xff0c;需要支持负载均衡模式。说明&#xff1a;这个不一定需要支持负载均衡模式&#xff0c;首先本身LINUXONE提供多分区架构&#xff0c;不需要改变原有应用系统的部署模式。而且负载均…

MongoDb 查询时常用方法

Query.All("name", "a", "b");//通过多个元素来匹配数组Query.And(Query.EQ("name", "a"), Query.EQ("title", "t"));//同时满足多个条件Query.EQ("name", "a");//等于Query.Exist…

解决Error response from daemon: Get https://registry-1.docker.io/v2/library/hello-world/manifests/

https://blog.csdn.net/quanqxj/article/details/79479943转载于:https://www.cnblogs.com/liuys635/p/10624068.html

从 StarCraft 2 Installer.exe 中提取种子文件

蛋疼的想在 Linux 下下载星际争霸&#xff0c;但是暴雪提供的是 exe 格式的文件&#xff0c;这其实就是个 BT 客户端&#xff0c;但是问题是怎么提取出里面的种子文件呢&#xff0c;经过一番 google 找到了答案。 直接用 Vi 或 Emacs 打开 exe 格式的文件&#xff0c;搜索“d8:…

linux下接口持续集成,部署jenkins持续集成工具

1、Linux安装配置jdk环境1.1、上传到 Linux 服务器&#xff1b;例如&#xff1a;上传至&#xff1a; cd /usr/local1.2、解压&#xff1a;rpm -ivh jdk-8u111-linux-x64.rpm1.3、环境变量配置cd /etc在etc下&#xff0c;找到 profile文件&#xff0c;增加如下如下配置&#xff…

iOS UILabel UITextView自适应文本,或文本大小自适应

//UILabel自适应文本的高度UILabel *label [[UILabel alloc]initWithFrame:CGRectMake(0, 100, 300, 100)];label.numberOfLines 0;label.lineBreakMode NSLineBreakByWordWrapping;label.text "是它吗&#xff1f;哈哈&#xff0c;太兴奋了。”12日&#xff0c;随着土…