在有Oracle数据库C#项目中,有一个这样的需求:在界面上配置了带参数的PLSQL语句,但是要通过程序验证其正确性,那么该如何实现?这就是本文要探讨的内容。

一:通过OracleCommand对象的ExecuteNonQuery方法验证

    这个方法要用到Oracle.ManagedDataAccess.dll,首先要将oracle客户端目录下的该文件拷贝的项目中并添加引用。可以在项目中新增一个验证SQL语句的公共类并using。(例如:ValidateSQL.cs)

using Oracle.ManagedDataAccess.Client;

接下来可以在这个公共类中写上一个通用的SQL验证方法:

    /// <summary>
/// 验证sql语句
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
public bool ValidateSQL(string sql ,out string strmsg)
{
bool bResult;
using (OracleConnection connection = new OracleConnection(this.connectionString))
{
OracleCommand cmd = connection.CreateCommand();
connection.Open();
cmd.CommandText = "set autotrace traceonly";
//cmd.ExecuteNonQuery();
try
{
cmd.CommandText = sql;
cmd.ExecuteNonQuery();
bResult = true;
strmsg = "SQL语句验证通过!";
}
catch (Exception ex)
{
if (ex.Message.ToString().Contains("ORA-01008"))
{
//如果ORACLE错误号为未绑定变量,则说明语句正确
bResult = true;
strmsg = "SQL语句验证通过!";
}
else
{
bResult = false;
strmsg = "验证出错:" + ex.Message;
}
}
finally
{
//cmd.CommandText = "set autotrace off";
//cmd.ExecuteNonQuery();
}
}
return bResult;
}

一般情况下如果SQL语句中如果没有带参数,则可以直接验证通过。如果存在参数,那么则需要一些技巧,就是在catch中判断错误号。

由于Oracle数据中对错误号的定义是固定的,不受版本号的影响。并且PLSQL脚本在执行的过程中,判断参数的顺序一半都靠后,往往是最后才会去判断。

那么如果语句有错误,会直接抛出来。如果错误号为“ORA-01008”,那么说明变量没有绑定。此时SQL语句一定是正确的。

此方法中要用到数据连接字符串,通过链接字符串重新创建OracleCommand对象来实现语句的验证。

那么,就会出现如下问题:如果字符串是加密的,那么就会有无法正常建立连接,怎么办?

二:加密字符串的数据库连接与SQL验证

如果链接字符串是加密字符串,此时必须先解密再进行SQL脚本的判断。如果此时调用上面的方法,直接进行判断,会出现“链接字符串非法”,这样的错误出现。

比如我的链接字符串是放在web.config的配置中,然后我配置了一个是否加密的节点,value为true表示加密,并给出了一个加密链接字符串。

<add key="ConStringEncrypt" value="true" />
<add key="ConnectionString" value="F4107C21837F889831795CA2637F77F119EE4F3108F882C0A8F27BE676B57C78B7AB9D8BFC406475A027E1FF2F2FF69626FCB0003F2D8BB99481EFC760A48FA6A2798764FE9D94E4" />

那么此时通过OracleCommand对象的ExecuteNonQuery方法验证语句时,就需要解密。代码如下:

    /// <summary>
/// 获取连接字符串
/// </summary>
public static string ConnectionString
{
get
{
string _connectionString = ConfigurationManager.AppSettings["ConnectionString"];
//获取是否加密的连接字符串的配置
string ConStringEncrypt = ConfigurationManager.AppSettings["ConStringEncrypt"];
if (ConStringEncrypt == "true")
{
//如果已加密,需要先解密(假设密钥为dotnet,解密方法为Decrypt)
_connectionString = Decrypt(_connectionString,"dotnet");
}
return _connectionString;
}
}

将解密后的连接字符串带入上面的方法中,在进行验证就好了。效果如下图所示:

注明:本文章为Healer007原创,署名:小萝卜。如需转载请注明出处!

