Bu adım adım kılavuzda, Jet için
GetOleDbSchemaTable yöntemi Microsoft OLE DB yönetilen sağlayıcı ve Microsoft OLE DB sağlayıcı kullanarak, tablo ve sütun meta verileri bir Microsoft Excel veri kaynağından almak için kullanın.
Microsoft .NET Framework'ün
System.Data.OLEDB sınıf tarafından gösterilen
GetOleDbSchemaTableOpenSchema yöntemi önceki sürümlerinde ActiveX Data Objects (ADO) için .NET ardıl yöntemdir.
Tekniğin Açıklaması
Microsoft ADO.NET kullanarak bir Excel veri kaynağına bağlandıktan sonra
GetOleDbSchemaTable yöntemini kullanarak tablo meta verileri listesini ayıklar. Sonra aynı yöntemi, seçili tablo için sütun meta verilerini elde etmek için farklı bağımsız değişkenlerle birlikte kullanın.
DataGridTableStyle yöntemini düzenlemek ve bir <a0>Veri</a0> kılavuzunda, sorgu sonuçlarını biçimlendirmek için de kullanılabilir.
Gereksinimler
Aşağıdaki listede, gereksinim duyacağınız donanım, yazılım, ağ altyapısı ve hizmet paketleri önerilmektedir:
- Microsoft Visual Studio uyumlu bir Microsoft Windows işletim sistemi üzerine yüklenmiş .NET.
- En az bir Microsoft Excel çalışma kitabı dosyası (.xls) bazı satır ve sütun veri.
Bu makalede, aşağıdaki konularda bilgi sahibi olduğunuz varsayılmaktadır:
- Microsoft Visual C# .NET.
- Microsoft ADO.NET veri erişimi.
- Microsoft Excel çalışma kitapları ve çalışma sayfaları.
ÖRNEK
- Visual Studio. NET'i başlatın ve yeni bir Visual C# Windows Forms uygulaması) projesi oluşturun.
- Form1'e, üç Düğme denetimi ve iki DataGrid denetimi ekleyin. Meta veri almak, Biçim tabloları listesi ve Biçim sütunlar, düğmeleri sırasıyla adlandırmak için Düğme denetimi Text özelliğini değiştirin.
- Form kodu modüle geçin ve aşağıdaki önce başka bir kodu ekleyin:
using System.ComponentModel;
using System.Data;
using System.Data.OleDb;
- Form sınıfında, aşağıdaki Modül düzeyinde bildirimleri ekleyin. Bağlantı varsa, bazı satır ve sütun veri içeren bir Excel çalışma kitabı dosyası noktasına dize.
private OleDbConnection cn;
private String strCn = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=c:\\test.xls;Extended Properties=Excel 8.0";
private DataTable dtTables;
private CurrencyManager cm;
private DataTable dtColumns;
private DataView dvColumns;
- Form sınıfta, Windows Form Designer tarafından üretilen kod bölümünden sonra aşağıdaki kodu ekleyin. GetOleDbSchemaTable tablo yüklemek için bu kodu çağırır ve sütun listeler DataGrids doldurur ve Seçili tabloyu değiştiğinde, sütunlar listesi güncelleştirir.
private void button1_Click(object sender, System.EventArgs e)
{
GetTablesList();
}
private void GetTablesList()
{
try
{
cn = new OleDbConnection(strCn);
cn.Open();
dtTables = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[]{null,null,null,"TABLE"});
dataGrid1.DataSource = dtTables;
dataGrid1.ReadOnly = true;
cn.Close();
}
catch(System.Data.OleDb.OleDbException myException)
{
for (int i=0; i < myException.Errors.Count; i++)
{
MessageBox.Show("Index #" + i + "\n" +
"Message: " + myException.Errors[i].Message + "\n" +
"Native: " +
myException.Errors[i].NativeError.ToString() + "\n" +
"Source: " + myException.Errors[i].Source + "\n" +
"SQL: " + myException.Errors[i].SQLState + "\n");
}
}
GetColumnsList();
}
private void GetColumnsList()
{
if( cm == null)
cm = (CurrencyManager)this.BindingContext [dtTables];
cm.PositionChanged += new EventHandler(this.cm_PositionChanged );
int r = cm.Position;
String strTable = dtTables.Rows[r]["TABLE_NAME"].ToString ();
cn = new OleDbConnection(strCn);
cn.Open();
dtColumns = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Columns,new Object[]{null,null, strTable, null});
dvColumns = new DataView(dtColumns);
dvColumns.Sort = "ORDINAL_POSITION";
dataGrid2.DataSource = dvColumns;
dataGrid2.ReadOnly = true;
cn.Close();
}
private void cm_PositionChanged( object sender, System.EventArgs e)
{
GetColumnsList();
}
- Düzenlemek ve tablolar DataGridTableStyles kullanarak biçimlendirmek için aşağıdaki kodu ekleyin. Tarih sütunlarının varsayılan olmayan biçimlendirmeleri kolaylaştırmak için PropertyDescriptor kullanımına dikkat edin.
private void button2_Click(object sender, System.EventArgs e)
{
FormatTablesGrid(dtTables);
}
private void FormatTablesGrid(DataTable dt2format)
{
DataGridTableStyle gs = new DataGridTableStyle();
gs.MappingName = dt2format.TableName;
DataGridColumnStyle cs = new DataGridTextBoxColumn();
cs.MappingName = "TABLE_NAME";
cs.HeaderText = "Table Name";
cs.Width = 75;
gs.GridColumnStyles.Add(cs);
cs = new DataGridTextBoxColumn();
cs.MappingName = "TABLE_TYPE";
cs.HeaderText = "Table Type";
cs.Width = 75;
gs.GridColumnStyles.Add(cs);
CurrencyManager cm = (CurrencyManager)this.BindingContext[dt2format];
PropertyDescriptor pd = cm.GetItemProperties()["DATE_CREATED"];
cs = new DataGridTextBoxColumn(pd, "d");
cs.MappingName = "DATE_CREATED";
cs.HeaderText = "Date Created";
cs.Width = 75;
gs.GridColumnStyles.Add(cs);
cm = ( CurrencyManager)this.BindingContext[dt2format];
pd = cm.GetItemProperties()["DATE_MODIFIED"];
cs = new DataGridTextBoxColumn(pd, "d");
cs.MappingName = "DATE_MODIFIED";
cs.HeaderText = "Date Modified";
cs.Width = 75;
gs.GridColumnStyles.Add(cs);
dataGrid1.TableStyles.Add(gs);
button2.Enabled = false;
}
- DataGrid sütunları TableStyle kullanarak biçimlendirmek veya düzenlemek için aşağıdaki kodu ekleyin:
private void button3_Click(object sender, System.EventArgs e)
{
FormatColumnsGrid(dtTables);
}
private void FormatColumnsGrid(DataTable dt2format)
{
DataGridTableStyle gs = new DataGridTableStyle();
gs.MappingName = dtColumns.TableName;
DataGridColumnStyle cs = new DataGridTextBoxColumn();
cs.MappingName = "COLUMN_NAME";
cs.HeaderText = "Column Name";
cs.Width = 100;
gs.GridColumnStyles.Add(cs);
cs = new DataGridTextBoxColumn();
cs.MappingName = "ORDINAL_POSITION";
cs.HeaderText = "Ordinal Position";
cs.Width = 100;
gs.GridColumnStyles.Add(cs);
cs = new DataGridTextBoxColumn();
cs.MappingName = "DATA_TYPE";
cs.HeaderText = "Data Type";
cs.Width = 75;
gs.GridColumnStyles.Add(cs);
cs = new DataGridTextBoxColumn();
cs.MappingName = "CHARACTER_MAXIMUM_LENGTH";
cs.HeaderText = "Text Length";
cs.Width = 75;
gs.GridColumnStyles.Add(cs);
cs = new DataGridTextBoxColumn();
cs.MappingName = "NUMERIC_PRECISION";
cs.HeaderText = "Numeric Precision";
cs.Width = 75;
gs.GridColumnStyles.Add(cs);
dataGrid2.TableStyles.Add(gs);
button3.Enabled = false;
}
- Projeyi çalıştırın.
- Meta veri al (Button1) tıklatın.
Tablolar listesine (DataGrid1), Excel çalışma kitabındaki her tablo için GetOleDbSchemaTable yöntemi tarafından döndürülen bilgileri tüm sütunları olarak girilir. Bilgi için <a0>Tablolar</a0> listesinde ilk tablodaki sütunları döndürülen tüm sütunlarla aynı anda sütunlar listesi (DataGrid2) doldurur. - Tablolar listesinden, farklı bir tablo seçin.
Cm_PositionChanged olay işleyicisi, seçili tablo sütunlarından sütunları listeler. - Biçim tabloları listesi (Button2)</a1> seçeneğini tıklatın. Bu tanımlar ve sütun başlıkları daha kolay hale getirme ve yalnızca dört kullanışlı bir veri sütunlarını görüntüleyerek bir TableMappingStyle, DataGrid1 için geçerlidir.
table_name
table_type
date_created
date_modified
GetOleDbSchemaTable yöntemi tarafından döndürülen dokuz sütunlar yerine.
Boşluklar sütunları görüntülenmez şunlardır:table_catalog
table_schema
table_guid
Açıklama
table_propid
- Biçim sütunlar listesi (Button3)</a1> seçeneğini tıklatın. Bu işlem, tanımlar ve sütun başlıkları daha kolay hale getirme ve yalnızca beş en kullanışlı sütun COLUMN_NAME ORDINAL_POSITION DATA_TYPE MAXIMUM_CHARACTER_LENGTH NUMERIC_PRECISION 28 sütunlarından GetOleDbSchemaTable yöntemi tarafından döndürülen verileri görüntüleyen bir TableMappingStyle DataGrid2 için geçerlidir.
Değil görüntülenen sütunlar şunlardır:
table_catalog
table_schema
TABLE_NAME (zaten bilinen)
column_guid
column_propid
COLUMN_HASDEFAULT (her zaman false)
column_default
column_flags
IS_NULLABLE (her zaman doğru)
type_guid
character_octet_length
numeric_scale
datetime_precision
character_set_catalog
character_set_schema
character_set_name
collation_catalog
collation_schema
collation_name
domain_catalog
domain_schema
Etki_alanı_adı
Açıklama
- Farklı bir satırdaki DataGrid1 farklı bir tablo seçmek için Ek Yardım düğmesini tıklatın. Sütunlar listesinde otomatik olarak güncelleştirilir. Daha önce her bir DataGrid için uygulanan TableStyles etkin kalır.
SORUN GİDERME
- Bir Excel veri kaynağı için GetOleDbSchemaTable yöntemi tarafından döndürülen sütun veri türleri her durumda önceki sürümlerinde bir ADO OpenSchema yöntemi tarafından döndürülen veri türleri aynı değil:
Bu tabloyu kapaBu tabloyu aç
| Sütun türü | Klasik ADO | ADO.Net (OleDb) |
|---|
| Sayısal | 5 adDouble | 5 OleDbType.Double |
| Para birimi | 6 adCurrency | 6 OleDbType.Currency |
| Date/Time | 7 adDate | 7 OleDbType.Date |
| Mantıksal değer | 11 adBoolean | 11 OleDbType.Boolean |
| Metin < 255 | 202 adVarWChar | 130 OleDbType.WChar |
| Kısa Not | 203 adLongVarWChar | 130 OleDbType.WChar |
- GetOleDbSchemaTable, OpenSchema için benzer ("F1") tek bir sütun boş bir Excel çalışma sayfasından döndürür, aslında hiçbir veri veya sütun başlıkları yok.
Ek bilgi için, Microsoft Bilgi Bankası'ndaki makaleyi görüntülemek üzere aşağıdaki makale numarasını tıklatın:
257819
(http://support.microsoft.com/kb/257819/EN-US/
)
Nasıl YAPıLıR: Excel verilerden Visual Basic'de veya VBA'DA ile ADO kullanma.