Pager.cs 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. using System.Text;
  2. using System;
  3. using Ant.Data;
  4. namespace Ant.ORM.SQL
  5. {
  6. /// <summary>
  7. /// 分页语句类
  8. /// </summary>
  9. internal class Pager
  10. {
  11. public static string GetSql(DatabaseType dalType, int pageIndex, int pageSize, string where, string tableName, int rowCount, string columns)//增加了指定列功能
  12. {
  13. if (string.IsNullOrEmpty(columns))
  14. {
  15. columns = "*";
  16. }
  17. if (string.IsNullOrEmpty(where))
  18. {
  19. where = "1=1";
  20. }
  21. if (pageIndex == 0 || pageSize == 0)
  22. {
  23. return string.Format(selectAll, columns, tableName, where);
  24. }
  25. else if (pageIndex == 1)//第一页
  26. {
  27. switch (dalType)
  28. {
  29. case DatabaseType.OleDb:
  30. case DatabaseType.MSSQLServer:
  31. case DatabaseType.Oracle:
  32. return string.Format(selectAll, "top " + pageSize + " " + columns, tableName, GetWhereFixOrderBy(where));
  33. case DatabaseType.SQLite:
  34. case DatabaseType.MySQL:
  35. return string.Format(selectAll, columns, tableName, GetWhereFixOrderBy(where) + " limit " + pageSize);
  36. }
  37. }
  38. int max = (pageIndex - 1) * pageSize;
  39. switch (dalType)
  40. {
  41. case DatabaseType.OleDb:
  42. case DatabaseType.MSSQLServer:
  43. case DatabaseType.Oracle:
  44. return string.Format(AccessPageTop3, rowCount - max > pageSize ? pageSize : rowCount - max, pageIndex * pageSize + " " + columns, tableName, where, GetOrderBy(where, true), GetOrderBy(where, false));
  45. case DatabaseType.SQLite:
  46. case DatabaseType.MySQL:
  47. return string.Format(selectAll, columns, tableName, GetWhereFixOrderBy(where) + " limit " + pageSize + " offset " + max);
  48. }
  49. throw new Exception("Pager::No Be Support:" + dalType.ToString());
  50. }
  51. private const string selectAll = "select {0} from {1} where {2}";
  52. private const string AccessPageTop3 = @"select top {0} * from (select top {0} * from (select top {1} from {2} where {3}) v {4}) v {5}";
  53. private static string GetWhereFixOrderBy(string where)
  54. {
  55. if (where.ToLower().IndexOf("order by") == -1)
  56. {
  57. where += " order by id";
  58. }
  59. return where;
  60. }
  61. private static string GetOrderBy(string where, bool reverse)
  62. {
  63. string orderby = " order by id ";
  64. int index = where.ToLower().IndexOf("order by");
  65. if (index > -1)
  66. {
  67. where = where.Substring(index).ToUpper();
  68. orderby = reverse ? where.Replace("DESC", "DE#SC").Replace("ASC", "DESC").Replace("DE#SC", "ASC") : where;
  69. }
  70. else
  71. {
  72. orderby += reverse ? "desc" : "asc";
  73. }
  74. return orderby.ToLower();
  75. }
  76. private static bool IsOrderByDesc(string where)
  77. {
  78. int index = where.ToLower().IndexOf("order by");
  79. if (index > -1 && where.ToLower().IndexOf("desc") > -1)
  80. {
  81. return true;
  82. }
  83. return false;
  84. }
  85. }
  86. }