上一篇《ADO.NET系列之Connection对象》简单介绍了ADO.NET的概念以及Connection对象的方法属性和使用方法,这篇我们将介绍ADO.NET中另一个重要的对象:Command

Command对象

   ADO.NET主要的作用就是供我们对数据源统一的访问方式,对数据源的增删改查操作,Connection对象只是给我们建立了一个连接数据源的通道,但是要执行什么操作应该怎么办呢? 这个时候就要用到Command对象了。跟Connection一样,不同的数据源,ADO.NET提供了不同的Command对象。所有Command对象都是继承于DbCommand基类。DbCommand位于命名空间:System.Data.Common,同样.NET提供了四种Command对象:

  1. 针对Sql Server的SqlCommand,位于命名空间System.Data.SqlClient下
  2. 针对Oledb链接的OledbCommand,位于命名空间System.Data.Oledb下
  3. 针对MySql的MySqlCommand,位于命名空间System.Data.MySqlClient下(需要引用MySql.Data.dll)
  4. 针对Oracle的OracleCommand,位于命名空间Oracle.ManagedDataAccess.Client(需引用Oracle.ManagedDataAccess.dll)

Command对象几个常用的方法:

  • ExecuteNonQuery():        对连接执行 Transact-SQL 语句并返回受影响的行数。返回结果:受影响的行数。
  • ExecuteScalar():              执行查询,并返回查询所返回的结果集中第一行的第一列。忽略其他列或行.返回结果:结果集中第一行的第一列.
  • ExecuteReader():             生成一个 System.Data.SqlClient.SqlDataReader对象

下面我们以示例的方式解读下这几个方法的使用和作用。

ExecuteNonQuery:

根据上面的意思我们可以发现ExecuteNonQuery()方法可以执行对数据库增删改的操作,ExecuteNonQuery()示例如下:

 //添加操作
string connectionString = "Data Source=.;Initial Catalog=ax_log;User Id=sa;Password=sa123;";
using (SqlConnection con = new SqlConnection(connectionString))
{
try
{
con.Open();
string sql = "insert into table values(@name,@loginname)";
SqlParameter[] paras = new SqlParameter[] {
new SqlParameter("@name",SqlDbType.NVarChar,),
new SqlParameter("@loginname",SqlDbType.NVarChar,)
};
paras[].Value = "";
paras[].Value = "";
SqlCommand com = new SqlCommand(sql, con);
com.Parameters.AddRange(paras);
int rows = com.ExecuteNonQuery();
if (rows > )
Console.WriteLine("添加数据成功");
}
catch (SqlException ex)
{
Console.WriteLine("添加过程中出现错误:" + ex.Message);
}
}

SqlParameter表示 System.Data.SqlClient.SqlCommand 的参数,我们这行学习ADO.NET的时候老师一而再再而三强调的就是SQL语句中的参数千万不要拼装成SQL语句字符串,要记得使用参数对象来传递参数,因为直接拼装存在注入危险,具体的什么危险,咱们下面查询的时候再讨论。

SqlParameter就是执行SqlCommand命令过程中需要的参数。

 //修改操作
string connectionString = "Data Source=.;Initial Catalog=ax_log;User Id=sa;Password=sa123;";
using (SqlConnection con = new SqlConnection(connectionString))
{
try
{
con.Open();
string sql = "update table set name=@name where id=@id";
SqlParameter[] paras = new SqlParameter[] {
new SqlParameter("@name",SqlDbType.NVarChar,),
new SqlParameter("@id",SqlDbType.Int)
};
paras[].Value = "abc";
paras[].Value = ;
SqlCommand com = new SqlCommand(sql, con);
com.Parameters.AddRange(paras);
int rows = com.ExecuteNonQuery();
if (rows > )
Console.WriteLine("修改数据成功");
}
catch (SqlException ex)
{
Console.WriteLine("修改过程中出现错误:" + ex.Message);
}
}
 //删除操作
