1 //------------------------------------------------------------------------------
2 // <copyright file="DBSchemaRow.cs" company="Microsoft">
3 // Copyright (c) Microsoft Corporation. All rights reserved.
5 // <owner current="true" primary="true">Microsoft</owner>
6 // <owner current="true" primary="false">Microsoft</owner>
7 //------------------------------------------------------------------------------
9 namespace System.Data.Common {
12 using System.ComponentModel;
14 using System.Diagnostics;
15 using System.Globalization;
17 sealed internal class DbSchemaRow {
18 internal const string SchemaMappingUnsortedIndex = "SchemaMapping Unsorted Index";
19 DbSchemaTable schemaTable;
22 static internal DbSchemaRow[] GetSortedSchemaRows(DataTable dataTable, bool returnProviderSpecificTypes) { // MDAC 60609
23 DataColumn sortindex= dataTable.Columns[SchemaMappingUnsortedIndex];
24 if (null == sortindex) { // WebData 100390
25 sortindex = new DataColumn(SchemaMappingUnsortedIndex, typeof(Int32)); // MDAC 67050
26 dataTable.Columns.Add(sortindex);
28 int count = dataTable.Rows.Count;
29 for (int i = 0; i < count; ++i) {
30 dataTable.Rows[i][sortindex] = i;
32 DbSchemaTable schemaTable = new DbSchemaTable(dataTable, returnProviderSpecificTypes);
34 const DataViewRowState rowStates = DataViewRowState.Unchanged | DataViewRowState.Added | DataViewRowState.ModifiedCurrent;
35 DataRow[] dataRows = dataTable.Select(null, "ColumnOrdinal ASC", rowStates);
36 Debug.Assert(null != dataRows, "GetSchemaRows: unexpected null dataRows");
38 DbSchemaRow[] schemaRows = new DbSchemaRow[dataRows.Length];
40 for (int i = 0; i < dataRows.Length; ++i) {
41 schemaRows[i] = new DbSchemaRow(schemaTable, dataRows[i]);
46 internal DbSchemaRow(DbSchemaTable schemaTable, DataRow dataRow) {
47 this.schemaTable = schemaTable;
48 this.dataRow = dataRow;
51 internal DataRow DataRow {
57 internal string ColumnName {
59 Debug.Assert(null != schemaTable.ColumnName, "no column ColumnName");
60 object value = dataRow[schemaTable.ColumnName, DataRowVersion.Default];
61 if (!Convert.IsDBNull(value)) {
62 return Convert.ToString(value, CultureInfo.InvariantCulture);
67 Debug.Assert(null != schemaTable.ColumnName, "missing column ColumnName");
68 dataRow[schemaTable.ColumnName] = value;
72 //internal Int32 Ordinal {
74 Debug.Assert(null != schemaTable.Ordinal, "no column Ordinal");
75 return Convert.ToInt32(dataRow[schemaTable.Ordinal, DataRowVersion.Default], CultureInfo.InvariantCulture);
78 Debug.Assert(null != schemaTable.Ordinal, "missing column Ordinal");
79 dataRow[schemaTable.Ordinal] = value;
86 Debug.Assert(null != schemaTable.Size, "no column Size");
87 object value = dataRow[schemaTable.Size, DataRowVersion.Default];
88 if (!Convert.IsDBNull(value)) {
89 return Convert.ToInt32(value, CultureInfo.InvariantCulture);
94 Debug.Assert(null != schemaTable.Size, "missing column Size");
95 dataRow[schemaTable.Size] = value;
99 internal string BaseColumnName {
101 if (null != schemaTable.BaseColumnName) {
102 object value = dataRow[schemaTable.BaseColumnName, DataRowVersion.Default];
103 if (!Convert.IsDBNull(value)) {
104 return Convert.ToString(value, CultureInfo.InvariantCulture);
110 Debug.Assert(null != schemaTable.BaseColumnName, "missing column BaseColumnName");
111 dataRow[schemaTable.BaseColumnName] = value;
115 internal string BaseServerName {
117 if (null != schemaTable.BaseServerName) {
118 object value = dataRow[schemaTable.BaseServerName, DataRowVersion.Default];
119 if (!Convert.IsDBNull(value)) {
120 return Convert.ToString(value, CultureInfo.InvariantCulture);
126 Debug.Assert(null != schemaTable.BaseServerName, "missing column BaseServerName");
127 dataRow[schemaTable.BaseServerName] = value;
132 internal string BaseCatalogName {
134 if (null != schemaTable.BaseCatalogName) {
135 object value = dataRow[schemaTable.BaseCatalogName, DataRowVersion.Default];
136 if (!Convert.IsDBNull(value)) {
137 return Convert.ToString(value, CultureInfo.InvariantCulture);
143 Debug.Assert(null != schemaTable.BaseCatalogName, "missing column BaseCatalogName");
144 dataRow[schemaTable.BaseCatalogName] = value;
148 internal string BaseSchemaName {
150 if (null != schemaTable.BaseSchemaName) {
151 object value = dataRow[schemaTable.BaseSchemaName, DataRowVersion.Default];
152 if (!Convert.IsDBNull(value)) {
153 return Convert.ToString(value, CultureInfo.InvariantCulture);
159 Debug.Assert(null != schemaTable.BaseSchemaName, "missing column BaseSchemaName");
160 dataRow[schemaTable.BaseSchemaName] = value;
164 internal string BaseTableName {
166 if (null != schemaTable.BaseTableName) {
167 object value = dataRow[schemaTable.BaseTableName, DataRowVersion.Default];
168 if (!Convert.IsDBNull(value)) {
169 return Convert.ToString(value, CultureInfo.InvariantCulture);
175 Debug.Assert(null != schemaTable.BaseTableName, "missing column BaseTableName");
176 dataRow[schemaTable.BaseTableName] = value;
180 internal bool IsAutoIncrement {
182 if (null != schemaTable.IsAutoIncrement) {
183 object value = dataRow[schemaTable.IsAutoIncrement, DataRowVersion.Default];
184 if (!Convert.IsDBNull(value)) {
185 return Convert.ToBoolean(value, CultureInfo.InvariantCulture);
191 Debug.Assert(null != schemaTable.IsAutoIncrement, "missing column IsAutoIncrement");
192 dataRow[schemaTable.IsAutoIncrement] = (bool)value;
196 internal bool IsUnique {
198 if (null != schemaTable.IsUnique) {
199 object value = dataRow[schemaTable.IsUnique, DataRowVersion.Default];
200 if (!Convert.IsDBNull(value)) {
201 return Convert.ToBoolean(value, CultureInfo.InvariantCulture);
207 Debug.Assert(null != schemaTable.IsUnique, "missing column IsUnique");
208 dataRow[schemaTable.IsUnique] = (bool)value;
212 internal bool IsRowVersion {
214 if (null != schemaTable.IsRowVersion) {
215 object value = dataRow[schemaTable.IsRowVersion, DataRowVersion.Default];
216 if (!Convert.IsDBNull(value)) {
217 return Convert.ToBoolean(value, CultureInfo.InvariantCulture);
223 Debug.Assert(null != schemaTable.IsRowVersion, "missing column IsRowVersion");
224 dataRow[schemaTable.IsRowVersion] = value;
228 internal bool IsKey {
230 if (null != schemaTable.IsKey) {
231 object value = dataRow[schemaTable.IsKey, DataRowVersion.Default];
232 if (!Convert.IsDBNull(value)) {
233 return Convert.ToBoolean(value, CultureInfo.InvariantCulture);
239 Debug.Assert(null != schemaTable.IsKey, "missing column IsKey");
240 dataRow[schemaTable.IsKey] = value;
244 // consider: just do comparison directly -> (object)(baseColumnName) == (object)(columnName)
245 //internal bool IsAliased {
247 if (null != schemaTable.IsAliased) { // MDAC 62336
248 object value = dataRow[schemaTable.IsAliased, DataRowVersion.Default];
249 if (!Convert.IsDBNull(value)) {
250 return Convert.ToBoolean(value, CultureInfo.InvariantCulture);
256 Debug.Assert(null != schemaTable.IsAliased, "missing column IsAliased");
257 dataRow[schemaTable.IsAliased] = value;
261 internal bool IsExpression {
263 if (null != schemaTable.IsExpression) { // MDAC 62336
264 object value = dataRow[schemaTable.IsExpression, DataRowVersion.Default];
265 if (!Convert.IsDBNull(value)) {
266 return Convert.ToBoolean(value, CultureInfo.InvariantCulture);
272 Debug.Assert(null != schemaTable.IsExpression, "missing column IsExpression");
273 dataRow[schemaTable.IsExpression] = value;
277 //internal bool IsIdentity {
279 if (null != schemaTable.IsIdentity) { // MDAC 62336
280 object value = dataRow[schemaTable.IsIdentity, DataRowVersion.Default];
281 if (!Convert.IsDBNull(value)) {
282 return Convert.ToBoolean(value, CultureInfo.InvariantCulture);
288 Debug.Assert(null != schemaTable.IsIdentity, "missing column IsIdentity");
289 dataRow[schemaTable.IsIdentity] = value;
293 internal bool IsHidden {
295 if (null != schemaTable.IsHidden) { // MDAC 62336
296 object value = dataRow[schemaTable.IsHidden, DataRowVersion.Default];
297 if (!Convert.IsDBNull(value)) {
298 return Convert.ToBoolean(value, CultureInfo.InvariantCulture);
304 Debug.Assert(null != schemaTable.IsHidden, "missing column IsHidden");
305 dataRow[schemaTable.IsHidden] = value;
309 internal bool IsLong {
311 if (null != schemaTable.IsLong) { // MDAC 62336
312 object value = dataRow[schemaTable.IsLong, DataRowVersion.Default];
313 if (!Convert.IsDBNull(value)) {
314 return Convert.ToBoolean(value, CultureInfo.InvariantCulture);
320 Debug.Assert(null != schemaTable.IsLong, "missing column IsHidden");
321 dataRow[schemaTable.IsLong] = value;
325 internal bool IsReadOnly {
327 if (null != schemaTable.IsReadOnly) { // MDAC 62336
328 object value = dataRow[schemaTable.IsReadOnly, DataRowVersion.Default];
329 if (!Convert.IsDBNull(value)) {
330 return Convert.ToBoolean(value, CultureInfo.InvariantCulture);
336 Debug.Assert(null != schemaTable.IsReadOnly, "missing column IsReadOnly");
337 dataRow[schemaTable.IsReadOnly] = value;
341 internal System.Type DataType {
343 if (null != schemaTable.DataType) {
344 object value = dataRow[schemaTable.DataType, DataRowVersion.Default];
345 if (!Convert.IsDBNull(value)) {
346 return(System.Type) value;
352 Debug.Assert(null != schemaTable.DataType, "missing column DataType");
353 dataRow[schemaTable.DataType] = value;
357 internal bool AllowDBNull {
359 if (null != schemaTable.AllowDBNull) {
360 object value = dataRow[schemaTable.AllowDBNull, DataRowVersion.Default];
361 if (!Convert.IsDBNull(value)) {
362 return Convert.ToBoolean(value, CultureInfo.InvariantCulture);
368 Debug.Assert(null != schemaTable.AllowDBNull, "missing column MaybeNull");
369 dataRow[schemaTable.AllowDBNull] = value;
373 /*internal Int32 ProviderType {
375 if (null != schemaTable.ProviderType) {
376 object value = dataRow[schemaTable.ProviderType, DataRowVersion.Default];
377 if (!Convert.IsDBNull(value)) {
378 return Convert.ToInt32(value);
384 Debug.Assert(null != schemaTable.ProviderType, "missing column ProviderType");
385 dataRow[schemaTable.ProviderType] = value;
389 internal Int32 UnsortedIndex {
391 return (Int32) dataRow[schemaTable.UnsortedIndex, DataRowVersion.Default];