在做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. ss请cc来家里钓鱼,鱼塘可划分为n*m的格子,每个格子有不同的概率钓上鱼,cc一直在坐标(x,y)的格子钓鱼,而ss每分钟随机钓一个格子。问t分钟后他们谁至少钓到一条鱼的概率大?为多少?

    include "stdafx.h" #include<iostream> #include<vector> #include<math.h> ...

  2. Visual Studio 2017 for Mac Preview

    Microsoft Visual Studio 2017 for Mac Preview 下载+安装+案例Demo 目录: 0. 前言 1. 在线安装器 2. 安装VS 3. HelloWorld 4 ...

  3. Tomcat 7.0 servlet @WebServlet

    在使用tomcat7.0+eclipse j2ee时,新建Dynamic Web Project时, 会让选择是否生成web.xml.无论选择与否,此时新建一个servlet, 可以不在web.xml ...

  4. 【Caffe】利用log文件绘制loss和accuracy(转载)

    (原文地址:http://blog.csdn.net/liuweizj12/article/details/64920428) 在训练过程中画出accuracy 和loss曲线能够更直观的观察网络训练 ...

  5. CF459C Pashmak and Buses 打印全排列

    这题假设将终于的结果竖着看,每一列构成的数能够看成是k进制的数.一共同拥有d列,随意两列都不同样,所以这就是一个d位k进制数全排列的问题,一共同拥有k ^ d个排列.假设k ^ d < n,则打 ...

  6. Android 关于软键盘

    一..弹出的时候显示Editext框 添加布局replay_input <?xml version="1.0" encoding="utf-8"?> ...

  7. Android Thread.UncaughtExceptionHandler异常消息捕获

    public void uncaughtException(Thread thread, Throwable ex) { //处理异常 Log.e("崩溃",thread.getN ...

  8. ClassNotFoundException Log

    Studio 运行时异常: Error:Execution failed for task ':app:compileDebugJavaWithJavac'.> Compilation fail ...

  9. jQuery 插件开发(1)

    JavaScript 是一门混乱的语言,好的特性和坏的特性混杂在一起.而不同浏览器对标准的解析不一致,使得这门语言更加混乱,在这种情况下遵循最佳实践有诸多好处,至少不会掉入坑里.所以就有了<Ja ...

  10. 九度OJ 1003:A+B

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:15078 解决:6299 题目描述: 给定两个整数A和B,其表示形式是:从个位开始,每三位数用逗号","隔开. 现在请计 ...