ADO.NET 基础

 转自:http://www.cnblogs.com/tangge/archive/2012/09/06/2674166.html#C

 

image

 

1.如果要执行增删改和单个值查询的时候,可以直接让【车间工人】去【中央仓库】做。 
2.如果要从【中央仓库】查询多行货物的时候,有两种方式: 
  2.1可以选择叫一辆【货运卡车】去搬,卡车可以一次性的都搬过来,但【生产车间】一下子用不了,所以卡车就把货先放在【车间临时仓库】,这样车间需要的时候直接拿就可以了。 
  2.2可以让【车间工人】把自己的【摩托车】拿来,骑【摩托车】去仓库拿货,但每次只能拿一行货物,所以需要往返的拿很多次才能拿完。但因为每次只拿一行货物过来,车间就直接使用了,不必存到【车间临时仓库】里。

image

 

 

 

1.SqlCommand-执行增删改

image

例题:

static void Main(string[] args)
        {
            Console.WriteLine("增加数据:");
            string ss = Convert.ToString(Console.ReadLine());//字符串使用Console.ReadLine()
            AddRecord(ss);
        }

        public static void AddRecord(string Test)
        {
            int res  = -1; //准别接收新增受影响行数
           
string sqlCon = @"Server=.\SQLEXPRESS;database=tangsansan;uid=sa;pwd=sa";
            SqlConnection conn = newSqlConnection();
            conn.ConnectionString = sqlCon;
            string sqlstr = "insert into T_Category(FName) values ('"+ Test + "')";//values里面的string值需要''
          
SqlCommand cmd = newSqlCommand(sqlstr,conn);
            conn.Open();
            res = cmd.ExecuteNonQuery(); //负责返回受影响行数
           
conn.Close(); if(res>0)
            {
                Console.WriteLine("新增成功!~~");
            }
            else
          
{
                Console.WriteLine("失败啦!");
            }
          
        }

 

imageimage

 

 

2.SqlCommand-查询单个值(ExecuteScalar)

image

SqlCommand的ExecuteScalar方法用于执行查询,并返回查询所返回的结果集中第一行的第一列,因为不能确定返回值的类型,所以返回值是object类型

md.CommandText = "select count(*) from T_Users"; int i = Convert.ToInt32(cmd.ExecuteScalar()) 
cmd.CommandText = "select getdate()"; DateTime dt = Convert.ToDateTime(cmd.ExecuteScalar());

例题

static void Main(string[] args)
        {
            //Console.WriteLine("增加数据:");
            //string ss = Convert.ToString(Console.ReadLine());//字符串使用Console.ReadLine()
            //AddRecord(ss);

            QuerySingle();
        }

        //查询单个值
        public static void QuerySingle()
        {
            SqlConnection conn = new SqlConnection(sqlCon);
            string sqlstr = "select COUNT(*) from  T_Category";
            SqlCommand cmd = new SqlCommand(sqlstr, conn);
            conn.Open();
            //用于执行查询,并返回查询所返回的结果集中第一行的第一列
            object obj = cmd.ExecuteScalar();
            conn.Close();
            Console.WriteLine(obj.ToString());
        }

imageimage

 

 

3.SqlCommand-查询多行(ExecuteReader)

image

属性 说明
HasRows

是否返回了结果

方法

说明

Read 前进到下一行记录
Close

关闭 DataReader 对象

执行查询

执行有多行结果集的用ExecuteReader

  • SqlDataReader reader = cmd.ExecuteReader();...

      while (reader.Read()) 
      {

           Console.WriteLine(reader.GetString(1)); 
      }

  • reader的GetString、GetInt32等方法只接受整数参数,也就是序号,用GetOrdinal方法根据列名动态得到序号
  • 为什么用using。Close:关闭以后还能打开。Dispose:直接销毁,不能再次使用。using在出了作用域以后调用Dispose,SqlConnection、FileStream等的Dispose内部都会做这样的判断:判断有没有close,如果没有Close就先Close再Dispose。

例题:

static void Main(string[] args)
        {
            //Console.WriteLine("增加数据:");
            //string ss = Convert.ToString(Console.ReadLine());//字符串使用Console.ReadLine()
            //AddRecord(ss);

            //QuerySingle();
            QueryList();
        }

        //查询多个值--DataReader,逐行读取
        public static void QueryList()
        {
            SqlConnection conn = new SqlConnection(sqlCon);
            string sqlstr = "select * from  T_Category";
            SqlCommand cmd = new SqlCommand(sqlstr, conn);
            conn.Open();
            //获取一个读取器对象           
        SqlDataReader dr = cmd.ExecuteReader();
            if (dr.HasRows)
            {
                while (dr.Read())
                {
                    //Console.WriteLine(dr[0].ToString() + " " + dr[1].ToString());
                    Console.WriteLine(dr["FId"].ToString() + " " + dr["FName"].ToString());
                }
            }
            else
            {
                Console.WriteLine("无属性");
            }
            dr.Close();//关闭读取器
            conn.Close();
        }

image

 

 

4.SqlDataAdapter&数据集-查询多行

image

DataSet

      SqlDataReader是连接相关的, SqlDataReader中的查询结果并不是放到程序中的,而是放在数据库服务器中,SqlDataReader只是相当于放了一个指针(游标),只能读取当前游标指向的行,一旦连接断开就不能再读取。这样做的好处就是无论查询结果有多少条,对程序占用的内存都几乎没有影响。 
      SqlDataReader对于小数据量的数据来说带来的只有麻烦,优点可以忽略不计。ADO.Net中提供了数据集的机制,将查询结果填充到本地内存中,这样连接断开、服务器断开都不影响数据的读取。 
      DataSet dataset = new DataSet(); SqlDataAdapter adapter = new SqlDataAdapter(cmd); adapter.Fill(dataset); 
      SqlDataAdapter是DataSet和数据库之间沟通的桥梁。数据集DataSet包含若干表DataTable,DataTable包含若干行DataRow。foreach (DataRow row in dataset.Tables[0].Rows)             row["Name"]。

例题:

//适配器读取Adapter
        public static void QueryListByAdapter()
        {
            SqlConnection conn = new SqlConnection(sqlCon);
            string sqlstr = "select * from  T_Category";
            //创建适配器对象,告诉它要做什么事情,走哪条路
            SqlDataAdapter adapter = new SqlDataAdapter(sqlstr, conn);
            //创建数据集对象(程序段的临时数据表)
            DataSet ds = new DataSet();
            //调用Fill填充数据集
            adapter.Fill(ds);
            DataTable dt = ds.Tables[0];
            //循环表中的每一行
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                DataRow dr = dt.Rows[i];//将循环的行赋值给dr对象
                Console.WriteLine(dr[0].ToString()+" "+dr[1].ToString());
            }
        }

image

原文地址:https://www.cnblogs.com/Jenny90/p/3018552.html