在做RIS的项目中遇到一个问题, 因为Worklist要兼容各个RIS数据库, 因此设计了目前这个架构。
1.xml文件来配置RIS数据库的数据源,
2.xml文件来存储关于查询/更新数据库的SQL语句, 其中参数/值输入可用用{x}来代替。 如{0}代表第一个参数
3.xml来配置Worklist SCU的query的字段和数据库字段的映射, 可以用Tag ID或者Tag Name与数据库中的Column名来匹配。
4.工作流程: Worklist SCU发出Query, WorklistSCP收到后利用映射文件, 解析成要查询的column名字,根据xml中查询数据库的xml的模板,生成真正的Sql查询语句。调用数据库API执行Sql语句。


 public class RISQueryHelper
{
public string BuildSelectQuery(string select)
{
if (String.IsNullOrEmpty(select))
{
throw new ArgumentNullException("input select query is null.");
} string query = select.Replace("@", "").Replace("'", "'"); return query;
} public string BuildUpdateQuery(string update, params object[] columnValues)
{
if (String.IsNullOrEmpty(update))
{
throw new ArgumentNullException("input sql statement is null or empty.");
} BuildTableRelationship(update); string sql = update.Replace("@", "").Replace("'", "'"); //Sql template mark the parameter by{x},x like: 1,2,3,4,5,...n
//For example: UPDATE @RequestedProcedure SET @Status='{0}' WHERE @Order_Refid IN (SELECT @Refid FROM @Orders WHERE @AccessionNo='{1}';
//So we can use String.Format to replace {x} by our real value.
{
sql = String.Format(sql, columnValues);
} return sql;
} public void BuildTableRelationship(string update)
{
//{Get table & column name, we will use these data to construct relationship between tables and column for further.
string[] tables = null;
string[] cols = null; if (!BuildUpdateQueryArgs(update, out tables, out cols))
{
throw new Exception("Build sql statement failed. Input sql is : " + update);
}
//end, need to parse when statement has many tables.}
} public bool BuildUpdateQueryArgs(string update, out string[] tableNames, out string[] columnNames)
{
if (String.IsNullOrEmpty(update))
{
throw new ArgumentNullException("input select query is null.");
} List<string> tables = new List<string>();
List<string> columns = new List<string>();
string sql = update; BuildTableNames(ref sql, ref tables);
BuildColumnNames(ref sql, ref columns); tableNames = tables.ToArray();
columnNames = columns.ToArray(); return true;
} private void BuildTableNames(ref string sql, ref List<string> tables)
{
var statement = Regex.Matches(
sql,
@"\bfrom\b.+?\bwhere\b|\bupdate\b.+?\bset\b",
RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace | RegexOptions.Multiline); foreach (Match t in statement)
{
//delete table operation from sql statement.
sql = sql.Replace(t.Value, ""); //save table name
tables.Add(Regex.Replace(t.Value, @"\bupdate\b|@|\bset\b|\s|\bfrom\b|\bwhere\b", "", RegexOptions.IgnoreCase));
}
} private void BuildColumnNames(ref string sql, ref List<string> columns)
{
var statement = Regex.Matches(
sql,
@"@\w+\b\s*=",
RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace | RegexOptions.Multiline); foreach (Match t in statement)
{
//delete column operation from sql statement.
sql = sql.Replace(t.Value, ""); //save column name
columns.Add(Regex.Replace(t.Value, @"@|\s|=", "", RegexOptions.IgnoreCase));
}
}
}

