當(dāng)我們使用SqlDataReader的GetSchemaTable方法是,利用下列代碼打印表的結(jié)構(gòu)
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"); }
注意,該方法返回的并不是我們操作的數(shù)據(jù)表,而是一個(gè)描述列的元數(shù)據(jù)的一個(gè)結(jié)構(gòu)表,類似下面的:
列名稱 | 列序號(hào) | 列長(zhǎng)度 | 列類型(...) | |
第一列 | ||||
第二列 |
就是說(shuō)返回的 table對(duì)象的 ROws屬性 是我們操作表的所有列的集合,而COLUMNS屬性是所有列特征的集合
這些列特征,稱為列的元數(shù)據(jù),有下列一些字段
對(duì)于 GetSchemaTable 方法,將按以下順序返回關(guān)于每個(gè)列的元數(shù)據(jù):
DataReader 列 | 說(shuō)明 |
---|---|
ColumnName | 列的名稱;它可能不唯一。如果無(wú)法確定該名稱,則返回空值。此名稱始終反映最近對(duì)當(dāng)前視圖或命令文本中的列進(jìn)行的重命名。 |
ColumnOrdinal | 列的序號(hào)。它對(duì)于行的書簽列(如果有的話)為零。其他列從一開始編號(hào)。該列不能包含空值。 |
ColumnSize | 列中值的最大可能長(zhǎng)度。對(duì)于采用固定長(zhǎng)度數(shù)據(jù)類型的列,它是該數(shù)據(jù)類型的大小。 |
NumericPRecision | 如果 ProviderType 是數(shù)值數(shù)據(jù)類型,則它是列的最大精度。精度取決于列的定義。如果 ProviderType 不是數(shù)值數(shù)據(jù)類型,則它為空值。 |
NumericScale | 如果 ProviderType 是 DBTYPE_DECIMAL 或 DBTYPE_NUMERIC,則為小數(shù)點(diǎn)右側(cè)的位數(shù)。否則,它為空值。 |
IsUnique | true:基表(BaseTableName 返回的表)中的任何兩行在該列中都不能有相同的值。如果此列本身為一個(gè)鍵,或如果有一個(gè)僅應(yīng)用于該列的 UNIQUE 類型約束,那么 IsUnique 一定為 true。false:在基表中該列可以包含重復(fù)值。該列的默認(rèn)值為 false。 |
IsKey | true:此列是行集合中合起來(lái)可唯一地標(biāo)識(shí)該行的一組列中的一列。IsKey 設(shè)置為 true 的一組列必須唯一地標(biāo)識(shí)行集合中的一個(gè)行。不要求此列集是最小列集。這組列可以從基表主鍵、唯一約束或唯一索引生成。false:唯一地標(biāo)識(shí)該行時(shí)不需要此列。 |
BaseServerName | SqlDataReader 使用的 Microsoft SQL Server 實(shí)例的名稱。 |
BaseCatalogName | 包含列的數(shù)據(jù)存儲(chǔ)區(qū)中的目錄的名稱。如果不能確定基目錄名稱,則為 NULL。該列的默認(rèn)值為空值。 |
BaseColumnName | 數(shù)據(jù)存儲(chǔ)區(qū)中列的名稱。如果使用別名,它可能不同于在 ColumnName 列中返回的列名稱。如果無(wú)法確定基列名稱,或者如果行集合列從數(shù)據(jù)存儲(chǔ)區(qū)中的列導(dǎo)出但不等于該列,則為空值。該列的默認(rèn)值為空值。 |
BaseSchemaName | 包含列的數(shù)據(jù)存儲(chǔ)區(qū)中的架構(gòu)的名稱。如果無(wú)法確定基架構(gòu)名稱,則為空值。該列的默認(rèn)值為空值。 |
BaseTableName | 包含列的數(shù)據(jù)存儲(chǔ)區(qū)中的表或視圖的名稱。如果無(wú)法確定基表名稱,則為空值。該列的默認(rèn)值為空值。 |
DataType | 映射到列的 .Net Framework 類型。 |
AllowDBNull | 如果使用者可以將此列設(shè)置為空值,或者如果提供者不能確定使用者是否可以將此列設(shè)置為空值,則設(shè)置該值。否則,不設(shè)置該值。即使列無(wú)法設(shè)置為空值,它仍可能包含空值。 |
ProviderType | 列的數(shù)據(jù)類型的指示符。如果不同行的列數(shù)據(jù)類型不同,則它必須為 Object。該列不能包含空值。 |
IsAliased | 如果列名稱為別名,則為 true;否則為 false。 |
IsExpression | 如果此列為表達(dá)式,則為 true;否則為 false。 |
IsIdentity | 如果此列為標(biāo)識(shí)列,則為 true;否則為 false。 |
IsAutoIncrement | true:該列以固定的增量向新行賦值。false:該列不以固定的增量向新行賦值。該列的默認(rèn)值為 false。 |
IsRowVersion | 如果列包含無(wú)法寫入的不變的行標(biāo)識(shí)符,并且除了標(biāo)識(shí)行外沒有其他有意義的值,則設(shè)置該值。 |
IsHidden | 如果列是隱藏的,則為 true;否則為 false。 |
IsLong | 如果列包含二進(jìn)制長(zhǎng)對(duì)象 (BLOB)(它包含非常長(zhǎng)的數(shù)據(jù)),則設(shè)置該值。非常長(zhǎng)的數(shù)據(jù)的定義針對(duì)于提供程序。 |
IsReadOnly | 如果不能修改該列,則為 true;否則為 false。 |
注意 若要確保元數(shù)據(jù)列返回正確的信息,必須調(diào)用 behavior 參數(shù)設(shè)置為 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; }
新聞熱點(diǎn)
疑難解答
圖片精選