當我們使用SqlDataReader的GetSchemaTable方法是,利用下列代碼打印表的結構
DataTable tb=reader.GetSchemaTable (); foreach (DataRow dtrow in tb.Rows ){ foreach(DataColumn dtcol in tb.Columns ){ Console.Write ("/t"+ dtcol.ColumnName+"="+dtrow[dtcol] ); } Console.Write ("/n"); }
注意,該方法返回的并不是我們操作的數據表,而是一個描述列的元數據的一個結構表,類似下面的:
列名稱 | 列序號 | 列長度 | 列類型(...) | |
第一列 | ||||
第二列 |
就是說返回的 table對象的 ROws屬性 是我們操作表的所有列的集合,而COLUMNS屬性是所有列特征的集合
這些列特征,稱為列的元數據,有下列一些字段
對于 GetSchemaTable 方法,將按以下順序返回關于每個列的元數據:
DataReader 列 | 說明 |
---|---|
ColumnName | 列的名稱;它可能不唯一。如果無法確定該名稱,則返回空值。此名稱始終反映最近對當前視圖或命令文本中的列進行的重命名。 |
ColumnOrdinal | 列的序號。它對于行的書簽列(如果有的話)為零。其他列從一開始編號。該列不能包含空值。 |
ColumnSize | 列中值的最大可能長度。對于采用固定長度數據類型的列,它是該數據類型的大小。 |
NumericPRecision | 如果 ProviderType 是數值數據類型,則它是列的最大精度。精度取決于列的定義。如果 ProviderType 不是數值數據類型,則它為空值。 |
NumericScale | 如果 ProviderType 是 DBTYPE_DECIMAL 或 DBTYPE_NUMERIC,則為小數點右側的位數。否則,它為空值。 |
IsUnique | true:基表(BaseTableName 返回的表)中的任何兩行在該列中都不能有相同的值。如果此列本身為一個鍵,或如果有一個僅應用于該列的 UNIQUE 類型約束,那么 IsUnique 一定為 true。false:在基表中該列可以包含重復值。該列的默認值為 false。 |
IsKey | true:此列是行集合中合起來可唯一地標識該行的一組列中的一列。IsKey 設置為 true 的一組列必須唯一地標識行集合中的一個行。不要求此列集是最小列集。這組列可以從基表主鍵、唯一約束或唯一索引生成。false:唯一地標識該行時不需要此列。 |
BaseServerName | SqlDataReader 使用的 Microsoft SQL Server 實例的名稱。 |
BaseCatalogName | 包含列的數據存儲區中的目錄的名稱。如果不能確定基目錄名稱,則為 NULL。該列的默認值為空值。 |
BaseColumnName | 數據存儲區中列的名稱。如果使用別名,它可能不同于在 ColumnName 列中返回的列名稱。如果無法確定基列名稱,或者如果行集合列從數據存儲區中的列導出但不等于該列,則為空值。該列的默認值為空值。 |
BaseSchemaName | 包含列的數據存儲區中的架構的名稱。如果無法確定基架構名稱,則為空值。該列的默認值為空值。 |
BaseTableName | 包含列的數據存儲區中的表或視圖的名稱。如果無法確定基表名稱,則為空值。該列的默認值為空值。 |
DataType | 映射到列的 .Net Framework 類型。 |
AllowDBNull | 如果使用者可以將此列設置為空值,或者如果提供者不能確定使用者是否可以將此列設置為空值,則設置該值。否則,不設置該值。即使列無法設置為空值,它仍可能包含空值。 |
ProviderType | 列的數據類型的指示符。如果不同行的列數據類型不同,則它必須為 Object。該列不能包含空值。 |
IsAliased | 如果列名稱為別名,則為 true;否則為 false。 |
IsExpression | 如果此列為表達式,則為 true;否則為 false。 |
IsIdentity | 如果此列為標識列,則為 true;否則為 false。 |
IsAutoIncrement | true:該列以固定的增量向新行賦值。false:該列不以固定的增量向新行賦值。該列的默認值為 false。 |
IsRowVersion | 如果列包含無法寫入的不變的行標識符,并且除了標識行外沒有其他有意義的值,則設置該值。 |
IsHidden | 如果列是隱藏的,則為 true;否則為 false。 |
IsLong | 如果列包含二進制長對象 (BLOB)(它包含非常長的數據),則設置該值。非常長的數據的定義針對于提供程序。 |
IsReadOnly | 如果不能修改該列,則為 true;否則為 false。 |
注意 若要確保元數據列返回正確的信息,必須調用 behavior 參數設置為 KeyInfo 的
==============例子==========================================
public DataTable GetTable(IDataReader _reader) { DataTable dataTable1 = _reader.GetSchemaTable(); DataTable dataTable2 = new DataTable(); string[] arrayList = new string[dataTable1.Rows.Count]; for (int i = 0; i < dataTable1.Rows.Count; i++) { DataColumn dataColumn = new DataColumn(); if (!dataTable2.Columns.Contains(dataTable1.Rows[i]["ColumnName"].ToString())) { dataColumn.ColumnName = dataTable1.Rows[i]["ColumnName"].ToString(); dataColumn.Unique = Convert.ToBoolean(dataTable1.Rows[i]["IsUnique"]); dataColumn.AllowDBNull = Convert.ToBoolean(dataTable1.Rows[i]["AllowDBNull"]); dataColumn.ReadOnly = Convert.ToBoolean(dataTable1.Rows[i]["IsReadOnly"]); dataColumn.DataType = (Type)dataTable1.Rows[i]["DataType"]; arrayList[i] =dataColumn.ColumnName; dataTable2.Columns.Add(dataColumn); } } dataTable2.BeginLoadData(); while (_reader.Read()) { DataRow dataRow = dataTable2.NewRow(); for (int j = 0; j < arrayList.Length ; j++) { dataRow[arrayList[j]] = _reader[arrayList[j]]; } dataTable2.Rows.Add(dataRow); } _reader.Close(); dataTable2.EndLoadData(); return dataTable2; }
新聞熱點
疑難解答