利用正则表达式类解析SQL语句,达到Worklist兼容各个RIS数据库的目的
在做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数据库的目的的更多相关文章
- 利用 druid 的 sql parser 模块解析 sql 语句
druid 是阿里开源在 github 上面的数据库连接池,里面有一个专门解析 sql 语句的模块 源码位置: https://github.com/alibaba/druid SQL Parse ...
- Java代码实体类生成SQL语句(Java实体类转数据库)
有的时候把数据库删了,如果照着实体类重新创建数据库的话比较麻烦,可以使用这个工具,把代码复制到项目里面设置一下即可把Java代码中的实体类转换为SQL语句输出为一个文件,打开执行命令即可. 下载:ht ...
- 自己写的Python数据库连接类和sql语句拼接方法
这个工具类十分简单和简洁. sql拼接方法 # encoding=utf-8 from django.http import HttpResponse from anyjson import seri ...
- PHP——分页显示的完善(加查询,用类简化sql语句)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 转:C#制作ORM映射学习笔记二 配置类及Sql语句生成类
在正式开始实现ORM之前还有一点准备工作需要完成,第一是实现一个配置类,这个很简单的就是通过静态变量来保存数据库的一些连接信息,等同于.net项目中的web.config的功能:第二需要设计实现一个s ...
- 解析sql语句中left_join、inner_join中的on与where的区别
以下是对在sql语句中left_join.inner_join中的on与where的区别进行了详细的分析介绍,需要的朋友可以参考下 table a(id, type):id type ---- ...
- 利用反射自动生成SQL语句(仿Linq)
转:http://www.cnblogs.com/the7stroke/archive/2012/04/22/2465597.html using System; using System.Colle ...
- 反射实体类拼接SQL语句
实体类基类: using System; using System.Collections.Generic; using System.Linq; using System.Reflection; u ...
- 利用反射动态构成sql语句
class Program { static void Main(string[] args) { People p = new Peo ...
随机推荐
- android studio 更新Gradle版本号方法
在导入其它项目时,常常因为gradle版本号不一致而导致不能编译 解决方法: 第一步: 按提示点击让它下载.事实上目的并非要它下载.因为这样速度会非常慢.这样做仅仅是为了让它在本地创建相应的文件夹结构 ...
- Centos 7.0系统服务管理
从Centos7开始,不再用sysvinit管理系统服务了,而是改用了systemd,因此对系统服务管理方法已经变更,以下简述 1.查看当前所有系统服务的状态 systemctl 2.查看指定系统服务 ...
- 【PHP开发】ThinkPHP3.1.3问题集及解决方法
Outline: 无法获取post请求中的url参数的问题 中文存入数据表后为空字符串 1. 无法获取post请求中的url参数的问题 ThinkPHP3.1.3中,如果提交的post请求中,如果要在 ...
- ScrollView分析
本文转载至 http://blog.sina.com.cn/s/blog_a843a8850101dsg5.html Properties alwaysBounceHorizontal ...
- Easyui combobox 怎么加载数据
说明:开发环境 vs2012 asp.net mvc4 c# 1.效果图 2.HTML代码 <%@ Page Language="C#" AutoEventWireup=&q ...
- 九度OJ 1175:打牌 (模式匹配)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:8156 解决:1560 题目描述: 牌只有1到9,手里拿着已经排好序的牌a,对方出牌b,用程序判断手中牌是否能够压过对方出牌. 规则:出牌 ...
- vc2013使用经验
1 find all reference功能需要visual assist的帮助 vs2013自己的查找不行,所以可以安装visual assist X,这样的话,就可以支持快速准确的referenc ...
- Dijkstra的堆优化
先附上一个例题:P3371 [模板]单源最短路径 一眼扫去,最短路... spfa可行,但是今天的主题是Dijkstra: #include<iostream> #include<a ...
- PYTHON加密解密字符串
依赖包安装部分 安装依赖包: pip install pycryptodome 在你的python环境中的下图红框路径中找到 crypto 将其改成 Crypto 代码部分 #!/usr/bin/en ...
- 打开Vs2010时,卡在加载工具箱内容 不动了
我是直接打开Visual Studio 2010,而不是以打开解决方案的方式打开.然后就在左下角显示“正在从包‘Microsoft.VisualStudio.IDE.ToolboxControlsIn ...