• 最近在做数据库移植工作(SqlServer 2008 -> Oracle 11g),遇到一些不兼容的问题,以下是一个参数化方面的区别,资料来自其他网友,在此整理了一下。
  • public static String ConnectionString = "Data Source=orcl;User ID=hr;Password=hr;";
  • public static int Update(MacInfo model)
  • {
  • StringBuilder strSql = new StringBuilder();
  • strSql.Append("update MacInfo set ");
  • strSql.Append("Mac_Address=:Mac_Address,");
  • strSql.Append("Mac_Status=:Mac_Status");
  • strSql.Append(" where MacInfo_ID=:MacInfo_ID");
  • //strSql.Append("Mac_Address='"+model.Mac_Address+"',");//拼凑Update字符串是可以执行成功的
  • //strSql.Append("Mac_Status="+model.Mac_Status);
  • //strSql.Append(" where MacInfo_ID='"+model.MacInfo_ID+"'");
  • //这里注意,strSql中的Update语句参数顺序为:Mac_Address、Mac_Status、MacInfo_ID,所以下面OracleParameter
  • //也必须按这个顺序来声明、赋值
  • OracleParameter[] parameters = {
  • new OracleParameter(":Mac_Address", OracleDbType.Varchar2,17),
  • new OracleParameter(":Mac_Status", OracleDbType.Int32,4),
  • new OracleParameter(":MacInfo_ID", OracleDbType.Varchar2,17)};
  • parameters[0].Value = model.Mac_Address;
  • parameters[1].Value = model.Mac_Status.ToString();
  • parameters[2].Value = model.MacInfo_ID;
  • int result = ExecuteCommand(strSql.ToString(), CommandType.Text,parameters);
  • return result;
  • }
  • public static int ExecuteCommand(string queryString, CommandType commandType, params OracleParameter[] param)
  • {
  • int flag = 0;
  • using(OracleConnection con = new OracleConnection(ConnectionString))
  • {
  • OracleCommand command = new OracleCommand(queryString, con);
  • command.CommandType = commandType;
  • if(param != null)
  • {
  • for(int i = 0; i < param.Length; i++)
  • {
  • command.Parameters.Add(param[i]);
  • }
  • }
  • try
  • {
  • command.Connection.Open();
  • flag = command.ExecuteNonQuery();
  • }
  • catch(Exception ex)
  • {
  • throw ex;
  • }
  • finally
  • {
  • command.Connection.Close();
  • command.Dispose();
  • command = null;
  • }
  • }
  • return flag;
  • }
  • 总结一下:
  • 使
    用参数化 DbCommand 的一个缺点是需要参数的代码将仅适用于支持相同语法的提供程序。OLEDB、SqlClient 和 Oracle
    提供程序全部使用不同的语法。例如,用于命名和指定参数的 SQL 语法使用 @ 符号,OLEDB 参数语法需要使用问号 (?) 作为参数占位符,而
    Oracle 提供程序使用冒号 (:)。

    string sqlstr = " select * from table where id=@id and name=@name ";
    System.Data.SqlClient.SqlParameter parameters = newSystem.Data.SqlClient.SqlParameter[2];
    parameters[0] = new SqlParameter("@id", uid);
    parameters[1] = new SqlParameter("@name", name);

    string sqlstr = " select * from table where id=? and name=? ";
    System.Data.OleDb.OleDbParameter parameters = new System.Data.OleDb.OleDbParameter[2];
    parameters[0] = new OleDbParameter("id", uid);
    parameters[1] = new OleDbParameter("name", name);

    string sqlstr = " select * from table where id=:id and name=:name ";
    System.Data.OracleClient.OracleParameter parameters = new System.Data.OracleClient.OracleParameter[2];
    parameters[0] = new OracleParameter(":id", uid);
    parameters[1] = new OracleParameter(":name", name);

    在通过OLEDB传递参数时候需要注意的问题

    对于ACCESS数据库 可以是?cmd.CommandText = "insert into shop(ShopName,ShopAddress) Values(@sn,@sadd)";

    但是对于SQL数据库 就是cmd.CommandText = "insert into shop(ShopName,ShopAddress) Values(?,?)";

    而且在ACCESS中对于传递的参数的添加顺序 即使给出变量名 也必须和SQL语句调用的顺序一致 否则会出错

    比如

    ? cmd.CommandText = "insert into shop(ShopName,ShopAddress) Values(@sn,@sadd)";
    cmd.Parameters.Clear();

    p = new OleDbParameter();
    p.ParameterName = "@sn"; p.OleDbType = OleDbType.Char; p.Value = sn;
    cmd.Parameters.Add(p);

    p = new OleDbParameter();
    p.ParameterName = "@sadd"; p.OleDbType = OleDbType.Char; p.Value = sadd;
    cmd.Parameters.Add(p);

    因为语句中Values(@sn,@sadd)

    @sn在@sadd之前 如果你在写参数的时候把?@sn?和@sadd的顺序写反 那么传递的参数也会反过来 即使你的?p.ParameterName定义准确了也一样