string connectionString = "Data Source=.;Initial Catalog=ax_log;User Id=sa;Password=sa123;";
using (SqlConnection con = new SqlConnection(connectionString))
{
try
{
con.Open();
string sql = "delete table where id=@id";
SqlParameter[] paras = new SqlParameter[] {
new SqlParameter("@id",SqlDbType.Int)
};
paras[].Value =;
SqlCommand com = new SqlCommand(sql, con);
com.Parameters.AddRange(paras);
int rows = com.ExecuteNonQuery();
if (rows > )
Console.WriteLine("删除数据成功");
}
catch (SqlException ex)
{
Console.WriteLine("删除过程中出现错误:" + ex.Message);
}
}

 ExecuteScalar:

ExecuteScalar: 执行查询,并返回查询所返回的结果集中第一行的第一列。忽略其他列或行.返回结果:结果集中第一行的第一列。比如我们查询表中数据量的行数就可以使用ExecuteScalar。

            string connectionString = "Data Source=.;Initial Catalog=ax_log;User Id=sa;Password=sa123;";
using (SqlConnection con = new SqlConnection(connectionString))
{
try
{
con.Open();
string sql = "select count(1) from table ";
SqlCommand com = new SqlCommand(sql, con);
object rows = com.ExecuteScalar();
Console.WriteLine("查询表中共{0}条数据",rows);
}
catch (SqlException ex)
{
Console.WriteLine("查询过程中出现错误:" + ex.Message);
}
}

 ExecuteReader:

查询数据select的时候我们可以使用ExecuteReader()方法,ExcuteReader方法返回一个DataReader对象,

   DataReader是一个快速的,轻量级,只读的遍历访问每一行数据的数据流。使用DataReader时,需要注意以下几点:

  • DataReader一次遍历一行数据,并返回一个包含列名字集合。
  • 第一次调用Read()方法获取第一行数据,并将游标指向下一行数据。当再次调用该方法时候,将读取下一行数据。
  • 当检测到不再有数据行时,Read()方法将返回false。
  • 通过HasRows属性,我们知道查询结果中是否有数据行。
  • 当我们使用完DataReader时,一定要注意关闭。SQL Server默认只允许打开一个DataReader
 string connectionString = "Data Source=.;Initial Catalog=ax_log;User Id=sa;Password=sa123;";
using (SqlConnection con = new SqlConnection(connectionString))
{
con.Open();
string sql = "select id,name,loginname from table";
SqlCommand com = new SqlCommand(sql, con);
SqlDataReader dreader = com.ExecuteReader(CommandBehavior.CloseConnection);
while (dreader.Read())
{
Console.WriteLine(String.Format("{0}, {1},{2}",dreader[], dreader[], dreader[]));
}
dreader.Close();
}

在这介绍一个SqlDataReader 的GetOrdinal方法:在给定列名称的情况下获取列序号。上面的示例我们也可以这样:

  string connectionString = "Data Source=.;Initial Catalog=ax_log;User Id=sa;Password=sa123;";
using (SqlConnection con = new SqlConnection(connectionString))
{
con.Open();
string sql = "select id,name,loginname from table";
SqlCommand com = new SqlCommand(sql, con);
SqlDataReader dreader = com.ExecuteReader(CommandBehavior.CloseConnection);
int id = dreader.GetOrdinal("id");
int nameid = dreader.GetOrdinal("name");
int loginnameid = dreader.GetOrdinal("loginname");
while (dreader.Read())
{
Console.WriteLine(String.Format("{0}, {1},{2}",dreader[id], dreader[nameid], dreader[loginnameid]));
}
dreader.Close();
}

总结:本文只是介绍了SqlCommand的用法,还有OledbCommand,MySqlCommand,OracleCommand对象,使用起来跟SqlCommand大同小异,大家可以自己研究下。

