国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#連接數據庫的方法

2019-10-29 21:36:55
字體:
來源:轉載
供稿:網友
ASP.NET連接數據庫的技術叫ADO.NET,它是用來向數據庫提交sql語句的一堆類。這里連接的是Sql Server 2008數據庫,其他數據庫用法差不多,就是調用的類名不一樣
 

以下內容給大家c#連接數據庫的方法的相關介紹,本文非常具有參考借鑒價值,具體詳情如下所示。

ASP.NET連接數據庫的技術叫ADO.NET,它是用來向數據庫提交sql語句的一堆類。這里連接的是Sql Server 2008數據庫,其他數據庫用法差不多,就是調用的類名不一樣。

    首先在Web.config(本地的添加應用程序配置文件App.config,本地還要添加System.Configuration.dll程序集)上配置數據庫連接字符串,添加如下節點代碼:
 

  1. <connectionStrings> 
  2.  <add name="connstr" connectionString="Data Source=.;Initial Catalog=Milk ;User Id=sa;Password=521521521;"></add> 
  3.  </connectionStrings> 
?

    name是鏈接字符串名稱,可以隨便取。connectionString是鏈接字符串。Data Source數據庫所在服務器IP地址,這里是本地寫“.”。 Initial Catalog是數據庫名稱。User Id是數據庫用戶,其中sa是最高權限管理員賬戶,需要謹慎使用,而是針對數據庫建立數據庫的專用受限賬戶。Password是密碼。

    程序使用數據庫時,先提取配置文件的連接字符串賦值給一個變量。代碼如下:
 

  1. public static readonly string connstr = 
  2. ConfigurationManager.ConnectionStrings["connstr"].ConnectionString; 
?

ConfigurationManager是靜態類,提供對客戶端應用程序配置文件的訪問。

    接著打開數據庫連接,使用完畢后用using自動釋放連接:

