一、介紹
ado.net是.net framework的資料提供者,它主要有SqlConnection、SqlCommand、SqlDataAdapter、SqlDataReader和DataSet五大對象構成,結構如
1.SqlConnection類表示一個sql server資料庫的一個串連
連接字串格式一般有如下兩種形式,具體參數可以參照msdn
1)Persist Security Info=False;Integrated Security=true;Initial Catalog=Northwind;server=(local)
2)Server=.;Database=demodb;User=sa;Password=123;
建立一個串連如下
SqlConnection conn = new SqlConnection(connString);
2.SqlCommand類表示資料庫執行命令對象
1)用來設定需要執行的sql指令碼或預存程序、逾時時間、參數和事務等。
2)建立方式如下
SqlConnection conn = new SqlConnection();
//方式一
conn.CreateCommand();
//方式二
SqlCommand cmd = new SqlCommand();
cmd.CommandText = "select * from table" ;
cmd.Connection = conn;
3)幾個主要方法
ExecuteNonQuery:對串連執行sql語句並返回受影響行數,主要執行增、刪和改操作
ExecuteReader:執行查詢返回SqlDataReader對象
ExecuteScalar:執行查詢返回結果集中的第一行和第一列
3.SqlDataAdapter類用來填充DataSet和更新資料庫資料命令和資料庫連接
該類有4種建構函式如下
public SqlDataAdapter();
public SqlDataAdapter(SqlCommand selectCommand);
public SqlDataAdapter(string selectCommandText, SqlConnection selectConnection);
public SqlDataAdapter(string selectCommandText, string selectConnectionString);
4.SqlDataReader類提供一種資料流只進方式讀取
5.DataSet類表示資料在記憶體中的緩衝
二、ADO.NET簡單實現
下面實現一個增、刪、改、查的例子
public class EasySqlHelper { //web.config來配置 //private static string connString = ConfigurationManager.AppSettings["SqlConnectionString"]; private static string connString = "Server=.;Database=demodb;User=sa;Password=123;"; public static int ExecuteNonQuery(string sql) { using (SqlConnection conn = new SqlConnection(connString)) { using (SqlCommand cmd = new SqlCommand(sql, conn)) { if (conn.State != ConnectionState.Open) { conn.Open(); } return cmd.ExecuteNonQuery(); } } } public static SqlDataReader ExecuteReader(string sql) { SqlConnection conn = new SqlConnection(connString); SqlCommand cmd = new SqlCommand(sql, conn); SqlDataReader rdr = null; try { if (conn.State != ConnectionState.Open) { conn.Open(); } rdr = cmd.ExecuteReader(); } catch (SqlException ex) { conn.Dispose(); cmd.Dispose(); if (rdr != null) { rdr.Dispose(); } throw ex; } finally { cmd.Dispose(); } return rdr; } public static DataTable ExecuteDataTable(string sql) { using (SqlConnection conn = new SqlConnection(connString)) { using (SqlCommand cmd = new SqlCommand(sql, conn)) { if (conn.State != ConnectionState.Open) { conn.Open(); } SqlDataAdapter adp = new SqlDataAdapter(cmd); DataSet ds = new DataSet(); adp.Fill(ds); return ds.Tables[0]; } } } }
上面代碼中使用using來確保資源釋放,所有實現IDisposable介面的類都可以用using來釋放,即使在調用對象的方法上發生異常也會釋放。
三、建立不同提供者的資料來源類執行個體
上面代碼只對sql server有效,如果要實現不同資料庫如oracle則又需要另外寫一套代碼,.Net提供了DbProviderFactory類來建立不同資料庫執行個體。
同時上面5大對象也要換成DbConnection、DbCommand、DbDataReader、DbDataAdapter把具體sql server對象抽象成更具體和資料庫類型無關對象。
//// <summary> /// 串連資訊 /// </summary> public class ConnectionInfo { private string _connectionString; private string _providerName; /// <summary> /// 連接字串 /// </summary> public string ConnectionString { get { return _connectionString; } } /// <summary> /// 提供者的固定名稱 /// </summary> public string ProviderName { get { return _providerName; } } public ConnectionInfo(string connectionString, string providerName) { _connectionString = connectionString; _providerName = providerName; } } public class MySqlHelper { private static DbProviderFactory dbProvider; private static readonly ConnectionInfo connInfo = new ConnectionInfo("Server=.;Database=demodb;User=sa;Password=123;", "System.Data.SqlClient"); private static void GetProvider() { dbProvider = DbProviderFactories.GetFactory(connInfo.ProviderName); } static MySqlHelper() { GetProvider(); } public static int ExecuteNonQuery(string sql, DbParameter[] parameters) { int flag = 0; using (DbConnection conn = dbProvider.CreateConnection()) { conn.ConnectionString = connInfo.ConnectionString; conn.Open(); using (DbCommand cmd = conn.CreateCommand()) { cmd.CommandText = sql; if (parameters != null && parameters.Length > 0) { cmd.Parameters.AddRange(parameters); } flag = cmd.ExecuteNonQuery(); } } return flag; } public static void ExecuteReader(string sql, DbParameter[] parameters, Action<IDataReader> action) { IDataReader rdr = null; using (DbConnection conn = dbProvider.CreateConnection()) { conn.ConnectionString = connInfo.ConnectionString; conn.Open(); using (DbCommand cmd = conn.CreateCommand()) { cmd.CommandText = sql; if (parameters != null && parameters.Length > 0) { cmd.Parameters.AddRange(parameters); } rdr = cmd.ExecuteReader(); action(rdr); rdr.Close(); } } } public static DataTable ExecuteDataTable(string sql, DbParameter[] parameters) { DataTable dt = null; using (DbConnection conn = dbProvider.CreateConnection()) { conn.ConnectionString = connInfo.ConnectionString; conn.Open(); using (DbCommand cmd = conn.CreateCommand()) { cmd.CommandText = sql; if (parameters != null && parameters.Length > 0) { cmd.Parameters.AddRange(parameters); } IDataReader rdr = cmd.ExecuteReader(); dt = new DataTable(); dt.Load(rdr); rdr.Close(); } return dt; } } }
四、其它第三方架構
有Dapper、IBatis.Net等等,可以參考學習下
【相關推薦】
1. ASP.NET免費視頻教程
2. C#使用Ado.Net更新和添加資料到Excel表格的方法
3. ADO.NET 讀取EXCEL的實現代碼((c#))
4. ADO.NET調用預存程序
5. ado.net 串連vs 資料庫代碼