zoukankan      html  css  js  c++  java
  • sql zhuan ORACLE

    DbType   OracleType

    SqlDatabase  OracleDatabase

     SqlParam.cs

    SqlServerHelper.cs

    InsertByHashtableReturnPkVal

     sql as oracle 无

    public DataTable GetPageList(string sql, SqlParam[] param, string orderField, string orderType, int pageIndex, int pageSize, ref int count)
    {
    StringBuilder sb = new StringBuilder();
    DataTable result;
    try
    {
    int num = (pageIndex - 1) * pageSize;
    int num2 = pageIndex * pageSize;
    sb.Append("Select * From (Select ROW_NUMBER() Over (Order By " + orderField + " " + orderType);
    sb.Append(string.Concat(new object[]
    {
    ") As rowNum, * From (",
    sql,
    ") As T ) As N Where rowNum > ",
    num,
    " And rowNum <= ",
    num2
    }));
    count = Convert.ToInt32(this.GetObjectValue(new StringBuilder("Select Count(1) From (" + sql + ") t"), param));
    result = this.GetDataTableBySQL(sb, param);
    }
    catch (Exception e)
    {
    this.Logger.WriteLog(string.Concat(new string[]
    {
    "-----------数据分页(Oracle)----------- ",
    sb.ToString(),
    " ",
    e.Message,
    " "
    }));
    result = null;
    }
    return result;
    }

    SqlServer转Oracle时代码注意事项

     1

    Oracle:nvl

    SqlServer:isnull

     2

    insert,update,delete等用分号隔开的sql语句,必须前加begin,后加commit;end;并且去掉中间所有的 。

    select时,一个sql语句中不能包含多个select语句

    /// <summary>
    /// 将在SqlServer中,用分号隔开的多句sql语句,改为在Oracle中执行的Sql
    /// 前面加begin,后面加end,去掉所有的
    /// </summary>
    /// <param name="_sqlserverSql"></param>
    /// <returns></returns>
    public static string ConvertMultipleSqlFromSqlserverToOracle(string _sqlserverSql)
    {
        if (Global.CacheServerConfiger.IsOracle)
        {
            _sqlserverSql = _sqlserverSql.Trim();
            if (!_sqlserverSql.EndsWith(";"))
            {
                _sqlserverSql += ";";
            }
            _sqlserverSql = _sqlserverSql.Replace(" ", " ").Replace(" ", " ");
            _sqlserverSql = "begin " + _sqlserverSql + " commit;end;";
        }
        return _sqlserverSql;
    }

     3 当数据类型为nvarchar2时,最好前面加N,例如insert into a(nvarchar2field) values(N'中文'),查询时where子句也如此,例如where name = N'张三'
     4 sql语句中的+,改为||
     5

    Oracle中,在sql中做除法时,需要进行以下操作,否则c#中会算术溢出

    round(count(*)/(cast(3 as float)), 28) --cast(3 as float)是为了和sqlserver保持一致,28是最大精度,不能大于28

     6

    日期在SqlServer中可以按照字符串操作,但在Oracle中不行

    --Oracle中插入时也必须做如下转换

    Oracle:to_date('2010-12-21 12:02:30','YYYY-MM-DD HH24:MI:SS')

    --SqlServer插入或者where子句中都可以直接使用字符串,但where子句中使用字符串,会加快查询速度

    SqlServer:convert(datetime,''2010-12-21 12:02:30')

     7

    想要保存一个时间的毫秒数,Oracle中的字段类型必须为timestamp,不能为date,因为date只保存时间值到秒。

    --Oracle中插入时也必须做如下转换

    Oracle:to_timestamp('2010-12-21 12:02:30.230940','YYYY-MM-DD HH24:MI:SS.FF')

    --SqlServer插入或者where子句中都可以直接使用字符串,但where子句中使用字符串,会加快查询速度

    SqlServer:Convert(datetime,'2010-12-21 12:02:30.230940')

     8

    sql中日期想减得到秒的方法

    Oracle: CAST((sysdate- to_date('2010-12-21 12:02:30','YYYY-MM-DD HH24:MI:SS'))*24*60*60  as float)

    SqlServer:CONVERT(float, datediff(second, to_date('2010-12-21 12:02:30','YYYY-MM-DD HH24:MI:SS'), getdate()))

     9

    Oracle中字段不允许存入'',即空字符串,只有null值,所以where子句中判断空值方法为:

    Oracle:字段名 is null

    SqlServer:(字段名 is null or 字段名 = '')

    判断不为空值的方法

    Oracle:字段名 is not null

    SqlServer:(字段名 is not null and 字段名 != '')

     10

    Oracle中Top N的写法:

    --注意:Order by要写在子查询里,rownum是从1开始的

    select * from
    (
           select * from c_itcomp order by d_controladderss
    )
    where rownum <100
     
    排序后从第4条记录取至第9条记录
    select * from
    (
      select rownum as num, t.* from
      (
             select a.* from a order by b
      ) t
    )
    where num > 3 and num < 10

    11

    Oracle中,给表定义别名的时候不能加as

    例如:select * from 表名 as 别名!!!!注意,这是错误的,正确的应该是

    select * from 表名  别名

    12

    Oracle中,字段的别名不能加单引号

    例如:select 字段名 as '别名' from dual!!!!注意,这是错误的,正确的应该是

    select 字段名 as 别名 from dual

    13

    Oracle中没有select sysdate as nowDate的写法,正确的应该是加个虚表dual

    select sysdate as nowDate from dual

    14

    Oracle中,字段名,表名,别名,索引名,视图名等名称的长度不能超过30个字符

    15

    Oracle中,字段名都是大写的,即使select语句中是小写,得到的结果也是大写。因此,select到DataTable中后,binding到wpf时如果大小写不同,会绑定失败。在DataTable中分组和排序,也会失败。因此,尽量将DataTable中的字段名称改为大写。 

    16

    Oracle中的Integer类型,在C#中是Decimal,因此,在C#中从DataTable取值进行类型转换时:

    若要转成Int类型,需使用Convert.ToInt32,而不能使用(int),否则会报错

    若要转成Bool类型,需使用Convert.ToBoolean,而不能使用(bool),否则会报错

  • 相关阅读:
    读书笔记_Effective_C++_条款三十一:将文件间的编译依存关系降至最低(第三部分)
    Spring Boot进阶系列一
    职场进阶之七种武器
    大龄IT程序员的救赎之道
    Web Service
    生产者消费者问题
    SpringBoot集成Apache Shiro
    简单模拟医院叫号系统
    IT小团队管理者的突围之道
    内部推荐
  • 原文地址:https://www.cnblogs.com/mingjing/p/5037328.html
Copyright © 2011-2022 走看看