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大同小异,大家可以自己研究下。

  • 相关阅读:
    关闭当前的子窗口,刷新父窗口,弹出层提示框
    让一个div层于窗口中间位置
    一些技术贴,留待以后研究
    什么才是程序员的核心竞争力?
    自己喜欢的编辑器字体设置
    Ajax请求状态200,却走error的函数
    20141110的alltosun面试
    匹配中文的正则表达式
    数据表损坏:Incorrect key file for table
    oracle union 和 union all
  • 原文地址:https://www.cnblogs.com/zyh000/p/10254948.html
Copyright © 2011-2022 走看看