SQL Server,Access數據庫查詢易混點和C#中parameter指定參數長度的優缺點

在學校的時候就經常做一些網站,所以這次在公司實習,組長第一次給了一個企業的網站還是很快的完成了。中間並沒有遇到什麼大的問題,但是還是遇到了兩個新手非常容易混淆的小問題,所以拿出來跟大家分享一下。

主要分兩個內容:1)SQL Server,Access數據庫查詢的易混點;2)C#中parameter指定參數長度對程序性能的影響

1)SQL Server,Access數據庫查詢的易混點

學習SQl的都知道,我們要在數據庫中實現模糊查詢是要使用Like語句的,同時使用一些通配符來完成對查詢內容的模糊匹配。

第一個通配符就是“%”,只要是完成對任意字符的匹配(在Access數據庫中使用“*”);第二個通配符“_”是完成對單個字符的匹配;

但是在程序中是什麼樣子呢?

因爲我所做的網站使用的是Access數據庫,當我在程序中使用“*”通配符查詢數據庫時,無論如何在自己創建的DataTable實例化的對象中始終沒有數據,剛開始懷疑是DataAdapter中不能使用“Like”這樣的命令語句。最終經過測試發現,如果在程序中使用“%”操作符時,就會有數據。

雖然在Access中使用“*”來完成模糊匹配,但是在C#程序中還是要使用“%”來完成模糊匹配。


2)C#中parameter指定參數長度對程序性能的影響

其實我自己也一直有一個疑問就是關於實例化SqlParameter對象,其中我們都會去指明參數,參數類型,還有參數長度(注意很多時候我們都是都省去這一步的)。如下面的實例聲明方法:

1//顯式指定參數長度2             SqlParameter parameter1 = new SqlParameter("@home", SqlDbType.NChar, 4);3//不指明參數長度4             SqlParameter parameter2 = new SqlParameter("@home", SqlDbType.NChar);

到底我們指明參數的長度對程序的性能有沒有影響呢。

在微軟的MSDN中的解釋是“在參數聲明時,如果未顯式設置,則從指定參數值的實際大小推斷出該大小。”

我們還是寫一段小程序,然後使用SQL Server2008自帶的SQL Server Profiler來測試觀察一下這個過程吧。

程序代碼如下:

複製代碼
 1public DataTable GetTable() 2        { 3             SqlConnection con = new SqlConnection(strConnection); 4             SqlCommand cmd = new SqlCommand("select * from testsql5 where name=@Name", con); 5 6//這裏兩句來測試程序語句獲取參數的方法 7//SqlParameter parameter = new SqlParameter("@Name", SqlDbType.NVarChar); 8             SqlParameter parameter = new SqlParameter("@Name", SqlDbType.NVarChar,8); 910             parameter.Value = "nijiushi";11            cmd.Parameters.Add(parameter);1213             SqlDataAdapter adapter = new SqlDataAdapter(cmd);14             DataTable dt = new DataTable();15            adapter.Fill(dt);1617return dt;1819         }
複製代碼

在程序中,首先執行的是未被註釋的代碼,在SQL Server Profiler中看到的執行結果如下:

這個時候因爲顯式的指明瞭參數的長度,所以跟蹤結果中看到參數的長度nvarchar(8)

我們再來試試把參數的長度指定的比給定的參數值得長度小。代碼如下:

1  SqlParameter parameter = new SqlParameter("@Name", SqlDbType.NVarChar,6);

跟蹤結果如下:

我們可以看到的是此時參數的長度已經變成了nvarchar(6),而參數的值也被截斷爲“nijius”

那麼沒有指名參數長度時,程序是通過sqlDbType.NChar知道參數的長度還是通過後面對參數賦值知道參數的長度呢?

然後我們執行上邊的註釋的代碼,也就是沒有指定參數長度的代碼,看到的結果如下:

這時候我們看到測試軟件跟蹤的結果是一樣的,但是可以看到的就是下邊的參數長度已經被確定爲nvarchar(8)。我們可以試着改變參數的值來看一下。比如我把參數的值改爲“nijiu”,再看測試的結果如下:

由此我們可以知道,程序是通過後面參數的值來得出參數的長度的,而不是通過參數的類型SqlDbType.NVarChar

那麼這樣到底對程序有什麼影響呢?

對於參數長度一樣的語句在SQl server中會執行相同的執行計劃,但是對於不一樣的參數長度的話,會生成新的執行計劃.所以,當顯式的指明參數的長度的時候會加快sql的執行速度.


如果您覺得不錯,點擊右下角,贊一下吧!您的支持,是我寫作的動力!

畢業實習交流羣:221376964。期待IT老兵加入,工作之餘給畢業實習生以思想指導!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章