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


    1.Command对象基础

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

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

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

    名称 命名空间 描述
    SqlCommand System.Data.SqlClient 表示与SQL Server的操作对象
    OleDbCommand System.Data.OleDb 表示与OleDb数据源的操作对象
    OdbcCommand System.Data.Odbc 表示与ODBC数据源的操作对象
    OracleCommand System.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/
    欢迎转载或分享,但请务必声明文章出处。如果文章对您有帮助,希望你能 推荐关注
     
     
     
     
     
  • 相关阅读:
    卷积神经网路计算公式
    Jupyter Notebook
    vim batch copy -- copy between row1 and row2 to row3
    Intellij 快速复制单行快捷键
    Exception in thread "main" java.lang.NoClassDefFoundError: com/mchange/v2/ser/Indirector
    Mac 下查看隐藏文件
    Mac 连接 mysql
    CC++JavaPython 求字符串长度
    LeetCode-1309 Decrypt String from Alphabet to Integer Mapping
    ❀LeetCode❀-1374. Generate a String With Characters That Have Odd Counts
  • 原文地址:https://www.cnblogs.com/ForEvErNoME/p/2475742.html
Copyright © 2020-2023  润新知