c 验证oracle地址,C#:Oracle数据库带参PLSQL语句的正确性验证

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

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

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

using Oracle.ManagedDataAccess.Client;

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

///

/// 验证sql语句

///

///

///

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表示加密,并给出了一个加密链接字符串。

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

///

/// 获取连接字符串

///

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;

}

}

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

af4aec526912ea129eb8a6b37cb70efa.png

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

oracle数据库中的基本语句

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

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

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

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

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

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

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

oracle中带参存储过程的使用

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

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

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

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

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

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

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

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

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

随机推荐

.Net下的 ORM框架介紹

在.NET平台下,关于数据持久层框架非常多,本文主要对如下几种做简要的介绍并推荐一些学习的资源: 1.NHibernate 2.NBear 3.Castle ActiveRecord 4.iBATIS ...

深入理解Java多态机制

从字节码层面来看,Java中的所有方法调用,最终无外乎转换为如下几条调用指令. invokestatic: 调用静态方法. invokespecial: 调用实例构造器方法,私 ...

db2使用Java存储过程实现MD5函数

1.数据库版本 2.Java脚本 import java.security.MessageDigest; import COM.ibm.db2.app.UDF; public class MD5UDF ...

如何提高banner设计含量--网上的一篇文章--感悟

"修改": 本质上是改什么?改大小?图片?文字?颜色? 老板说:修改本质上是提高“设计含量”.检测一个作品设计含量的高低,可以将作品中每一个设计元素进行分析,看它的“属性”与“操作 ...

Luogu P1596 [USACO10OCT]湖计数Lake Counting

题目描述 Due to recent rains, water has pooled in various places in Farmer John's field, which is repres ...

java中使用hashSet的特性,判断数组是否有重复值

public static boolean cheakRepeat(int[] array){ HashSet hashSet = new HashSet

jupyter notebook 代码补全插件工具-nbextensions(并修改默认的工作目录)

# conda install -c conda-forge jupyter_contrib_nbextensionsCollecting package metadata: doneSolving ...

C# WInForm中 窗体的this.width和this.height的属性值不能大于显示器的最大分辨率

最近在做一个小项目的时候,发现在 1680x1050 分辨率显示器上写的代码,将窗体的宽度和高度 设置成了 1600×900,在高于1600×900的分辨率上缩放显示很正常, 而后转移到 分辨率低于 ...

【重要】U3D存放本地游戏存档——不同平台载入XML文件的方法——IOS MAC Android

在PC上和IOS上读取XML文件的方式略有差别,经测试,IOS上不支持如下方法载入XML文件: XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load( ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值