Makale numarası: 318452 - Son Gözden Geçirme: 03 Eylül 2003 Çarşamba - Gözden geçirme: 2.2

NASıL YAPıLıR: Meta veri GetOleDbSchemaTable Visual C# .NET kullanarak Excel'den alma

Sistem İpucuBu makale, kullandığınızdan farklı bir işletim sistemine yöneliktir. Sizinle ilgili olmayabilecek makale içeriği devre dışı bırakıldı.

Bu Sayfada

Hepsini aç | Hepsini kapa

Özet

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

  1. Visual Studio. NET'i başlatın ve yeni bir Visual C# Windows Forms uygulaması) projesi oluşturun.
  2. 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.
  3. 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;
    					
  4. 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;
    					
  5. 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();
    }
    								
    					
  6. 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;
    
    }
    					
  7. 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;
    
    	}
    					
  8. Projeyi çalıştırın.
  9. 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.
  10. Tablolar listesinden, farklı bir tablo seçin.

    Cm_PositionChanged olay işleyicisi, seçili tablo sütunlarından sütunları listeler.
  11. 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
  12. 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
  13. 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 ADOADO.Net (OleDb)
    Sayısal5 adDouble5 OleDbType.Double
    Para birimi6 adCurrency6 OleDbType.Currency
    Date/Time7 adDate7 OleDbType.Date
    Mantıksal değer11 adBoolean11 OleDbType.Boolean
    Metin < 255202 adVarWChar130 OleDbType.WChar
    Kısa Not203 adLongVarWChar130 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.

Referanslar

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.

Bu makaledeki bilginin uygulandığı durum:
  • Microsoft ADO.NET 1.1
  • Microsoft ADO.NET 1.0
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
Anahtar Kelimeler: 
kbmt kbhowtomaster KB318452 KbMttr
Otomatik TercümeOtomatik Tercüme
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:318452  (http://support.microsoft.com/kb/318452/en-us/ )