C#:Oracle数据库带参PLSQL语句的正确性验证的更多相关文章

  1. oracle数据库中的基本语句

    下面的都是最基本的oracle数据库的数据查询语句,这是我在网上整理的一份文档,方便以后自己的查看,当然,能把这些记下来就是最好的. 说明:查询表中的数据 1. select * from emp; ...

  2. oracle数据库删除数据Delete语句和Truncate语句的对比

    oracle数据库删除数据Delete语句和Truncate语句的对比 当表中的数据不需要时,则应该删除该数据并释放所占用的空间,删除表中的数据可以使用Delete语句或者Truncate语句,下面分 ...

  3. oracle数据库查询日期sql语句(范例)、向已经建好的表格中添加一列属性并向该列添加数值、删除某一列的数据(一整列)

    先列上我的数据库表格: c_date(Date格式)     date_type(String格式) 2011-01-01                   0 2012-03-07         ...

  4. Oracle数据库常用的Sql语句整理

    Oracle数据库常用的Sql语句整理 查看当前用户的缺省表空间 : select username,default_tablespace from user_users; 2.查看用户下所有的表 : ...

  5. oracle中带参存储过程的使用

    Oracle中存储过程带参分为:输入参数(in)和输出参数(out) 例如: create or replace procedure out_test(v_user in emp.user_name% ...

  6. Oracle之带参存储过程(存储过程中for循环调用存储过程)

    --带参存储过程create or replace procedure testdate(v in number) is i number; begin i:=v; insert into test_ ...

  7. oracle数据库查看用户相关语句

    1.查看所有用户:   select * from dba_users;   select * from all_users;   select * from user_users;   2.查看用户 ...

  8. Oracle数据库 数据完整性和DML语句

    数据完整性和DML语句 数据完整性 数据完整性(Data Integrity)是指数据的精确性(Accuracy) 和可靠性(Reliability).它是应防止数据库中存在不符合语义规定的数据和防止 ...

  9. oracle数据库如何保存SQL语句?

    比如:通过系统web页面自动生成了sql语句,insert into temp(select '1,2,3',to_date(sysdate,'yyyy--mm-dd hh24:mi:ss') fro ...

随机推荐

  1. 常见算法是js实现汇总(转载)

    常见算法是js实现汇总 /*去重*/ <script> function delRepeat(arr){ var newArray=new Array(); var len=arr.len ...

  2. MapReduce --全排序

    MapReduce全排序的方法1: 每个map任务对自己的输入数据进行排序,但是无法做到全局排序,需要将数据传递到reduce,然后通过reduce进行一次总的排序,但是这样做的要求是只能有一个red ...

  3. [DiocpRPC]介绍与安装

    介绍:    Diocp-RPC组件基于DIOCP进行扩展开发,通信协议基于HTTP,遵循RESTFul开发模式,可以用户三层开发.IDE可以支持大于等于D7的IDE,服务端组件支持Win32/Win ...

  4. 【Android测试】【随笔】性能采集工具——小松鼠诞生记

    ◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/4945066.html 起因 去年刚加入TX的时候,我便接手 ...

  5. VS2005 “无法在证书存储区中找到清单签名证书”错误的解决方法

    方法一:在VS2005中出现该错误时,用记事本打开项目的.csproj文件,删除以下内容即可:    <ManifestCertificateThumbprint>B531F2CF2227 ...

  6. jquery load 加载改造,只加载body

    背景: 项目中大量用到了jquery和easyui组件,原生load经常出现主页面异常,原因是组件被重复初始化.也考虑过用iframe,但是在实际项目中的效果,最终取消了iframe方案,也尝试了其他 ...

  7. 用Backbone.js创建一个联系人管理系统(二)

    欢迎大家回来继续这一教程,第一部分我们学习了model,collection和view在Backbone中的 基本用法,还有怎么样用主视图去绑定collection去渲染出每个Contact. 这部分 ...

  8. 2600: [Ioi2011]ricehubh

    Description 乡间有一条笔直而长的路称为"米道".沿着这条米道上 R 块稻田,每块稻田的坐标均为一个 1 到 L 之间(含 1 和 L)的整数.这些稻田按照坐标以不减的顺 ...

  9. 一个叫 team 的表,里面只有一个字段name, 一共有4 条纪录,分别是a,b,c,d, 对应四个球队,现在四个球队进行比赛,用一条sql 语句显示所有可能的比赛组合.

    select *from timp a, timp b where a.name > b.name 结果:

  10. 编译jsoncpp库以及要注意的问题

    原创文章,转载请注明原作者与本文原始URL. 版本:jsoncpp-src-0.5.0.zip简介:jsoncpp是用cpp实现的json库,可以拼装,解析,生成json串.我们要把他编译成动态库.这 ...