• 最近在做数据库移植工作(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. HUB主要芯片方案

    HUB主要品牌:慧荣.擎泰.联盛  安国.创惟 创惟GL850G简介:拥有低耗电.温度低及接脚数减少等产品特性.它支援4个下游连接埠,采用48 pin LQFP封装,可完全支援USB 2.0/1.1规 ...

  2. android ListView的上部下拉刷新下部点击加载更多具体实现及拓展

    android ListView的上部下拉刷新下部点击加载更多具体实现及拓展 ListView下拉刷新,上拉自动加载更多 下拉刷新以及加载更多

  3. 自己模拟实现math.h中的函数

    之前一直都很迷惑pow()函数时怎么实现的,对于整数次的幂我还能很容易做到,但是对于分数次幂就不是那么好做了.需要一些高等数学级数的知识. 我这里实现了求ln(x), pow(double x, do ...

  4. java程序错误类型及异常处理

    一.程序的错误类型 在程序设计中,无论规模是大是小,错误总是难免的.程序的设计很少有能够一次完成,没有错误的(不是指HelloWorld这样的程序,而是要实现一定的功能,具备一定实用价值的程序),在编 ...

  5. android播放html5视频,仅仅有声音没有图像视频

    在AndroidManifest.xm中l增加 <activity .... android:hardwareAccelerated="true" />

  6. javascript操作JSON字符

    1.先要区分JSON字符串和JSON对象 JSON字符串: Var strJSON = “{“Area”:[{“AreaId”:”123”},{“AreaId”:”345”}]}”,   或者 Var ...

  7. iOS 中多线程的简单使用

    iOS中常用的多线程操作有( NSThread, NSOperation GCD ) 为了能更直观的展现多线程操作在SB中做如下的界面布局: 当点击下载的时候从网络上下载图片: - (void)loa ...

  8. The Painter's Partition Problem Part I

    (http://leetcode.com/2011/04/the-painters-partition-problem.html) You have to paint N boards of leng ...

  9. linux:如何修改用户的密码

    1.首先,要用CRT软件连接Linux系统. 2.首选,确认是用root用户登录系统的. 输入命令: id ,查看登录用户信息. 3.若修改root自己的密码,直接输入 passwd . 输入两遍,新 ...

  10. new Date()的参数

    前两天发现手机页面的倒计时在Android上正常显示,在iPhone却不能显示. 后来又发现在ff和ie里也不显示.(以前只在chrome里看过,显示正常). 后来同事改了new Date()里字符串 ...