C#中ExecuteReader、ExecuteNonQuery、ExecuteScalar、SqlDataReader、SqlDataAdapter和DataTable的使用

一、數據庫連接字符串
    private readonly static string connectionString =  ConfigurationManager.ConnectionStrings["MyConnection"].ToString(); //web.config中配置連接語句

二、ExecuteNonQuery:執行增,刪,改的方法,支持存儲過程

[html] view plain copy
  1. /// 連接字符串,自滿足,請用SqlHelper.connString賦值  
  2. /// 參數1:命令類型,如果是sql語句,則爲CommandType.Text,否則爲   CommandType.StoredProcdure  
  3. /// 參數2:SQL語句或者存儲過程名稱  
  4. /// 參數3:SQL參數,如果沒有參數,則爲null  
  5. /// 返回:受影響的行數  
  6. public static int ExecuteNonQuery(CommandType commandType, string cmdText, params SqlParameter[] para)  
  7. {  
  8.     using (SqlConnection conn = new SqlConnection(connectionString))  
  9.     {  
  10.         SqlCommand cmd = new SqlCommand();  
  11.         cmd.Connection = conn;  
  12.         cmd.CommandType = commandType;  
  13.         cmd.CommandText = cmdText;  
  14.         if (para != null)  
  15.         {  
  16.             cmd.Parameters.AddRange(para);  
  17.         }  
  18.         conn.Open();  
  19.         return Convert.ToInt32(cmd.ExecuteNonQuery());  
  20.     }  
  21. }  
注:1、ExecuteNonQuery()執行命令對象的SQL語句,返回一個int 類型的變量,返回數據庫操作之後影響的行數。適合用來驗證對數據庫進行增刪改的情況。
        2、ExecuteScalar()也返回一個int型變量。如果SQL語句是Select查詢,則僅僅返回查詢結果集中第一行第一列,而忽略其他行和列。如果SQL語句不是Select查詢,則這個返回結果沒任何作用。(建議查詢數據庫時使用)。由於不知道SQL語句到底是什麼樣的結構(有可能是int,有可能是Char等其它,)所以ExecuteScalar()方法返回一個最基本的類型Object,這個類型是所有類型的基類,可以轉換爲任意類型,所以用前需強制轉換。

三、GetScalar:執行查詢的方法,支持存儲過程
    /// 參數1:命令類型,如果是sql語句,則爲CommandType.Text,否則爲   CommandType.StoredProcdure
    /// 參數2:SQL語句或者存儲過程名稱
    /// 參數3:SQL參數,如果沒有參數,則爲null 
    /// 返回:查詢結果的第一行第一列

[html] view plain copy
  1. <pre name="code" class="html">    public static object GetScalar(CommandType commandType, string cmdText, params SqlParameter[] para)  
  2.     {  
  3.         object result = null;  
  4.         using (SqlConnection conn = new SqlConnection(connectionString))  
  5.         {  
  6.             SqlCommand cmd = new SqlCommand();  
  7.             cmd.Connection = conn;  
  8.             cmd.CommandType = commandType;  
  9.             cmd.CommandText = cmdText;  
  10.             if (para != null)  
  11.             {  
  12.                 cmd.Parameters.AddRange(para);  
  13.             }  
  14.             conn.Open();  
  15.             result = cmd.ExecuteScalar();  
  16.         }  
  17.         return result;  
  18.     }  
  19. }  


四、ExecuteReader:執行查詢的方法,支持存儲過程      /// 參數1:命令類型,如果是sql語句,則爲CommandType.Text,否則爲   CommandType.StoredProcdure    /// 參數2:SQL語句或者存儲過程名稱    /// 參數3:SQL參數,如果沒有參數,則爲null     /// 返回:讀取器SqlDataReader
[html] view plain copy
  1. <pre name="code" class="html">    public static SqlDataReader ExecuteReader(CommandType commandType, string cmdText, params SqlParameter[] para)  
  2.     {  
  3.         SqlConnection conn = new SqlConnection(connectionString);  
  4.         SqlDataReader dr = null;  
  5.         SqlCommand cmd = new SqlCommand();  
  6.         cmd.Connection = conn;  
  7.         cmd.CommandType = commandType;  
  8.         cmd.CommandText = cmdText;  
  9.         if (para != null)  
  10.         {  
  11.             cmd.Parameters.AddRange(para);  
  12.         }  
  13.         conn.Open();  
  14.         dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);  
  15.         return dr;  

注:1、ExecuteReader方法存在的目的:儘可能快的對數據庫進行查詢並得到結果    2、ExecuteReader 返回一個DataReader對象,如果在SqlCommand對象中調用,則返回SqlDataReader;如果在OledbCommand對象中調用,返回的是OledbDataReader,可以調用DataReader的方法和屬性迭代處理結果集。五、GetDataSet:執行查詢的方法,支持存儲過程  
  /// 參數1:命令類型,如果是sql語句,則爲CommandType.Text,否則爲CommandType.StoredProcdure    /// 參數2:SQL語句或者存儲過程名稱    /// 參數3:SQL參數,如果沒有參數,則爲null     /// 返回:數據集
[html] view plain copy
  1. public static DataSet GetDataSet(CommandType commandType, string cmdText, params SqlParameter[] para)  
  2. {  
  3.     using (SqlConnection conn = new SqlConnection(connectionString))  
  4.     {  
  5.         SqlDataAdapter da = new SqlDataAdapter();  
  6.         da.SelectCommand = new SqlCommand();  
  7.         da.SelectCommand.Connection = conn;  
  8.         da.SelectCommand.CommandText = cmdText;  
  9.         da.SelectCommand.CommandType = commandType;  
  10.         if (para != null)  
  11.         {  
  12.             da.SelectCommand.Parameters.AddRange(para);  
  13.         }  
  14.         DataSet  ds = new DataSet();  
  15.         conn.Open();  
  16.         da.Fill(ds);  
  17.         return ds;  
  18.     }  
  19. }  