利用正则表达式类解析SQL语句,达到Worklist兼容各个RIS数据库的目的的更多相关文章

  1. 利用 druid 的 sql parser 模块解析 sql 语句

    druid 是阿里开源在 github 上面的数据库连接池,里面有一个专门解析 sql 语句的模块   源码位置: https://github.com/alibaba/druid SQL Parse ...

  2. Java代码实体类生成SQL语句(Java实体类转数据库)

    有的时候把数据库删了,如果照着实体类重新创建数据库的话比较麻烦,可以使用这个工具,把代码复制到项目里面设置一下即可把Java代码中的实体类转换为SQL语句输出为一个文件,打开执行命令即可. 下载:ht ...

  3. 自己写的Python数据库连接类和sql语句拼接方法

    这个工具类十分简单和简洁. sql拼接方法 # encoding=utf-8 from django.http import HttpResponse from anyjson import seri ...

  4. PHP——分页显示的完善(加查询,用类简化sql语句)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. 转:C#制作ORM映射学习笔记二 配置类及Sql语句生成类

    在正式开始实现ORM之前还有一点准备工作需要完成,第一是实现一个配置类,这个很简单的就是通过静态变量来保存数据库的一些连接信息,等同于.net项目中的web.config的功能:第二需要设计实现一个s ...

  6. 解析sql语句中left_join、inner_join中的on与where的区别

    以下是对在sql语句中left_join.inner_join中的on与where的区别进行了详细的分析介绍,需要的朋友可以参考下 table a(id, type):id     type ---- ...

  7. 利用反射自动生成SQL语句(仿Linq)

    转:http://www.cnblogs.com/the7stroke/archive/2012/04/22/2465597.html using System; using System.Colle ...

  8. 反射实体类拼接SQL语句

    实体类基类: using System; using System.Collections.Generic; using System.Linq; using System.Reflection; u ...

  9. 利用反射动态构成sql语句

    class Program     {         static void Main(string[] args)         {             People p = new Peo ...

随机推荐

  1. Linux kernel manpages

    https://www.linuxquestions.org/questions/linux-newbie-8/man-pages-for-kernel-functions-758389/ 在Linu ...

  2. 12 redis之aof日志持久化

    Aof 的配置 appendonly no # 是否打开 aof日志功能 appendfsync always # 每1个命令,都立即同步到aof. 安全,速度慢 appendfsync everys ...

  3. ios --转载 使用SMSSDK实现短信验证:

    1.先到http://www.mob.com/#/网站注册账号,然后下载最新的sdk(有Android和iOS两个版本,根据需要进行下载) 2.进入到后台选择SecurityCodeSDk(支持全球短 ...

  4. iOS_39_触摸解锁

    终于效果图: 控制器: // // BeyondViewController.m // 39_触摸解锁 // // Created by beyond on 14-9-17. // Copyright ...

  5. iOSPOI检索详细总结

    iOS百度地图路径规划和POI检索详细总结 路径规划.png 百度地图的使用 百度地图API的导入网上说了许多坑,不过我遇到的比较少,这里就放两个比较常见的吧.坑一: 奥联WIFI_xcodeproj ...

  6. Android 自定义View跑马灯效果(一)

    今天通过书籍重新复习了一遍自定义VIew,为了加强自己的学习,我把它写在博客里面,有兴趣的可以看一下,相互学习共同进步: 通过自定义一个跑马灯效果,来诠释一下简单的效果: 一.创建一个类继承View, ...

  7. LA 3882 And Then There Was One[约瑟夫问题的变形]

    And Then There Was One UVALive - 3882 Sample Input   Sample Output //设f[i]为(原约瑟夫问题)第i次要删除的标号 #includ ...

  8. Asp.Net中判断是否登录,及是否有权限?

    不需要在每个页面都做判段, 方法一:只需要做以下处理即可 using System; using System.Collections.Generic; using System.Linq; usin ...

  9. ArcGIS api for js OverviewMap(鹰眼/概览图)

    说明.本篇博客中主要介绍 地图显示在某个div情况 1.运行效果 2.HTML <!DOCTYPE html> <html> <head> <meta htt ...

  10. [Python]Pip换源以及设置代理

    Install python package with proxy sudo pip install python-magic --proxy=https://your-proxy.com 2.No ...