ADO.Net知识总结
- SqlDataReader是連接相關的,SqlDataReader中的查詢結果并不是放到程序中的,而是放在數據庫服務器中,SqlDataReader只是相當于一個指針(游標), 只能讀取當前游標指向的行,一旦連接斷開再不能讀取.這樣做的好處是無論查詢結果有多少條,對程序占用的內存幾乎沒有影響.
- SqlDataReader對于小數據量的數據來說帶來的只有麻煩. ADO.NET中提供了數據集的機制,將數據結果填充到本地內存中,這樣連接斷開,服務器斷開都不影響數據的讀取.數據集的好處是降低數據庫服務器壓力,編程也簡單(其實原理大致還是用reader讀取所有數據,儲存在list中)
- SqlHelper的作用,主要作用: 讀取配置文件的連接數據庫字符串,實現一些和數據庫的參數查詢函數,傳入參數一般是sql命令和parameter[]參數數組
- SqlHelper的一些問題,對于0參數?DataTable?datatable =?SqlHelper?.ExecuteDataTable(sql,?new?SqlParameter[0]);
- 注意NULL和DBNULL的區別
?
一、連接字符串的寫法
l? Data Source=; 指定服務器IP(計算機名)? 服務器\實例名
l? Initial Catalog=;初始化分類,要連哪個數據庫名
l? UserId=sa;Password=sa;用戶名密碼
l? Integrated Security=true; 使用Windows驗證方法
l? 另外一種寫法(舊):"server=.;database=”數據庫名字“;uid=sa;pwd=sa"
二、Ado.Net連接池
l? 當第一次創建一個連接對象并調用Open()操作的時候,該連接對象會向數據庫發出一個連接請求,并且進行連接。
l? 當調用該對象的Close()方法時,并沒有直下關閉連接對象,而是放入了“連接池”中,
l? 當下次再創建一個連接對象的時候,如果該對象所使用的連接字符串與池中現有的連接對象使用的字符串一模一樣(大小寫空格等都必須一樣),這時,并不會直下的再創建一個連接,而是使用池中現有的對象。
l? 如果再次創建的連接對象所使用的連接字符串不一樣,此時,則會創建一個新的連接。
l? 只有當調用了連接對象的Close()方法后,當前連接才會放入到池中。
l? 如果創建時和上一個連接對象一模一樣,但上一個連接并沒有Close()即:并沒有放入池中,這時,也會創建一個連接。
三、ADO.Net中常用的幾個對象
l? SqlConnection:數據庫連接對象
l? Command:執行SQL語句命令
l? DataReader:只讀、只進結果集
l? DataAdapter:適配器
l? DataSet:相當于內存中的臨時數據庫
l? SqlDataReader對象:
n? reader.HasRow=true表明有數據
n? reader.Read() 指向下一條???? //讀取前要先Read()
n? reader[0] 獲取列的數據
n? reader[]有重載,有列索引也有列名,費錢要求使用列索引
n? reader.GetValue(索引);
n? reader.GetOrdinal(列名);根據列名獲取列的索引
n? reader.GetInt32(索引); 直接獲取強類型 (有一個Null的問題)
n? int? age =reader.IsDBNull(2)?null : (int?) reader.GetInt32(2);
n? 使用時必需保證SqlConnection是打開的,不能中途關閉!
n? reader.GetInt32(索引)? 索引和查詢的順序有關!
n? 不要忘記使用using()釋放,DataReader獨享一個Connection
四、使用存儲過程
(*)封裝SqlHelper類
SqlHelper.cs是多年前微軟出品的一個使用ADO.Net方法對SQL Server數據庫進行操作的封裝類。而我們自己手寫的SqlHelper類同樣是對數據庫訪問方法的一個封裝類庫,讓我們在訪問數據庫的時候可以很方便地調用其中封裝的方法,省略了很多重復勞動。在聲明SqlHelper的時候,我們一般會聲明為一個靜態類,不使用靜態類的話有可能產生一些未知的錯誤(蘇老師說微軟說的)。
這個類中我們常用的方法如下:
除此之外,我們根據需要以及興趣也可以再增加一些其他的方法,對其進行修改以及擴展。
第一步、連接字符串
首先需要定義一個只讀的連接字符串,連接字符串可以直接寫死為一個固定的字符串,也可以從項目的配置文件中取得,一般使用后者:
private static readonly string connStr = System.Configuration.ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;
這樣的話windows應用程序的配置文件Web.config中可以配置連接字符串如下:
<configuration>
<connectionStrings>
<add name="connStr" connectionString="server=.;database=Exam;integrated security=true;"/>
</connectionStrings>
</configuration>
第二步、封裝ExcuteNonQuery
首先先寫一個完整的帶CommandType參數的方法:
public static int ExcuteNonQuery(string sql, CommandType cmdType, params SqlParameter[] sps)
{
using (SqlConnection conn = new SqlConnection(connStr))
{
using (SqlCommand cmd = conn.CreateCommand())
{
if (sps != null)
{
cmd.Parameters.AddRange(sps);
}
cmd.CommandType = cmdType;
cmd.CommandText = sql;
try
{
conn.Open();
return cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
conn.Close();
throw new Exception(ex.Message);
}
}
}
}
在這里,SqlConnection表示Sql Server數據庫的一個打開的連接,SqlCommand表示Sql Server數據庫執行的一個sql語句或者存儲過程。然后再判斷參數數組是否為空,不為空時,將參數數組加入到數據庫執行命令中。最后打開連接,運行ExecuteNonQuery方法。當然,最好把最后2步try起來,捕獲異常并拋出。
??? 有了完整的ExecuteNonQuery方法,我們就可以調用它,通過指定CommandType為CommandType.Text,再封裝一個執行Sql語句的重載:
public static int ExcuteNonQuery(string sql, params SqlParameter[] sps)
{
return ExcuteNonQuery(sql, CommandType.Text, sps);
}
第三步、封裝ExecuteScalar
ExecuteScalar與ExcuteNonQuery的使用一模一樣,只是返回值得類型為object而已,這里就不贅述了。
public static SqlDataReader ExceuteReader(string sql, CommandType cmdType, params SqlParameter[] sps)
{
SqlConnection conn = new SqlConnection(connStr);
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
if (sps != null)
{
cmd.Parameters.AddRange(sps);
}
cmd.CommandType = cmdType;
try
{
conn.Open();
return cmd.ExecuteReader(CommandBehavior.CloseConnection);
}
catch (Exception ex)
{
conn.Close();
throw new Exception(ex.Message);
}
}
}
重載方法:
public static SqlDataReader ExcuteReader(string sql, params SqlParameter[] sps)
{
return ExceuteReader(sql, CommandType.Text, sps);
}
第四步、ExceuteReader
ExceuteReader方法中返回的是一個SqlDataReader類型的對象reader,使用者拿到這個reader,再通過
while(reader.read())
{
??? ……
}
reader.close();
的方式從數據庫中一條一條地讀取數據,讀完之后調用reader的close方法,在這之前,ExceuteReader中的數據庫連接不能中斷,否則數據庫連接中斷,用戶就無法從數據庫中拿到數據了,所以ExceuteReader方法中,數據庫連接的創建不能用using包起來,并且執行命令的方法該這樣寫cmd.ExecuteReader(CommandBehavior.CloseConnection),CommandBehavior.CloseConnection表示在執行該命令時,如果關聯的DataReader對象被關閉,那么關聯的Connection對象也會被關閉,這樣,當調用端調用reader.close()時,數據庫連接將被關閉。
public static SqlDataReader ExceuteReader(string sql, CommandType cmdType, params SqlParameter[] sps)
{
SqlConnection conn = new SqlConnection(connStr);
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
if (sps != null)
{
cmd.Parameters.AddRange(sps);
}
cmd.CommandType = cmdType;
try
{
conn.Open();
return cmd.ExecuteReader(CommandBehavior.CloseConnection);
}
catch (Exception ex)
{
conn.Close();
throw new Exception(ex.Message);
}
}
}
重載方法:
public static SqlDataReader ExcuteReader(string sql, params SqlParameter[] sps)
{
return ExceuteReader(sql, CommandType.Text, sps);
}
第五步、ExcuteDataSet
ExcuteDataSet用于返回一個DataSet(也可以返回DataTable, 兩者區別不大)。先通過SqlDataAdapter的構造函數聲明一個SqlDataAdapter對象da,再調用da的Fill方法,把查詢到的表放到DataSet中,最后返回這個DataSet。
public static DataSet ExcuteDataSet(string sql, CommandType cmdType, params SqlParameter[] sps)
{
using (SqlConnection conn = new SqlConnection(connStr))
{
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
if (sps != null)
{
cmd.Parameters.AddRange(sps);
}
cmd.CommandType = cmdType;
using (SqlDataAdapter da = new SqlDataAdapter(cmd))
{
DataSet ds = new DataSet();
try
{
conn.Open();
da.Fill(ds);
return ds;
}
catch (Exception ex)
{
conn.Close();
throw new Exception(ex.Message);
}
}
}
}
}
上面定義da的這一大串
using (SqlConnection conn = new SqlConnection(connStr))
{
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
if (sps != null)
{
cmd.Parameters.AddRange(sps);
}
cmd.CommandType = cmdType;
using (SqlDataAdapter da = new SqlDataAdapter(cmd))
也可以通過SqlDataAdapter的構造方法
public SqlDataAdapter(string selectCommandText, string selectConnectionString) : this()來實現:
SqlDataAdapter da = new SqlDataAdapter(sql, connStr);
da.SelectCommand.CommandType = cmdType;
重載方法:
public static DataSet ExcuteDataSet(string sql, params SqlParameter[] sps)
{
return ExcuteDataSet(sql, CommandType.Text, sps);
}
?
????? 相關的WPF基礎?
轉載于:https://www.cnblogs.com/reganLi/p/3403702.html
總結
以上是生活随笔為你收集整理的ADO.Net知识总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: keytool命令总结
- 下一篇: ASP.NET三层架构之不确定查询参数个