DBSchemaTable.cs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. //------------------------------------------------------------------------------
  2. // <copyright file="DBSchemaTable.cs" company="Microsoft">
  3. // Copyright (c) Microsoft Corporation. All rights reserved.
  4. // </copyright>
  5. // <owner current="true" primary="true">Microsoft</owner>
  6. // <owner current="true" primary="false">Microsoft</owner>
  7. //------------------------------------------------------------------------------
  8. namespace System.Data.Common {
  9. using System;
  10. using System.Data;
  11. using System.Data.ProviderBase;
  12. using System.Diagnostics;
  13. sealed internal class DbSchemaTable {
  14. private enum ColumnEnum {
  15. ColumnName,
  16. ColumnOrdinal,
  17. ColumnSize,
  18. BaseServerName,
  19. BaseCatalogName,
  20. BaseColumnName,
  21. BaseSchemaName,
  22. BaseTableName,
  23. IsAutoIncrement,
  24. IsUnique,
  25. IsKey,
  26. IsRowVersion,
  27. DataType,
  28. ProviderSpecificDataType,
  29. AllowDBNull,
  30. ProviderType,
  31. IsExpression,
  32. IsHidden,
  33. IsLong,
  34. IsReadOnly,
  35. SchemaMappingUnsortedIndex,
  36. }
  37. static readonly private string[] DBCOLUMN_NAME = new string[] {
  38. SchemaTableColumn.ColumnName,
  39. SchemaTableColumn.ColumnOrdinal,
  40. SchemaTableColumn.ColumnSize,
  41. SchemaTableOptionalColumn.BaseServerName,
  42. SchemaTableOptionalColumn.BaseCatalogName,
  43. SchemaTableColumn.BaseColumnName,
  44. SchemaTableColumn.BaseSchemaName,
  45. SchemaTableColumn.BaseTableName,
  46. SchemaTableOptionalColumn.IsAutoIncrement,
  47. SchemaTableColumn.IsUnique,
  48. SchemaTableColumn.IsKey,
  49. SchemaTableOptionalColumn.IsRowVersion,
  50. SchemaTableColumn.DataType,
  51. SchemaTableOptionalColumn.ProviderSpecificDataType,
  52. SchemaTableColumn.AllowDBNull,
  53. SchemaTableColumn.ProviderType,
  54. SchemaTableColumn.IsExpression,
  55. SchemaTableOptionalColumn.IsHidden,
  56. SchemaTableColumn.IsLong,
  57. SchemaTableOptionalColumn.IsReadOnly,
  58. DbSchemaRow.SchemaMappingUnsortedIndex,
  59. };
  60. internal DataTable dataTable;
  61. private DataColumnCollection columns;
  62. private DataColumn[] columnCache = new DataColumn[DBCOLUMN_NAME.Length];
  63. private bool _returnProviderSpecificTypes;
  64. internal DbSchemaTable(DataTable dataTable, bool returnProviderSpecificTypes) {
  65. this.dataTable = dataTable;
  66. this.columns = dataTable.Columns;
  67. _returnProviderSpecificTypes = returnProviderSpecificTypes;
  68. }
  69. internal DataColumn ColumnName { get { return CachedDataColumn(ColumnEnum.ColumnName);}}
  70. internal DataColumn Size { get { return CachedDataColumn(ColumnEnum.ColumnSize);}}
  71. internal DataColumn BaseServerName { get { return CachedDataColumn(ColumnEnum.BaseServerName);}}
  72. internal DataColumn BaseColumnName { get { return CachedDataColumn(ColumnEnum.BaseColumnName);}}
  73. internal DataColumn BaseTableName { get { return CachedDataColumn(ColumnEnum.BaseTableName);}}
  74. internal DataColumn BaseCatalogName { get { return CachedDataColumn(ColumnEnum.BaseCatalogName);}}
  75. internal DataColumn BaseSchemaName { get { return CachedDataColumn(ColumnEnum.BaseSchemaName);}}
  76. internal DataColumn IsAutoIncrement { get { return CachedDataColumn(ColumnEnum.IsAutoIncrement);}}
  77. internal DataColumn IsUnique { get { return CachedDataColumn(ColumnEnum.IsUnique);}}
  78. internal DataColumn IsKey { get { return CachedDataColumn(ColumnEnum.IsKey);}}
  79. internal DataColumn IsRowVersion { get { return CachedDataColumn(ColumnEnum.IsRowVersion);}}
  80. internal DataColumn AllowDBNull { get { return CachedDataColumn(ColumnEnum.AllowDBNull);}}
  81. internal DataColumn IsExpression { get { return CachedDataColumn(ColumnEnum.IsExpression);}}
  82. internal DataColumn IsHidden { get { return CachedDataColumn(ColumnEnum.IsHidden);}}
  83. internal DataColumn IsLong { get { return CachedDataColumn(ColumnEnum.IsLong);}}
  84. internal DataColumn IsReadOnly { get { return CachedDataColumn(ColumnEnum.IsReadOnly);}}
  85. internal DataColumn UnsortedIndex { get { return CachedDataColumn(ColumnEnum.SchemaMappingUnsortedIndex);}}
  86. internal DataColumn DataType {
  87. get {
  88. if (_returnProviderSpecificTypes) {
  89. return CachedDataColumn(ColumnEnum.ProviderSpecificDataType, ColumnEnum.DataType);
  90. }
  91. return CachedDataColumn(ColumnEnum.DataType);
  92. }
  93. }
  94. private DataColumn CachedDataColumn(ColumnEnum column) {
  95. return CachedDataColumn(column, column);
  96. }
  97. private DataColumn CachedDataColumn(ColumnEnum column, ColumnEnum column2) {
  98. DataColumn dataColumn = columnCache[(int) column];
  99. if (null == dataColumn) {
  100. int index = columns.IndexOf(DBCOLUMN_NAME[(int) column]);
  101. if ((-1 == index) && (column != column2)) {
  102. index = columns.IndexOf(DBCOLUMN_NAME[(int) column2]);
  103. }
  104. if (-1 != index) {
  105. dataColumn = columns[index];
  106. columnCache[(int) column] = dataColumn;
  107. }
  108. }
  109. return dataColumn;
  110. }
  111. }
  112. }