利用正则表达式类解析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 ...
随机推荐
- Gunicorn、Supervisor
简介 Gunicorn来源于Ruby的unicorn项目,是一个Python WSGI HTTP Server,通过pre-fork worker模型来管理和维护worker. 简而言之就是通过多进程 ...
- CPI
CPI (Consumer Price Index 物价指数) 是政府用来衡量通货膨胀的其中一个数据.通俗的讲,CPI就是市场上的货物价格增长百分比.一般市场经济国家认为CPI在2-3%属于可接受范围 ...
- 【PHP开发】用curl向https发请求时的35号错误
放了个假发现以前写的程序的模拟登陆不管用了,中间输出,发现curl向https发请求时没有返回数据,输出错误信息,得到: curl_errno($ch) -----> 35 curl_error ...
- NSSrting的几种经常使用的使用方法
1.创建NSString字符串 NSString 与 char* 最大的差别就是 NSString是一个objective对象,而char* 是一个字节数组. @+" 字符串 " ...
- 关于-O0、O1、O2、O3优化
少优化->多优化: O0 -->> O1 -->> O2 -->> O3 -O0表示没有优化,-O1为缺省值,-O3优化级别最高 整理自网络,仅供参考 1.- ...
- JS之字符串与JSON转换
JS之字符串转换JSON 1.eval 古老的方式 function strToJson(str){ var json = eval('(' + str + ')'); return json; ...
- 题解 P1001 【A+B Problem】
#include<iostream> using namespace std; #define I int a,b; #define AK cin>>a>>b; # ...
- 搭建vps***
快速搭建ShadowSocks wget --no-check-certificate -O shadowsocks.sh https://raw.githubusercontent.com/tedd ...
- SD相关的表
[转] 一.客户主数据基本数据放在KNA1里:公司代码放在KNB1里:销售视图放在KNVV里:合作伙伴放在KNVP里:二.信用主数据KNKK里有信贷限额.应收总额.特别往来:S066里是未清订单值:S ...
- keras: 在构建LSTM模型时,使用变长序列的方法
众所周知,LSTM的一大优势就是其能够处理变长序列.而在使用keras搭建模型时,如果直接使用LSTM层作为网络输入的第一层,需要指定输入的大小.如果需要使用变长序列,那么,只需要在LSTM层前加一个 ...