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 语句,返回值为该命令所影响的行数。对于所有其 |
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对象里面的几个方法很重要,基本上可以实现数据库的增删改查操作,在封装方法时,应该注意方法的重载。
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 }