在有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原创,署名:小萝卜。如需转载请注明出处!

最新文章

  1. JPA 2.1 Coverter 注解
  2. Leetcode#128 Longest Consecutive Sequence
  3. Squish License
  4. Photoshop:笔刷制作和安装
  5. 【C++深入浅出】智能指针之auto_ptr学习
  6. 查看linux服务器版本
  7. OpenSuse如何共享目录
  8. Merge k Sorted Lists 解答
  9. IO库 8.3
  10. 企业架构研究总结(25)——TOGAF架构开发方法(ADM)之迁移规划阶段
  11. Spring的5种事物配置方式
  12. 3.WP8.1开发_为控件增加动画
  13. Log4net快速配置使用指南。(快速搭建log4net日志平台手册)
  14. 显示mysql线程和kill线程的命令
  15. .Net与 WebAssembly 随笔
  16. Redux系列x:源码解析
  17. 九度 1254:N皇后问题
  18. 伸展树的实现——c++
  19. Factory - 工厂模式
  20. 符合语言习惯的 Python 优雅编程技巧

热门文章

  1. C#将Enum枚举映射到文本字符串
  2. 新手接触java
  3. 解决WordPress中无法将上传的文件移动至wp-content/uploads
  4. CentOS6.4完全安装FFmpeg手记
  5. 自定义安装php开发环境(1)--apache和php整合
  6. 苹果会在明后年推出13寸屏iPad吗?
  7. MVC_Ajax请求
  8. Event --mysql的scheduler.md
  9. iOS 用代码+Xib搭建UI界面实例
  10. java实验三20135104