1. 程式人生 > >c# 分析SQL語句中的表操作

c# 分析SQL語句中的表操作

最近寫了很多方向的總結和demo.基本包含了工作中的很多方面,畢竟c#已經高度封裝並且提供了很多類庫。前面已經總結了博文。最近2天突然感覺前面的SQL分析阻元件的確麻煩,也注意看了下。為了方便大家學習交流。自己專門另外寫了一個元件demo.用正則表示式獲取操作型別,其實原理很簡單,我簡單介紹下,算是為大家提供一個思路或者說解決方案。

   SQL92是固定格式,每部分內容都是用空格隔離,所以拿到SQL語句後,先用正則表示式規整SQL,連續的空格都用一個空格替換。然後按照SQL關鍵字從左向右依次解析關鍵字用正則表示式,處理完成後就是按照關鍵字的一個連結串列。這樣由前面的關鍵字,再找到緊跟著的表,就是對錶的操作了。

例如:SQL語句 select  *  from  m,這個語句,逐個獲取空格,然後檢查當前是否是關鍵字,不是則統一歸為欄位。那麼from後面緊跟著的欄位就是表。這樣就獲取了表操作。

簡單測試了幾個SQl語句,都可以實現,當然肯定不是完整的,如果按照這個思路來解決問題需要修改什麼呢?

1.SQL關鍵詞(select,insert,into等等),這個是在TagFactory類中的關鍵詞陣列,持續增加關鍵字,每一個關鍵字都算一個tag.

2.處理完SQL語句形成連結串列後,按照連結串列順序逐個整理表操作,沒有表內容則捨棄(因為是子句)。主要是TagList類的GetTags方法,其實就是檢視當前是關鍵詞是否是表操作型別的關鍵詞(TagType中定義表操作型別的關鍵詞),最後就形成了對錶操作的歸類。

示例:

         string sql = "truncate table m";
            SqlPaser.SqlPaser paser = new SqlPaser.SqlPaser();
            paser.Paser(sql);
            var v=  paser.Permission;//表操作

寫的demo已經上傳GIT

專案地址:

https://github.com/jinyuttt/SQLPaser.git

注意與前面的元件地址很近,少了一個字母r。

我最近所有的c#元件demo都是vs2017完成的。

這樣就有表許可權了。

最近的c#方向的學習和demo到此就基本完了,歡迎大家交流討論。QQ群:158351344
---------------------
作者:jason成都
來源:CSDN
原文:https://blog.csdn.net/jinyuttt/article/details/84038880
版權宣告:本文為博主原創文章,轉載請附上博文連結!