闲云

一张白纸,总想写上点什么...
  博客园  :: 首页  :: 新随笔  :: 订阅 订阅  :: 管理

利用〔正则〕检查.NET访问数据库Sql的正确性

Posted on 2006-09-13 12:42  闲云  阅读(545)  评论(2编辑  收藏  举报
背景
        利用.NET访问数据库的时候,需要写一些SQL语句。但是由于SQL的可读性、
不好测试的特点。经常会写错字母,漏写了参数等。直到写界面层的时候才发现
问题,回头再来改,十分痛苦。

想法
        利用数据库访问脚本及其数据库字段的命名约定。比如,INT类型就用INT
结尾,VARCHAR就用VCHR结尾等。有了这些,我们就可以根据约定自动生成
相关类型的数据了。下面就是利用程序生成的例子!

UPDATE TABLE
SET 
COLUMNNAME1_VCHR 
= ?,
COLUMNNAME2_CHR 
= ?,
COLUMNNAME3_VCHR 
= ?
WHERE COLUMNNAME4_INT = ?
===   CONVERT TO == >>>
UPDATE TABLE 
SET 
COLUMNNAME1_VCHR
='aaaa',
COLUMNNAME2_CHR
='aaaa',
COLUMNNAME3_VCHR
='aaaa' 
WHERE COLUMNNAME4_INT=17;


然后这些脚本就可以在SQLNavigat中运行了,以判断字段的正确与否。

正则表达式
         利用正则表达式匹配、捕抓一些我们需要的特定格式的数据非常的方便。比
如,捕抓 "ColumnName=?"  "INSERT ..." "SELECT ..."  "(?,?,?,?)"  等。这样我们就可
以快速的捕抓出这些数据,然后根据命名约定进行数据替换。
         几个正则Pattern(不是太严谨),有关正则的学习,可以参照我Blog中的资源
几个模式:
     匹配    "INSERT ..." "SELECT ..." "DELETE..." "UPDATE ..."    
                "\s*(INSERT|DELETE|SELECT|UPDATE) ((?!\" ).)*"
    
     匹配    " VAR = ?" "VAR<?" "VAR>?" "VAR>=?"
                 \w*\s*  ( \= | \> | \>\= | \<\= | \!\= )   \s*\?
     匹配    "(?, ?, ?, ?)"
                 \( ((?!\().)*\)
    
程序片断

根据约定生成测试值

 


private string GenerateRadomValue(string columnName)
        
{
            
string strRadom = string.Empty;
            
if (columnName.Contains("INT"))
            
{
                Random ran 
= new Random();
                strRadom 
= ran.Next(100).ToString();
            }

            
else if (columnName.Contains("CHR"|| columnName.Contains("VCHR"))
            
{
                strRadom 
= "'aaaa'"// 自己定义
            }

            
else if (columnName.Contains("DAT"|| columnName.Contains("DT")) 
            
{
                strRadom 
= "to_date('2005-11-25 00:00:00', 'yyyy-MM-dd hh24:mi:ss')";
            }

            
return strRadom;
        }

程序下载
        源程序 下载