DBSchemaRow.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395
  1. //------------------------------------------------------------------------------
  2. // <copyright file="DBSchemaRow.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.ComponentModel;
  11. using System.Data;
  12. using System.Diagnostics;
  13. using System.Globalization;
  14. sealed internal class DbSchemaRow {
  15. internal const string SchemaMappingUnsortedIndex = "SchemaMapping Unsorted Index";
  16. DbSchemaTable schemaTable;
  17. DataRow dataRow;
  18. static internal DbSchemaRow[] GetSortedSchemaRows(DataTable dataTable, bool returnProviderSpecificTypes) { // MDAC 60609
  19. DataColumn sortindex= dataTable.Columns[SchemaMappingUnsortedIndex];
  20. if (null == sortindex) { // WebData 100390
  21. sortindex = new DataColumn(SchemaMappingUnsortedIndex, typeof(Int32)); // MDAC 67050
  22. dataTable.Columns.Add(sortindex);
  23. }
  24. int count = dataTable.Rows.Count;
  25. for (int i = 0; i < count; ++i) {
  26. dataTable.Rows[i][sortindex] = i;
  27. };
  28. DbSchemaTable schemaTable = new DbSchemaTable(dataTable, returnProviderSpecificTypes);
  29. const DataViewRowState rowStates = DataViewRowState.Unchanged | DataViewRowState.Added | DataViewRowState.ModifiedCurrent;
  30. DataRow[] dataRows = dataTable.Select(null, "ColumnOrdinal ASC", rowStates);
  31. Debug.Assert(null != dataRows, "GetSchemaRows: unexpected null dataRows");
  32. DbSchemaRow[] schemaRows = new DbSchemaRow[dataRows.Length];
  33. for (int i = 0; i < dataRows.Length; ++i) {
  34. schemaRows[i] = new DbSchemaRow(schemaTable, dataRows[i]);
  35. }
  36. return schemaRows;
  37. }
  38. internal DbSchemaRow(DbSchemaTable schemaTable, DataRow dataRow) {
  39. this.schemaTable = schemaTable;
  40. this.dataRow = dataRow;
  41. }
  42. internal DataRow DataRow {
  43. get {
  44. return dataRow;
  45. }
  46. }
  47. internal string ColumnName {
  48. get {
  49. Debug.Assert(null != schemaTable.ColumnName, "no column ColumnName");
  50. object value = dataRow[schemaTable.ColumnName, DataRowVersion.Default];
  51. if (!Convert.IsDBNull(value)) {
  52. return Convert.ToString(value, CultureInfo.InvariantCulture);
  53. }
  54. return "";
  55. }
  56. /*set {
  57. Debug.Assert(null != schemaTable.ColumnName, "missing column ColumnName");
  58. dataRow[schemaTable.ColumnName] = value;
  59. }*/
  60. }
  61. //internal Int32 Ordinal {
  62. /*get {
  63. Debug.Assert(null != schemaTable.Ordinal, "no column Ordinal");
  64. return Convert.ToInt32(dataRow[schemaTable.Ordinal, DataRowVersion.Default], CultureInfo.InvariantCulture);
  65. }*/
  66. /*set {
  67. Debug.Assert(null != schemaTable.Ordinal, "missing column Ordinal");
  68. dataRow[schemaTable.Ordinal] = value;
  69. }*/
  70. //}
  71. internal Int32 Size {
  72. get {
  73. Debug.Assert(null != schemaTable.Size, "no column Size");
  74. object value = dataRow[schemaTable.Size, DataRowVersion.Default];
  75. if (!Convert.IsDBNull(value)) {
  76. return Convert.ToInt32(value, CultureInfo.InvariantCulture);
  77. }
  78. return 0;
  79. }
  80. /*set {
  81. Debug.Assert(null != schemaTable.Size, "missing column Size");
  82. dataRow[schemaTable.Size] = value;
  83. }*/
  84. }
  85. internal string BaseColumnName {
  86. get {
  87. if (null != schemaTable.BaseColumnName) {
  88. object value = dataRow[schemaTable.BaseColumnName, DataRowVersion.Default];
  89. if (!Convert.IsDBNull(value)) {
  90. return Convert.ToString(value, CultureInfo.InvariantCulture);
  91. }
  92. }
  93. return "";
  94. }
  95. /*set {
  96. Debug.Assert(null != schemaTable.BaseColumnName, "missing column BaseColumnName");
  97. dataRow[schemaTable.BaseColumnName] = value;
  98. }*/
  99. }
  100. internal string BaseServerName {
  101. get {
  102. if (null != schemaTable.BaseServerName) {
  103. object value = dataRow[schemaTable.BaseServerName, DataRowVersion.Default];
  104. if (!Convert.IsDBNull(value)) {
  105. return Convert.ToString(value, CultureInfo.InvariantCulture);
  106. }
  107. }
  108. return "";
  109. }
  110. /*set {
  111. Debug.Assert(null != schemaTable.BaseServerName, "missing column BaseServerName");
  112. dataRow[schemaTable.BaseServerName] = value;
  113. }*/
  114. }
  115. internal string BaseCatalogName {
  116. get {
  117. if (null != schemaTable.BaseCatalogName) {
  118. object value = dataRow[schemaTable.BaseCatalogName, DataRowVersion.Default];
  119. if (!Convert.IsDBNull(value)) {
  120. return Convert.ToString(value, CultureInfo.InvariantCulture);
  121. }
  122. }
  123. return "";
  124. }
  125. /*set {
  126. Debug.Assert(null != schemaTable.BaseCatalogName, "missing column BaseCatalogName");
  127. dataRow[schemaTable.BaseCatalogName] = value;
  128. }*/
  129. }
  130. internal string BaseSchemaName {
  131. get {
  132. if (null != schemaTable.BaseSchemaName) {
  133. object value = dataRow[schemaTable.BaseSchemaName, DataRowVersion.Default];
  134. if (!Convert.IsDBNull(value)) {
  135. return Convert.ToString(value, CultureInfo.InvariantCulture);
  136. }
  137. }
  138. return "";
  139. }
  140. /*set {
  141. Debug.Assert(null != schemaTable.BaseSchemaName, "missing column BaseSchemaName");
  142. dataRow[schemaTable.BaseSchemaName] = value;
  143. }*/
  144. }
  145. internal string BaseTableName {
  146. get {
  147. if (null != schemaTable.BaseTableName) {
  148. object value = dataRow[schemaTable.BaseTableName, DataRowVersion.Default];
  149. if (!Convert.IsDBNull(value)) {
  150. return Convert.ToString(value, CultureInfo.InvariantCulture);
  151. }
  152. }
  153. return "";
  154. }
  155. /*set {
  156. Debug.Assert(null != schemaTable.BaseTableName, "missing column BaseTableName");
  157. dataRow[schemaTable.BaseTableName] = value;
  158. }*/
  159. }
  160. internal bool IsAutoIncrement {
  161. get {
  162. if (null != schemaTable.IsAutoIncrement) {
  163. object value = dataRow[schemaTable.IsAutoIncrement, DataRowVersion.Default];
  164. if (!Convert.IsDBNull(value)) {
  165. return Convert.ToBoolean(value, CultureInfo.InvariantCulture);
  166. }
  167. }
  168. return false;
  169. }
  170. /*set {
  171. Debug.Assert(null != schemaTable.IsAutoIncrement, "missing column IsAutoIncrement");
  172. dataRow[schemaTable.IsAutoIncrement] = (bool)value;
  173. }*/
  174. }
  175. internal bool IsUnique {
  176. get {
  177. if (null != schemaTable.IsUnique) {
  178. object value = dataRow[schemaTable.IsUnique, DataRowVersion.Default];
  179. if (!Convert.IsDBNull(value)) {
  180. return Convert.ToBoolean(value, CultureInfo.InvariantCulture);
  181. }
  182. }
  183. return false;
  184. }
  185. /*set {
  186. Debug.Assert(null != schemaTable.IsUnique, "missing column IsUnique");
  187. dataRow[schemaTable.IsUnique] = (bool)value;
  188. }*/
  189. }
  190. internal bool IsRowVersion {
  191. get {
  192. if (null != schemaTable.IsRowVersion) {
  193. object value = dataRow[schemaTable.IsRowVersion, DataRowVersion.Default];
  194. if (!Convert.IsDBNull(value)) {
  195. return Convert.ToBoolean(value, CultureInfo.InvariantCulture);
  196. }
  197. }
  198. return false;
  199. }
  200. /*set {
  201. Debug.Assert(null != schemaTable.IsRowVersion, "missing column IsRowVersion");
  202. dataRow[schemaTable.IsRowVersion] = value;
  203. }*/
  204. }
  205. internal bool IsKey {
  206. get {
  207. if (null != schemaTable.IsKey) {
  208. object value = dataRow[schemaTable.IsKey, DataRowVersion.Default];
  209. if (!Convert.IsDBNull(value)) {
  210. return Convert.ToBoolean(value, CultureInfo.InvariantCulture);
  211. }
  212. }
  213. return false;
  214. }
  215. /*set {
  216. Debug.Assert(null != schemaTable.IsKey, "missing column IsKey");
  217. dataRow[schemaTable.IsKey] = value;
  218. }*/
  219. }
  220. // consider: just do comparison directly -> (object)(baseColumnName) == (object)(columnName)
  221. //internal bool IsAliased {
  222. /*get {
  223. if (null != schemaTable.IsAliased) { // MDAC 62336
  224. object value = dataRow[schemaTable.IsAliased, DataRowVersion.Default];
  225. if (!Convert.IsDBNull(value)) {
  226. return Convert.ToBoolean(value, CultureInfo.InvariantCulture);
  227. }
  228. }
  229. return false;
  230. }*/
  231. /*set {
  232. Debug.Assert(null != schemaTable.IsAliased, "missing column IsAliased");
  233. dataRow[schemaTable.IsAliased] = value;
  234. }*/
  235. //}
  236. internal bool IsExpression {
  237. get {
  238. if (null != schemaTable.IsExpression) { // MDAC 62336
  239. object value = dataRow[schemaTable.IsExpression, DataRowVersion.Default];
  240. if (!Convert.IsDBNull(value)) {
  241. return Convert.ToBoolean(value, CultureInfo.InvariantCulture);
  242. }
  243. }
  244. return false;
  245. }
  246. /*set {
  247. Debug.Assert(null != schemaTable.IsExpression, "missing column IsExpression");
  248. dataRow[schemaTable.IsExpression] = value;
  249. }*/
  250. }
  251. //internal bool IsIdentity {
  252. /*get {
  253. if (null != schemaTable.IsIdentity) { // MDAC 62336
  254. object value = dataRow[schemaTable.IsIdentity, DataRowVersion.Default];
  255. if (!Convert.IsDBNull(value)) {
  256. return Convert.ToBoolean(value, CultureInfo.InvariantCulture);
  257. }
  258. }
  259. return false;
  260. }*/
  261. /*set {
  262. Debug.Assert(null != schemaTable.IsIdentity, "missing column IsIdentity");
  263. dataRow[schemaTable.IsIdentity] = value;
  264. }*/
  265. //}
  266. internal bool IsHidden {
  267. get {
  268. if (null != schemaTable.IsHidden) { // MDAC 62336
  269. object value = dataRow[schemaTable.IsHidden, DataRowVersion.Default];
  270. if (!Convert.IsDBNull(value)) {
  271. return Convert.ToBoolean(value, CultureInfo.InvariantCulture);
  272. }
  273. }
  274. return false;
  275. }
  276. /*set {
  277. Debug.Assert(null != schemaTable.IsHidden, "missing column IsHidden");
  278. dataRow[schemaTable.IsHidden] = value;
  279. }*/
  280. }
  281. internal bool IsLong {
  282. get {
  283. if (null != schemaTable.IsLong) { // MDAC 62336
  284. object value = dataRow[schemaTable.IsLong, DataRowVersion.Default];
  285. if (!Convert.IsDBNull(value)) {
  286. return Convert.ToBoolean(value, CultureInfo.InvariantCulture);
  287. }
  288. }
  289. return false;
  290. }
  291. /*set {
  292. Debug.Assert(null != schemaTable.IsLong, "missing column IsHidden");
  293. dataRow[schemaTable.IsLong] = value;
  294. }*/
  295. }
  296. internal bool IsReadOnly {
  297. get {
  298. if (null != schemaTable.IsReadOnly) { // MDAC 62336
  299. object value = dataRow[schemaTable.IsReadOnly, DataRowVersion.Default];
  300. if (!Convert.IsDBNull(value)) {
  301. return Convert.ToBoolean(value, CultureInfo.InvariantCulture);
  302. }
  303. }
  304. return false;
  305. }
  306. /*set {
  307. Debug.Assert(null != schemaTable.IsReadOnly, "missing column IsReadOnly");
  308. dataRow[schemaTable.IsReadOnly] = value;
  309. }*/
  310. }
  311. internal System.Type DataType {
  312. get {
  313. if (null != schemaTable.DataType) {
  314. object value = dataRow[schemaTable.DataType, DataRowVersion.Default];
  315. if (!Convert.IsDBNull(value)) {
  316. return(System.Type) value;
  317. }
  318. }
  319. return null;
  320. }
  321. /*set {
  322. Debug.Assert(null != schemaTable.DataType, "missing column DataType");
  323. dataRow[schemaTable.DataType] = value;
  324. }*/
  325. }
  326. internal bool AllowDBNull {
  327. get {
  328. if (null != schemaTable.AllowDBNull) {
  329. object value = dataRow[schemaTable.AllowDBNull, DataRowVersion.Default];
  330. if (!Convert.IsDBNull(value)) {
  331. return Convert.ToBoolean(value, CultureInfo.InvariantCulture);
  332. }
  333. }
  334. return true;
  335. }
  336. /*set {
  337. Debug.Assert(null != schemaTable.AllowDBNull, "missing column MaybeNull");
  338. dataRow[schemaTable.AllowDBNull] = value;
  339. }*/
  340. }
  341. /*internal Int32 ProviderType {
  342. get {
  343. if (null != schemaTable.ProviderType) {
  344. object value = dataRow[schemaTable.ProviderType, DataRowVersion.Default];
  345. if (!Convert.IsDBNull(value)) {
  346. return Convert.ToInt32(value);
  347. }
  348. }
  349. return 0;
  350. }
  351. set {
  352. Debug.Assert(null != schemaTable.ProviderType, "missing column ProviderType");
  353. dataRow[schemaTable.ProviderType] = value;
  354. }
  355. }*/
  356. internal Int32 UnsortedIndex {
  357. get {
  358. return (Int32) dataRow[schemaTable.UnsortedIndex, DataRowVersion.Default];
  359. }
  360. }
  361. }
  362. }