.NET参数化Oracle查询参数的更多相关文章

  1. oracle查询所有初始化参数(含隐含参数)

    年龄大了,感觉记性不是很好了,还是重新做笔记了.最近在整理些稿子,顺便在记录下oracle查询所有初始化参数(含隐含参数): SELECT i.ksppinm name, i.ksppdesc des ...

  2. 45 个非常有用的 Oracle 查询语句

    ​ 这里我们介绍的是 40+ 个非常有用的 Oracle 查询语句,主要涵盖了日期操作,获取服务器信息,获取执行状态,计算数据库大小等等方面的查询.这些是所有 Oracle 开发者都必备的技能,所以快 ...

  3. Solr学习总结(四)Solr查询参数

    今天还是不会涉及到.Net和数据库操作,主要还是总结Solr 的查询参数,还是那句话,只有先明白了solr的基础内容和查询语法,后续学习solr 的C#和数据库操作,都是水到渠成的事.这里先列出sol ...

  4. Linux 下 Oracle 内核参数优化

    数据库的性能优化涉及到整个数据库运行环境的方方面面,诸如操作系统,Oracle自身,存储,网络等等几个大块.而操作系统则是Oracle稳定运行与最大化性能的基石.本文主要描述基于Linux系统下 Or ...

  5. 【转】Solr客户端查询参数总结

    今天还是不会涉及到.Net和数据库操作,主要还是总结Solr 的查询参数,还是那句话,只有先明白了solr的基础内容和查询语法,后续学习solr 的C#和数据库操作,都是水到渠成的事.这里先列出sol ...

  6. 40多个非常有用的Oracle 查询语句

    给大家介绍是40多个非常有用的Oracle 查询语句,主要涵盖了日期操作,获取服务器信息,获取执行状态,计算数据库大小等等方面的查询.这些是所有Oracle 开发者都必备的技能,所以快快收藏吧! 日期 ...

  7. 45个非常有用的 Oracle 查询语句小结

    45个非常有用的 Oracle 查询语句小结 这里我们介绍的是 40+ 个非常有用的 Oracle 查询语句,主要涵盖了日期操作,获取服务器信息,获取执行状态,计算数据库大小等等方面的查询.这些是所有 ...

  8. 45 个非常有用的 Oracle 查询语句(转)

    这里我们介绍的是 40+ 个非常有用的 Oracle 查询语句,主要涵盖了日期操作,获取服务器信息,获取执行状态,计算数据库大小等等方面的查询.这些是所有 Oracle 开发者都必备的技能,所以快快收 ...

  9. Oracle中关于处理小数点位数的几个函数,取小数位数,Oracle查询函数

    Oracle中关于处理小数点位数的几个函数,取小数位数,Oracle查询函数 关于处理小数点位数的几个oracle函数()1. 取四舍五入的几位小数select round(1.2345, 3) fr ...

随机推荐

  1. 什么是LED锡膏?

    LED锡膏熔点172℃,俗称中温锡膏,其合金为Sn64Bi35Ag1,此类产品是含Bi类的低熔点无铅锡膏,加入Ag改变了SnBi合金的焊点的机械强度.大幅度提高焊点可靠性,适用于高频调谐器系列产品的贴 ...

  2. QT中静态库的生成与使用——创建共享库代码,附例子

    一. 静态库的生成    1. 测试目录: lib    2. 源码文件名: mywindow.h, mywindow.cpp, 类MyWindow继承于QPushButton, 并将文字设置为&qu ...

  3. RedisService

    package com.sprucetec.bone.common.redis;import com.alibaba.fastjson.JSON;import org.springframework. ...

  4. flume 日志采集工具

    Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集.聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据:同时,Flume提供对数据进行简单处理,并 ...

  5. GitHub Android 最火开源项目Top20 GitHub 上的开源项目不胜枚举,越来越多的开源项目正在迁移到GitHub平台上。基于不要重复造轮子的原则,了解当下比较流行的Android与iOS开源项目很是必要。利用这些项目,有时能够让你达到事半功倍的效果。

    1. ActionBarSherlock(推荐) ActionBarSherlock应该算得上是GitHub上最火的Android开源项目了,它是一个独立的库,通过一个API和主题,开发者就可以很方便 ...

  6. VM 映像

     让我们一起欢呼吧!随着最近Microsoft Azure运行时的发布,我们非常高兴地宣布发布 OS映像的继承性产品:新 VM映像.等一下-有些人可能会觉得这听起来有点耳熟.没错,一个月前在旧金山 ...

  7. 动态规划以及在leetcode中的应用

    之前只是知道动态规划是通过组合子问题来解决原问题的,但是如何分析,如何应用一直都是一头雾水.最近在leetcode中发现有好几道题都可以用动态规划方法进行解决,就此做下笔录. 动态规划:应用于子问题重 ...

  8. java的数学函数总结

    java的数学函数都放在java.lang这个包中,并且这些函数的方法在类Math中是作为static方法出现的,所以要引用一个特定的函数,只需将类Math和一个圆点写在要使用的方法前就好.如方法sq ...

  9. js调试若干

    主要是将 chrome调试工具   firebug的控制台对以下都有支持 consoleAPI https://developers.google.com/chrome-developer-tools ...

  10. vs2013出现ISO C++ conformant解决办法

    出现:错误    1    error C4996: 'strnset': The POSIX name for this item is deprecated. Instead, use the I ...