• .NET参数化Oracle查询参数


    • 最近在做数据库移植工作(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定义准确了也一样

  • 相关阅读:
    Android设置RadioButton在文字的右边
    如何创建启动界面Splash Screen
    sqlite3 数据类型 批量插入
    为PopupWindow设置弹出动画效果
    android activity生命周期
    Eclipse快捷键大全
    SQLite的使用
    创建窗口式Activity
    Android中实现按钮自动隐藏
    android技术片段
  • 原文地址:https://www.cnblogs.com/Dylanblogs/p/4167943.html
Copyright © 2020-2023  润新知