六、SqlDataReader與SqlDataAdapter+DataSet的區別
1、SqlDataReader //基於連接,只讀訪問,適合數據量較小。(連接模式)
   SqlDataAdapter //基於非連接,適於數據量較大時,可以另行修改,最後再把修改結果返回給數據庫。要求資源也大一點  (斷開模式)
2、SqlDataAdapter 讀取數據後將數據集放入DataSet,DataSet 的數據存在本地客服機內存。
3、SqlDataReader返回的是一個數據讀寫器,只能一條條的讀,操作起來不靈活,一般在只讀的時候纔用到。
   SqlDataAdapter返回的是數據集或者表,可以對其中的數據作任意操作
4、寫法上不同:
     (1)SqlDatReader執行前須先打開數據庫,然後鬚生成一個command對象。再由command.ExecuteReader()方法賦值。完成後須手動關閉聯接。
[html] view plain copy
  1. SqlCommand cmd = new SqlCommand("select * from stu", conn);  
  2.        conn.Open();  
  3.        SqlDataReader rdr = cmd.ExecuteReader();  
  4.        ..................  
  5.        conn.close();  
     (2)SqlDataAdapter 執行時,自動打開數據庫,且不用Command的ExecuteReader方法進行賦值,完成後自動斷開聯接。
[html] view plain copy
  1. SqlDataAdapter adptr = new SqlDataAdapter(sql, conn);  
  2. DataSet ds = new DataSet();  
  3. adptr.Fill(ds, "stu");<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">  </span>  

七、實例:

1、運用SqlDataReader 讀取數據
[html] view plain copy
  1. class DataReader  
  2. {  
  3.     static void Main()  
  4.     {  
  5.         string str = "server=localhost;uid=sa;pwd=123;database=northwind";  
  6.         SqlConnection conn = new SqlConnection(str);  
  7.         SqlCommand cmd = new SqlCommand("select * from stu", conn);  
  8.         conn.Open();  
  9.         SqlDataReader rdr = cmd.ExecuteReader();  
  10.          DataTable table=new Datable();  
  11.         table.Load(rdr);  
  12.          rdr.Close();  
  13.         conn.Close();  
  14.     }  
  15. }  
2、運用SqlDataAdapter +DataSet 讀取修改數據
[html] view plain copy
  1. class SqlDataAdapter  
  2. {  
  3.     static void Main()  
  4.     {  
  5.         string str = "server=localhost;uid=sa;pwd=123;database=northwind";  
  6.         SqlConnection conn = new SqlConnection(str);  
  7.         string sql = "select * from stu";  
  8.         SqlDataAdapter adptr = new SqlDataAdapter(sql, conn);//Adepter對象  
  9.         DataSet ds = new DataSet();//DataSet對象  
  10.         adptr.Fill(ds, "stu");//填充DataSet 併爲當前表命名  
  11.         DataTableReader rdr = ds.CreateDataReader();  
  12.         while (rdr.Read())//讀取表中數據  
  13.         {  
  14.             for (int i = 0; i < rdr.FieldCount; i++)  
  15.             {  
  16.                 Console.Write(rdr.GetName(i) + "\t" + rdr.GetValue(i) + "\t");  
  17.             }  
  18.             Console.WriteLine();  
  19.         }  
  20.     }  
  21.  }  

 八、DataTable的使用

http://holysonll.blog.163.com/blog/static/214139093201352011491680/

[html] view plain copy
  1.      /// <summary>  
  2.      /// 獲取車輛數據:車輛數和運力  
  3.      /// </summary>  
  4.      /// <returns></returns>  
  5.      public IList<RoadTransData> GetVehicleData()  
  6.      {  
  7.          StringBuilder sb = new StringBuilder();  
  8.          sb.Append(" select 'data1_Pass' as dataTitle, COUNT(*) as vehicleNum ,SUM(PassengerSeats) as apprLoadMass ");  
  9.          sb.Append(" from RT_VehiclePassenger A, RT_Vehicle V ");  
  10.          sb.Append(" where A.VehicleId = V.VehicleId and V.CertState =1 ");  
  11.          sb.Append(" UNION ");  
  12.          sb.Append(" select 'data2_Goods' as dataTitle, COUNT(*) as vehicleNum ,SUM(A.ApprLoadMass) as apprLoadMass ");  
  13.          sb.Append(" from RT_VehicleGoods A, RT_Vehicle V ");  
  14.          sb.Append(" where A.VehicleId = V.VehicleId and V.CertState =1 ");  
  15.   
  16.          CommonService cs = new CommonService();  
  17.          DataTable dt = cs.GetDataTableBySQL(sb.ToString());  
  18.   
  19.          IList<RoadTransData> lstRoadTransData = new List<RoadTransData>();  
  20.             
  21.          for (int i = 0; i < dt.Rows.Count; i++)  
  22. {  
  23.              RoadTransData objRoadTransData = new RoadTransData();  
  24.              objRoadTransData.RptName = dt.Rows[i][0].ToString();  
  25.              objRoadTransData.Data1 = dt.Rows[i][1] == null ? 0 : Convert.ToDouble(dt.Rows[i][1].ToString());  
  26.              objRoadTransData.Data2 = dt.Rows[i][2] == null ? 0 : Convert.ToDouble(dt.Rows[i][2].ToString());  
  27.              lstRoadTransData.Add(objRoadTransData);  
  28. }   
  29.              
  30.          return lstRoadTransData;  
  31.      }  
發佈了3 篇原創文章 · 獲贊 36 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章