雖然我們都知道ADO.NET是對數據庫的操作,但是要真的說出ADO.NET的具體含義還不是很容易。
ADO.NET是ActiveX Data Objects的縮寫,它是一個COM組件庫,用於在microsoft技術中訪問數據。之所以叫ADO.NET,應該是微軟自己打的廣告,希望在NET編程環境中優先使用這種數據訪問接口。上面這段話基本來自百度百科。簡單來說,ADO.NET就是一種數據訪問接口,可以讓我們在程序中調用相應的類庫對數據庫(通常為SQL Server,也可以是access 等其他數據庫)進行增刪改查等操作。
ADO.NET的幾大組成部分
ADO.NET由五大類庫組成,分別是:
Connection(用於建立與 數據庫的連接)
Command(用於執行SQL語句)
DataReader(用於讀取數據)
DataAdapter(用於填充把數據填充到DataSet)
DataSet(數據集,用於程序中)
通常,從程序中訪問數據庫的方法是:
創建一個到數據庫的連接
打開數據庫連接
創建ADO記錄集
從記錄集中提取需要的數據
關閉記錄集
關閉連接
下面就分別根據這一個過程結合ADO.NET的五大類庫進行解釋。
要想使用ADO.NET需要在程序中引用System.Data.SqlClient。其中包含了對Sql Server進行操作的數據訪問類:
SqlConnection:連接數據庫
SqlCommand:數據庫命名對象
SqlCommandBuilder:生成SQL命令
SqlDataReader:數據讀取器
SqlDataAdapter:數據適配器,用於填充DataSet
SqlParameter:為存儲過程定義參數
SqlTransaction:數據庫事務
建立連接
首先,要想訪問數據庫,我們需要一個媒介把程序與數據庫連接起來。這就是連接字符串,它的基本語法為:Data Source(數據源) + Initial Catalog(數據庫名稱) + User ID(用戶名) + Password(密碼)。
復制代碼 代碼如下:
String connectString = "Data Source = myServerAddress;Initial Catalog = myDataBase;User Id = myUserName; Password = myPassword;";
或者
復制代碼 代碼如下:
String connectString = "Server =myServerAddress;Database = myDataBase; User Id = myUsername; Password = myPassword;";
注意:對於Sql Server來說,它支持兩種身份驗證方法,一種是windows身份驗證,另一種是Sql Server身份驗證。如果要用windows身份驗證,就需要在連接字符串中包括Integrated Security屬性。該屬性默認為False。需要設置為True後才能使用windows身份驗證。
除了這幾個必須的字段,連接字符串中還有許多可選的屬性,在這裡我就不一一列舉,列出一些相關資料供感興趣的朋友自行查閱,一個連接字符串可以包含哪些屬性(http://www.jb51.net/article/67742.htm)。
接著,有了連接字符串就可以創建連接對象了。
SqlConnection connection = new SqlConnection(connecString);
或者可以使用專門的連接字符串生成器:
復制代碼 代碼如下:
SqlConnectionStringBuilder connectionStringBuilder = new SqlConnectionStringBuilder()
{
DataSource=”“,
InitialCatalog=”“,
UserID=”“,
Password=””
};
SqlConnection connection = new SqlConnection(connectionStringBuilder.ToString());
然後使用連接對象可以打開或關閉連接。
connection.Open();
connection.Close();
執行命令
打開連接之後就可以操作數據庫了,在這裡需要用到SqlCommand命令對象。
它具有四個主要屬性,這些屬性會在初始化的時候賦默認值:
CommandText:空字符串(”“)
CommandTimeout:30
CommandType:CommandType.Text
Connection:Null
創建命令對象:
SqlCommand command = connection.CreateCommand();
或
SqlCommand command = new SqlCommand();
SqlCommand包含了幾個重要的屬性:
CommandText:用於獲取或設置藥對數據源之行的SQL語句、表明或存儲過程。
CommandType:設置你執行的SQL語句類型,有三個枚舉,分別是Text(SQL文本命令),StoredProcedure(存儲過程),TableDirect(表名)。
Parameters:設置你的T-SQL中需要用到的參數。
幾個重要的方法:
ExecuteNonQuery:返回被SQL語句執行影響的行數(int),主要執行增刪改操作。
ExecuteReader:執行SQL或存儲過程,返回的是SqlDataReader類型,主要用來查詢。
ExecuteScalar:返回執行結果集中的第一行第一列,如果沒有數據,則返回NULL。
CreateParameter:創建SqlParameter實例。
舉例說明:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data;//必須 using System.Data.SqlClient;//必須 namespace Command { class Program { static void Main(string[] args) { SqlConnectionStringBuilder conStr = new SqlConnectionStringBuilder(); conSt.DataSource=@".\SQLEXPRESS"; conStr.IntegratedSecurity=true; conStr.InitialCatalog="db_Test"; StringBuilder strSQL = new StringBuilder(); for(int i=0;i<=100;i++) { strSQL.Append("insert into tb_Test"); strSQL.Append("values('"); string name = "test"+i.ToString(); strSQL.Append(name); } using(SqlConnection con = new SqlConnection(conStr.ConnectionString)) { con.Open(); SqlCommand cmd = new SqlCommand(strSQL.ToString(),con); int impactedNumber = cmd.ExecuteNonQuery();//返回受影響的行數 object firstData = cmd.ExecuteScalar();//返回執行結果中的第一行第一列,此方法可用於獲取插入數據的ID,(int lineNumber =(int)cmd.ExecuteScalar();) } } } }
SQL參數
若想在程序中傳遞參數給數據庫,可以使用SqlParameter。該類有幾個重要的屬性:
ParameterName:設置參數名
Value:給參數設置值
Size:設置參數字節最大長度
SqlDbType:參數在SQL中的類別
和幾個重要的方法:
AddWithVlue
Add
AddRange
舉例說明:
SqlConnection connection =new SqlConnection("")) { SqlCommand cmd = connection.CreateCommand(); cmd.CommandText=""; cmd.Parameters.Add("@name",SqlDbType.NVarChar).Value = "deng";//方法一 cmd.Parameters.AddWithValue(@"name","deng");//方法二 SqlParameter[] parameters = new SqlParameter[] { new SqlParameter("@name",SqlDbType.NvarChar,100){Value="deng"}, }; cmd.Parameters.AddRange(parameters);//可以放一個參數數組,包含多條參數,在此只舉一個例子 }
可以通過cmd.Parameters[i].Value設置和讀取數值。
數據讀取
利用查詢語句得到的數據信息需要通過數據讀取器進行操作。
舉例:
SqlConnetion con = new SqlConnection("") { con.Open(); SqlCommand cmd = con.CreateCommand(); cmd.CommandText=""; SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection) { While(dr.Read()) { string str = dr.GetSqlString(0).ToString(); } } }
介紹幾個常用的方法:
GetOrdinal:可以獲取指定列名的序列號,int name = dr.GetOrdinal(“name”);
GetName:與上面的方法對應,可以通過列號返回列名字。
IsDBNull:判斷當前讀取的數據是否為Null。
NextResult:當查詢為批處理查詢時,使用這個方法去獲取下一個結果集,返回值為Bool,如果存在多個結果集,則為true;否則為false。
Read:讀取數據。
常用屬性有:
HasRow:判斷是否有數據。
FieldCount:獲取讀取的列數。
IsClosed:判斷讀取的數據流是否關閉。
SqlDataReader是連接相關的,也就是說與數據庫的連接一斷開就無法讀取數據庫中的數據,說明查詢結果並不是放在程序中,而是放在數據庫的服務中。
事務
需要用到SqlTransaction類,需要在指定位置命名存儲點,該存儲點之後的操作都將會回滾。
例子:
SqlConnection con = new SqlConnection(strCon); con.Open(); SqlTransaction transaction = con.BeginTransaction(); SqlCommand cmd = con.CreateCommand(); cmd.CommandText = "" cmd.Transaction = transaction; transaction.Save("transaction point"); transaction.Rollback("transaction point");
數據適配器
SqlDataAdapter類有四個重載構造函數:
無參
SqlDataAdapter(SqlCommand)
SqlDataAdapter(String,SqlConnection)
SqlDataAdapter(String, ConnectionString)
填充數據例子:
DataSet dataSet = new DataSet(); SqlConnection con = new SqlConnection(""); con.Open(); SqlCommand cmd = con.CreateCommand(); cmd.CommandText="select xxx from tb_xxx"; SqlDataAdapter dataAdapter = new SqlDataAdapter(cmd); dataAdapter.Fill(dataSet);
填充後的數據可以使用SqlCommandBuilder進行增刪改查。
例子:
SqlConnection con = new SqlConnection(ConnectionString(); con.Open(); SqlDataAdapter da = new SqlDataAdapter("select xxx from tb_xx"); DataSet ds =new DataSet(); da.Fill(ds); SqlCommandBuilder cmdBuilder = new SqlCommandBuilder(da); DataRow row = ds.Tables[0].NewRow(); row[0]="a"; row[1]="b"; ds.Tables[0].Rows.Add(row); da.Update(ds);
SqlCommandBuilder 可以把DataSet增加的數據轉化為SQL語句用來更新數據庫。然後調用Update方法。
總結
因為現在使用的框架或著庫都已經封裝了ADO.NET,可能在日常工作中很少會再從頭開始編寫ADO.NET來連接數據庫,但是在.net面試中還是非常常見的,希望可以借此加深一下印象。另外,本人目前持有的是銀蕨簽證,可以在新西蘭求職9個月,期間如果找到相關專業工作,可直接轉2年的工作簽證,非常方便移民,該簽證每年全球發放300個,雖然還沒有working holiday簽證為大家所熟知,但是每年的爭搶還是很激烈的。需要了解相關事宜的可以給我留言。本人的第一篇博客,屬於整理資料,並非完全原創,如有哪方面不正確,還希望大神可以多多指正。