ADO.NET系列之Command对象的更多相关文章

  1. ADO.NET系列之Connection对象

    ADO.NET系列之Connection对象 ADO.NET系列之Command对象 ADO.NET系列之DataAdapter对象 ADO.NET系列之事务和调用存储过程 ADO.NET概念 ADO ...

  2. ADO.NET系列之DataAdapter对象

    ADO.NET系列之Connection对象 ADO.NET系列之Command对象 ADO.NET系列之DataAdapter对象 ADO.NET系列之事务和调用存储过程 我们前两篇文章介绍了ADO ...

  3. ADO.NET笔记——利用Command对象的ExecuteScalar()方法返回一个数据值

    相关知识: 有些SQL操作,例如SUM,只会从数据库返回一个数据值,而不是多行数据 尽管也可以使用ExecuteReader()返回一个DataReader对象,代表该数据值,但是使用Command对 ...

  4. ADO.NET系列之事务和调用存储过程

    ADO.NET系列之Connection对象 ADO.NET系列之Command对象 ADO.NET系列之DataAdapter对象 ADO.NET系列之事务和调用存储过程 前几篇我们介绍了Conne ...

  5. ADO中最重要的对象有三个:Connection、Recordset和Command

    ConnectionPtr: _ConnectionPtr m_pConnection; HRESULT hr; try{ hr = m_pConnection.CreateInstance(_uui ...

  6. ADO.NET中COMMAND对象的ExecuteNonQuery、ExcuteReader和ExecuteScalar方法

    1.ExecuteNonQuery方法.该方法执行更新操作,即与UPDATE.INSERT.DELETE等语句有关的操作,在这种情况下,返回值是命令影响的行数.对其他语句,如SET或CREATE,则返 ...

  7. ADO.NET基础学习 二(Command对象)

    ②command对象用来操作数据库.(三个重要的方法:ExecuteNonQuery(),ExecuteReader(),ExecuteScalar()) ⑴以update(改数据)为例,用到Exec ...

  8. ADO.net中常用的对象介绍

    ADO.NET的对象主要包括:DataSet,DataTable,DataColumn,DataRow,和DataRelation. DataSet:这个对象是一个集合对象,它可以包含任意数量的数据表 ...

  9. 017. ADO.NET Connection和command及DataReader

    ADO.NET主要包括Connection , command , DataReader, DataSet, DataAdapter5个对象, 通过这5个对象可以对数据库进行查询, 添加, 修改及删除 ...

随机推荐

  1. Metropolis(多源点最短路)

    Metropolis https://www.nowcoder.com/acm/contest/203/I 题目描述 魔方国有n座城市,编号为.城市之间通过n-1条无向道路连接,形成一个树形结构. 在 ...

  2. C++,坑...

    如果使用const全局变量,记得声明处的引用处都加extern. uint32_t等,t代表是typedef的,在stdint.h头文件里,C99后引入,记得先测试再用. accept函数的参数,记得 ...

  3. TIME_WAIT状态的作用

    TIME_WAIT状态: 主动关闭的那端最后经历的状态,一般为2MSL秒(1~4分钟). 两个原因: 保证当最后一个ack丢失后,能收到对端重传的fin包. 保证ack包消失,不会影响下一个连接. 关 ...

  4. 带环链表 linked list cycle

    1 [抄题]: 给定一个链表,判断它是否有环. [思维问题]: 反而不知道没有环怎么写了:快指针fast(奇数个元素)或fast.next(偶数个元素) == null [一句话思路]: 快指针走2步 ...

  5. win下php的memcached的安装与使用

    1.memcache的php扩展与memcached服务器的区别? php要操作memcached就必须要安装memcache的扩展, 在http://windows.php.net/download ...

  6. 基于Jenkins的持续集成CI

    CI(continuous integration)持续集成 一次构建:可能包含编译,测试,审查和部署,以及其他一些事情,一次构建就是将源代码放在一起,并验证软件是否可以作为一个一致的单元运行的过程. ...

  7. Spring框架之log日志的使用

    1.Spring框架也需要引入日志相关的jar包 * 在spring-framework-3.0.2.RELEASE-dependencies/org.apache.commons/com.sprin ...

  8. 【原创】Silverlight的ComboBox.SelectValue无法赋值

      前几天开发中 给ComboBox的SelectValue属性赋值是,老是赋不上去.之前SelectValue为Null,执行完调试看下,还是Null.很诡异   ComboBox的SelectVa ...

  9. 转 git push 提示 Everything up-to-date

    git 还没有分支,需要指定一个($ git remote -v),就可以push了 第一步:$ git remote -v 第二步:$ git branch 转载链接: http://blog.cs ...

  10. PAT 1072 开学寄语(20)(代码+思路)

    1072 开学寄语(20 分) 下图是上海某校的新学期开学寄语:天将降大任于斯人也,必先删其微博,卸其 QQ,封其电脑,夺其手机,收其 ipad,断其 wifi,使其百无聊赖,然后,净面.理发.整衣, ...