通過ADO.NET連線資料原理
簡介:
ADO.NET就是一組類庫,這個類庫可以讓我們通過程式的方式訪問資料庫。
組成:
資料提供程式(常用類)
- connection:用來連線資料庫
- command:用來執行SQL語句
- dataReader:只讀,只進的結果集,一條條的讀取資料。
- dataAdapter:一個封裝上面三個類的物件
資料集(dataset),臨時資料庫
斷開式資料操作
Demo
先體驗一下如何使用ADO.NET在vs中連線資料庫,並操作。 我現在僅僅是為了建立連線,為了簡單,首先建立一個“控制檯應用程式”的專案:
/*連線資料庫的基本步驟如下: 1、建立連線字串——用來表示連線某伺服器的某資料庫例項,以及使用者名稱和密碼 2、建立連線物件 3、開啟連線(如果開啟資料庫連線沒有問題,表示連線成功。) 4、關閉連線(釋放資源) */
1、連線字串的建立
#region 1.建立連線字串
/*連線字串包括以下幾個部分:
1、data source:伺服器例項(可填:ip,localhost,.(英文的句號),計算機名稱等)
2、Initial Catalog :初始化連線的資料庫例項名稱。
3、Integrated Security:
如果integrated security=true表示可以在不知道資料庫使用者名稱和密碼的情況下時,依然可以連線資料庫,也就是使用“windows 身份驗證”連線。
如果integrated security=false,或者不寫,表示一定要輸入正確的資料庫登入名和密碼。
*/
//string constr = "Data Source=.;Initial Catalog=CRB_TPM;integrated security=true";
//string constr = "Data Source=.;Initial Catalog=CRB_TPM;integrated security=SSPI"; //string constr = "Data Source=.;Initial Catalog=CRB_TPM;uid=sa;pwd=123456";
string constr = "Data Source=.;Initial Catalog=CRB_TPM;userid=sa;password=123456";
#endregion
2、建立連線物件
因為我們建立完連線使用後,需要釋放資源,為了方便,我們使用using ,關於using 的用法詳見:補充2
#region 2.建立連線物件
//using 類似於使用try finally 方法,最後使用
using (SqlConnection con=new SqlConnection(constr))//將滑鼠定位到SqlConnection單詞上,shift+alt+F10 可以檢視需要匯入的名稱空間
{
}
#endregion
3、開啟連線:
using (SqlConnection con=new SqlConnection(constr))//將滑鼠定位到SqlConnection單詞上,shift+alt+F10 可以檢視需要匯入的名稱空間
{
//3、測試開啟連線:
con.Open();
//4、關閉連線,並且釋放資源
//con.Close();//可以不寫,因為Dispose中呼叫了close方法。
//con.Dispose();//因為我們使用的是using 的方式,所以不需要使用手動的Dispose
}
資料庫連線的建立全部程式碼如下:
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
/*連線資料庫的基本步驟如下:
1、建立連線字串——用來表示連線某伺服器的某資料庫例項,以及使用者名稱和密碼
2、建立連線物件
3、開啟連線(如果開啟資料庫連線沒有問題,表示連線成功。)
4、關閉連線(釋放資源)
*/
#region 1.建立連線字串
/*連線字串包括以下幾個部分:
1、data source:伺服器例項(可填:ip,localhost,.(英文的句號),計算機名稱等)
2、Initial Catalog :初始化連線的資料庫例項名稱。
3、Integrated Security:
如果integrated security=true表示可以在不知道資料庫使用者名稱和密碼的情況下時,依然可以連線資料庫,也就是使用“windows 身份驗證”連線。
如果integrated security=false,或者不寫,表示一定要輸入正確的資料庫登入名和密碼。
*/
//string constr = "Data Source=.;Initial Catalog=CRB_TPM;integrated security=true";
//string constr = "Data Source=.;Initial Catalog=CRB_TPM;integrated security=SSPI";
string constr = "Data Source=.;Initial Catalog=CRB_TPM;uid=sa;pwd=123456";
#endregion
#region 2.建立連線物件
//using 類似於使用try finally 方法,最後使用
using (SqlConnection con=new SqlConnection(constr))//將滑鼠定位到SqlConnection單詞上,shift+alt+F10 可以檢視需要匯入的名稱空間
{
//3、測試開啟連線:
con.Open();
Console.WriteLine("成功開啟資源。注意:如果con.open() 失敗,則無法執行此句列印程式碼。");//如果con.open() 失敗,則無法執行此句程式碼。
//4、關閉連線,並且釋放資源
//con.Close();//可以不寫,因為Dispose中呼叫了close方法。
//con.Dispose();//因為我們使用的是using 的方式,所以不需要使用手動的Dispose
}
#endregion
Console.WriteLine("關閉連線釋放資源。");
Console.readkey();
}
}
}
執行結果:
下面來說一下增刪改查語句(insert 語句為例):
用過ADO.NET向表中插入一條語句,具體流程程式碼中均有體現
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
#region 通過ADO.NET 向表中插入語句
//1、建立連線字串
string ConStrForInsert = "Data Source=.;Initial Catalog=CRB_TPM;uid=sa;pwd=123456";
//2、建立連線物件
using (SqlConnection con=new SqlConnection(ConStrForInsert))
{
//3、開啟連線
//con.Open();//不建議在這裡開啟連線物件(連線物件最晚開啟,最早關閉,節省資源)
//編寫slq語句
string sql = " insert into Log(id,Title,[Type],WriteTime,UserID)values('03B2C499-2BEE-4DAA-83E3-0000DB028819','插入語句','insert測試',GETDATE(),'07B2C499-2BEE-4DAA-83E3-0000DB028819')";
//4、建立一個執行sql語句的物件(命令物件)sqlcommand
using (SqlCommand cmd=new SqlCommand(sql,con))
{
// 開啟連線(連線物件最晚開啟,最早關閉,節省資源)
con.Open();
//開始執行sql語句
int r = cmd.ExecuteNonQuery();
Console.WriteLine("成功插入{0}行資料",r);
Console.WriteLine("點選任何按鈕繼續執行");
Console.ReadKey();
#region 補充:以下三種方式均可執行sql語句增刪改查語句。
//cmd.ExecuteNonQuery();//適用於insert、update、delete語句中,返回受影響的行數。
//cmd.ExecuteScalar();//適用於返回結果集中只有單個結果的時候,即第一行第一列的值,其他的值忽略。
//cmd.ExecuteReader();//適用於查詢並返回多行多列的時候。
//ExecuteNonQuery():只有執行insert、update、delete語句的時候,返回int型別的值,表示受影響的行數,執行其他的sql語句成功後返回-1
//ExecuteScalar() :當sql語句執行的時候,如果是聚合函式(例如:select count(1) from T_user),那麼ExecuteScalar()返回的不可能是null,因為聚合函式不可能是null。但是如果sql語句不是聚合函式,那麼ExecuteScalar()方法有可能返回null,所以在使用ExecuteScalar()的返回值的時候,需要先判斷是否為null
#endregion
}
#region 類似SqlCommand cmd=new SqlCommand(sql,con)的寫法
//using (SqlCommand cmd = new SqlCommand())
//{
// cmd.CommandText = sql;
// cmd.Connection = con;
//}
#endregion
}
#endregion
}
}
}
補充1:Integrated Security簡介
預設情況下,Integrated Security 屬性為 False ,這意味著將禁用Windows身份驗證。如果沒有顯式地把這個屬性的值設定為True,連線將使用SQL Server身份驗證,因此,必須提供SQL Server使用者ID和密碼。Integrated Security屬性還能識別的其他值只有SSPI(Security Support Provider Interface,安全性支援提供者介面).在所有的Windows NT作業系統上,其中包括Windows NT 4.0、2000、XP,都支援值SSPI。它是使用Windows身份驗證時可以使用的惟一介面,相當於把Integrated Security 屬性值設定為True。
補充2:using 的三種用法
1.using指令。using + 名稱空間名字,這樣可以在程式中直接用命令空間中的型別,而不必指定型別的詳細名稱空間,類似於Java的import,這個功能也是最常用的,幾乎每個cs的程式都會用到。 例如:using System; 一般都會出現在*.cs中。 2.using別名。using + 別名 = 包括詳細名稱空間資訊的具體的型別。 這種做法有個好處就是當同一個cs引用了兩個不同的名稱空間,但兩個名稱空間都包括了一個相同名字的型別的時候。當需要用到這個型別的時候,就每個地方都要用詳細名稱空間的辦法來區分這些相同名字的型別。而用別名的方法會更簡潔,用到哪個類就給哪個類做別名宣告就可以了。注意:並不是說兩個名字重複,給其中一個用了別名,另外一個就不需要用別名了,如果兩個都要使用,則兩個都需要用using來定義別名的。 例如: using aClass = NameSpace1.MyClass; using bClass = NameSpace2.MyClass; 3.using語句,定義一個範圍,在範圍結束時處理物件。 場景: 當在某個程式碼段中使用了類的例項,而希望無論因為什麼原因,只要離開了這個程式碼段就自動呼叫這個類例項的Dispose。 要達到這樣的目的,用try…catch來捕捉異常也是可以的,但用using也很方便。 例如: using (Class1 cls1 = new Class1(), cls2 = new Class1()) { // the code using cls1, cls2 } // call the Dispose on cls1 and cls2