zoukankan      html  css  js  c++  java
  • ADO.NET系列之Command对象

    上一篇《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,50),
                            new SqlParameter("@loginname",SqlDbType.NVarChar,50)
                        };
                        paras[0].Value = "2";
                        paras[1].Value = "222";
                        SqlCommand com = new SqlCommand(sql, con);
                        com.Parameters.AddRange(paras);
                        int rows = com.ExecuteNonQuery();
                        if (rows > 0)
                            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,50),
                            new SqlParameter("@id",SqlDbType.Int)
                        };
                        paras[0].Value = "abc";
                        paras[1].Value = 1;
                        SqlCommand com = new SqlCommand(sql, con);
                        com.Parameters.AddRange(paras);
                        int rows = com.ExecuteNonQuery();
                        if (rows > 0)
                            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[0].Value =1;
                        SqlCommand com = new SqlCommand(sql, con);
                        com.Parameters.AddRange(paras);
                        int rows = com.ExecuteNonQuery();
                        if (rows > 0)
                            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[0], dreader[1], dreader[2]));
                    }
                    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大同小异,大家可以自己研究下。

  • 相关阅读:
    查看mysql版本的四种方法及常用命令
    newInstance和new的区别(good)
    Citrix 服务器虚拟化之六 Xenserver虚拟机创建与快照
    Java实现 蓝桥杯 算法训练 排序
    Java实现 蓝桥杯 算法训练 排序
    Java实现 蓝桥杯 算法训练 排序
    Java实现 蓝桥杯 算法训练 2的次幂表示
    Java实现 蓝桥杯 算法训练 2的次幂表示
    Java实现 蓝桥杯 算法训练 前缀表达式
    Java实现 蓝桥杯 算法训练 前缀表达式
  • 原文地址:https://www.cnblogs.com/zyh000/p/10254948.html
Copyright © 2011-2022 走看看