C#程式設計

C# SQL搜尋語句 Select Builder 架構

把我已經完成的大半的系統的一部分,關於內文的搜尋的Select語句Builder的思考過程和必須要考量的點寫上來,希望對大家有幫助。搜尋的時候如果是直接字串加來加去,常常會遇到很難閱讀或者多個AND少個空白之類的錯誤。

這種時候就需要寫個Builder,想想看StringBuilder有多好用,如果有SearchCmdBuilder不是很方便嗎?

包含的變數

SearchTerm:List<string>
Table:string
Join:List<string>
Columns:List<string>
WhereTopAnd:bool

大致上這樣結構就行,然後就是裡面的方法要包含哪些了。

解釋一下這些要做什麼,SearchTerm會包含比如CONTAINS([text],’Arthur’) OR CONTAINS([text],’CHEN’),如果WhereTopAnd=true,那有多個SearchTerm會用And連起來,不然會用OR連起來。

Columns是Select要取出的Columns,Table是主要的from的表,Join會包含 left join on TopicFiles on Topic.TopicID = TopicFiles.TopicID這類的。

AddSearchTerm

public void AddSearchTerm(string Term)

這樣可以新增SearhTermItem到List裡面,到最後有一個ToSQLString方法會把他們全部輸出。

HandleSearchTerm

因為輸入的可能是”Arthur Chen”要搜尋有有Arthur AND 有Chen的或有Arthur OR 有CHEN的。

所以定義是

public static string HandleSearchTerm(string Term,string Column=””,bool SpaceUseAnd=true,bool FullText=true,bool StartUniversal=true,bool EndUniversal=true)

寫法先將Term用Space分開成Array,然後處理Array每一個字串。如果FullText=true則是用CONTAINS(Column,處理萬用字元後的TermArr[i]),如果FullText=false則是用LIKE語句,如果StartUniversal=true在則要FullText的值填入*或者%在開頭,EndUniversal也是一樣。

處理好以後把全部用SpaceUseAnd決定加上AND在中間還是OR在中間。因為這個程式寫好很多的判斷,因此不會有多了一個AND或OR或者少了空白導致程式出錯。

如果有兩個以上用AND或OR連結起來前後要加上()。

Combo技

var searchCmdBuilder = new SearchCmdBuilder();
searchCmdBuilder.AddSearchTerm(SearchCmdBuilder.HandleSearchTerm(“Arthur Chen”,”TopicContent”))

這樣就可以直接Combo起來使用,至於要不要HandleSearchTerm設置static看每個人的想法,是我會加上去,因為可以直接使用。甚至可以做一個static Class專門處理Search Term,讓多個物件共用這些方法。

接著的處理

要把SELECT語句有結構的輸出,先一個一個做Columns排列,注意處理空白和逗號,然後再from Table,接著一個一個處理Join,最後處理SearchTerm。

這個AddSearchTerm有一個好處是如果不要用HandleSearchTerm的話,可以加上一些比如num=1之類的到條件中,也會好好處理。

可以考慮增加功能

如果有Join,每個Column應該要加上Table的名稱比較安全,Column輸出的時候要處理加上[]比較安全,那Table.Col要變成[Table].[Col],這就要考驗AI或者程式設計師的耐心。

然後ToSQLString要經過幾次嚴密的測試,尤其在例外狀況的處理。

還可以加上一下無效的SQL WHERE條件判斷,或者無效的JOIN判斷。

甚至JOIN可以變成一個物件,裡面包涵JOIN的Table和條件。這樣可以把條件每個資料表和欄位都自動加上[]。

結論

這樣可以減少程式的錯誤和增加可讀性,跟StringBuilder差不多概念,只是SELECT語句更複雜,這個也只能處理簡單的SELECT語句,如果要兩層的SELECT,這個可能就很難做到,要做到那個用StringBulder反而比較省時省力。

而且這個沒有加任何的GROUP或者Top 100之類的,或者分頁功能。

What's your reaction?

Excited
0
Happy
0
In Love
0
Not Sure
0
Silly
0

Comments are closed.