SqlConnection是個密封類,表示 SQL Server 數據庫的一個打開的連接。接著是執行SQL語句,先定義向數據庫發送指令用到的SqlCommand類,定義之后確定語句執行的連接對象是conn,再確定要執行的SQL語句,用法舉例如下:
 

  1. //SqlConnection為建立和數據庫連接的對象 
  2. using(SqlConnection conn = new SqlConnection(connstr)) 
  3. conn.Open();//打開連接 
  4. //通過連接創建一個向數據庫發命令(Command)的對象SqlCommand 
  5. using(SqlCommand cmd = conn.CreateCommand()) 
  6. cmd.CommandText =”Insert into T_Student*(Name,Age) values(‘XXX',18)”;// CommandText要執行的SQL語句 
  7. cmd.ExecuteNonQuery();//執行 
?

ExecuteNonQuery()一般用來執行Update、Delete、Insert語句

對于一種一行、一列返回值的結果執行用ExecuteScalar(),它返回object類型。舉例如下:
 

  1. using(SqlConnection conn = new SqlConnection(connstr)) 
  2. conn.Open();//打開連接 
  3. //通過連接創建一個向數據庫發命令(Command)的對象SqlCommand 
  4. using(SqlCommand cmd = conn.CreateCommand()) 
  5. cmd.CommandText =”select Name from T_Student where Name=”XXX””;// CommandText要執行的SQL語句 
  6. cmd.ExecuteScalar();//執行 
?

返回值有多行結果時要用ExecuteReader(),返回類型SqlDataReader,需要釋放,用法舉例:
 

  1. using(SqlConnection conn = new SqlConnection(connstr)) 
  2. conn.Open();//打開連接 
  3. //通過連接創建一個向數據庫發命令(Command)的對象SqlCommand 
  4. using(SqlCommand cmd = conn.CreateCommand()) 
  5. cmd.CommandText =”select * from T_Student where Age<18”; 
  6. using(SqlDataReader reader=cmd.ExecuteReader() 
  7.   while(reader.Read()) 
  8.  string name=reader.GetString(1);//獲得第一列列的值 
  9.  int age=reader.GetIn32(2); //獲得第2列列的值 
  10.  Console.WriteLine(name); 
  11.  Console.WriteLine(age.ToString()); 
?

  其中Read方法返回bool類型,查詢結果是放到數據庫中,沒有放到客戶端。初始指針指向第一條數據之前,每調用一次Reader指針下移一條,只要沒有移到最后一條之后,就直接返回true。reader的GetString/GetInt32等方法只接受整數參數,也就是序號,用GetOrdinal方法根據列名動態得到序號。

 

0列

第一列

第二列

第三列

Id

Name

Age

Hobby

1

XXX

18

勾搭妹子

2

王旭

30

勾搭妹子

 

圖 1   數據庫T_Student表

為了避免數據庫注入漏洞,微軟設置有查詢參數,舉例如下:

cmd.CommandText =”select * from T_Student where Age<@Age”;

cmd.Parameters.Add(new SqlParameter(“@Age”,19));

這里把@Age設置為查詢參數,但是@參數不能用了替換表名、字段名、select之類的關鍵字等。

    SqlDataReader是和連接相關的,SqlDataReader中的查詢結果并不是放在程序中的,而是放在數據庫服務器中,SqlDataReader只是相當于一個游標,指到哪里讀到哪里。

    ADO.NET提供了數據集機制,DataSet,存在本地內存,其包含若干DataTable,DataTable包含若干行DataRow。使用方法:
 

  1. DataSet dataset=new DataSet(); 
  2. SqlDataAdapter adapter=new SqlDataAdapter(cmd); 
  3. adapter.Fill(dataset); 
?

SqlDataAdapter是一個幫我們把SqlCommand查詢結果填充到DataSet中的類,DataSet相當于本地的list集合(小數據庫)。遍歷方法如下:
 

  1. DataTable table=dataset.Tables[0];//一般情況下只有一個Tables,當同時執行多個select語句時有多個Tables。 
  2.  
  3. DataRowCollection rows=table.Rows; 
  4. for(int i=0;i<rows.Count;i++) 
  5.   DataRow row=rows[i]; 
  6. int age=(int)row[“Age”];//遍歷年齡 
?

基本上所有的步驟都是:打開鏈接--創建命令--執行--處理執行結果。所以可以寫個公共類自己用,避免重復代碼,詳細代碼如下:
 

  1. public static class SqlHelper 
  2.   { 
  3.     public static readonly string connstr = 
  4.       ConfigurationManager.ConnectionStrings["connstr"].ConnectionString; 
  5.     public static SqlConnection OpenConnection()//建立連接 
  6.     { 
  7.       SqlConnection conn = new SqlConnection(connstr); 
  8.       conn.Open(); 
  9.       return conn; 
  10.     } 
  11.     public static int ExecuteNonQuery(string cmdText, 
  12.       params SqlParameter[] parameters)//注意看有使用長度可變參數進行了簡化 
  13.     { 
  14.       using (SqlConnection conn = new SqlConnection(connstr)) 
  15.       { 
  16.         conn.Open(); 
  17.         return ExecuteNonQuery(conn, cmdText, parameters); 
  18.       } 
  19.     } 
  20.     public static object ExecuteScalar(string cmdText, 
  21.       params SqlParameter[] parameters) 
  22.     { 
  23.       using (SqlConnection conn = new SqlConnection(connstr)) 
  24.       { 
  25.         conn.Open(); 
  26.         return ExecuteScalar(conn, cmdText, parameters); 
  27.       } 
  28.     } 
  29.     public static DataTable ExecuteDataTable(string cmdText, 
  30.       params SqlParameter[] parameters) 
  31.     { 
  32.       using (SqlConnection conn = new SqlConnection(connstr)) 
  33.       { 
  34.         conn.Open(); 
  35.         return ExecuteDataTable(conn, cmdText, parameters); 
  36.       } 
  37.     } 
  38.     public static int ExecuteNonQuery(SqlConnection conn,string cmdText, 
  39.       params SqlParameter[] parameters) 
  40.     { 
  41.       using (SqlCommand cmd = conn.CreateCommand()) 
  42.       { 
  43.         cmd.CommandText = cmdText; 
  44.         cmd.Parameters.AddRange(parameters); 
  45.         return cmd.ExecuteNonQuery();//返回執行了多少行 
  46.       } 
  47.     } 
  48.     public static object ExecuteScalar(SqlConnection conn, string cmdText, 
  49.       params SqlParameter[] parameters) 
  50.     { 
  51.       using (SqlCommand cmd = conn.CreateCommand()) 
  52.       { 
  53.         cmd.CommandText = cmdText; 
  54.         cmd.Parameters.AddRange(parameters); 
  55.         return cmd.ExecuteScalar(); 
  56.       } 
  57.     } 
  58.     public static DataTable ExecuteDataTable(SqlConnection conn, string cmdText, 
  59.       params SqlParameter[] parameters) 
  60.     { 
  61.       using (SqlCommand cmd = conn.CreateCommand()) 
  62.       { 
  63.         cmd.CommandText = cmdText; 
  64.         cmd.Parameters.AddRange(parameters); 
  65.         using (SqlDataAdapter adapter = new SqlDataAdapter(cmd)) 
  66.         { 
  67.           DataTable dt = new DataTable(); 
  68.           adapter.Fill(dt); 
  69.           return dt; 
  70.         } 
  71.       } 
  72.     } 
  73.     public static object ToDBValue(this object value) 
  74.     { 
  75.       return value == null ? DBNull.Value : value; 
  76.     } 
  77.     public static object FromDBValue(this object dbValue) 
  78.     { 
  79.       return dbValue == DBNull.Value ? null : dbValue; 
  80.     } 
  81.   } 
?

封裝方法的原則:把不變的放到方法里,把變化的放到參數里,SqlHelper類里返回值是一行一列的用ExecuteScaler,ExecuteNonQuery一般用來執行Update/Delete/Insert語句,ExecuteDataTable只用來執行查詢結果比較少的sql,返回值是DataTable。

在數據庫中NULL和“”不一樣,NULL和0也不一樣。數據庫中NULL表示不“知道”。假如一個表中有個可空字段Name,如果有幾個實例Name為NULL,

select * from T_Student where Name=NULL是查不到任何數據的。
select * from T_Student where Name is NULL可以查到所有Name填NULL的數據。

需求:如果沒輸入姓名,則姓名應該為NULL,如果沒輸入年齡,則年齡應該為NULL。

問題:在SqlParameter如果參數值為null,則表示沒有提供參數的值,會報錯。

解決方法:.NET提供DBNull.Value用來表示數據庫中的NULL。以為DBNull.Value是object類型。所以需要這樣用:
 

  1. object objName; 
  2. string name=tbName.Text; 
  3. if(name.Length<0) 
  4.   objName=DBNull.Value; 
  5. }else 
  6.   objName=name; 
?

接著SqlParameter參數改為objName。

同時讀取數據庫時,存在Null,返回給.NET的值也是DBNull.Value。所以讀取后還要判斷后賦值,用法如下:
 

  1. if(row[“Name”]==DBNull.Value) 
  2.  name=null
  3. else 
  4.  name=(string)row[“Name”]; 
?

但是也有個問題,如果是int類型,則不能為null,就該定義的時候用int? age。

必須嚴格區分0,NULL和“”,否則出現問題很難查到。

附帶上次講的SqlHelper里的兩個函數,就是對上面兩個用法的封裝,可以直接用在SqlParameter參數中。

可空數據輸入數據庫時用
 

  1. public static object ToDBValue(this object value) 
  2.  
  3.     { 
  4.       return value == null ? DBNull.Value : value; 
  5.     } 
?

輸出時用
 

  1. public static object FromDBValue(this object dbValue) 
  2.   return dbValue == DBNull.Value ? null : dbValue; 
?

這個主要是用在SqlParameter中,實現可空數據的輸入輸出。

以上內容是關于本文給大家介紹的C#連接數據庫的方法,希望大家喜歡。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 包头市| 宜宾市| 嵩明县| 高州市| 曲靖市| 调兵山市| 饶阳县| 原平市| 财经| 鸡西市| 泸定县| 罗甸县| 驻马店市| 嘉义县| 滦平县| 冀州市| 临沂市| 常州市| 开封县| 米易县| 靖边县| 西安市| 宜昌市| 桦甸市| 丰台区| 通化县| 方山县| 六安市| 荃湾区| 子长县| 萨嘎县| 伽师县| 西充县| 特克斯县| 屏山县| 阿克苏市| 孟州市| 汤原县| 肃南| 略阳县| 尖扎县|