Utilize este guia passo-a-passo para obter metadados tabelas e colunas de uma origem de dados Microsoft Excel utilizando o método
GetOleDbSchemaTable com o fornecedor Microsoft OLE DB geridos e o Microsoft OLE DB Provider for Jet.
O método
GetOleDbSchemaTable exposto pela classe
System.data.OLEDB do Microsoft .NET Framework é o sucessor do .NET para o método
OpenSchema em versões anteriores do ActiveX Data Objects (ADO).
Descrição da técnica
Depois de ligar a uma origem de dados do Excel utilizando o Microsoft ADO.NET, extrai uma lista de tabela meta dados utilizando o método
GetOleDbSchemaTable . Em seguida, utilize o mesmo método com argumentos diferentes para obter metadados de coluna para a tabela seleccionada. Também pode utilizar o método
DataGridTableStyle para esquematizar e formatar resultados da consulta na grelha de dados.
Requisitos
A lista seguinte descreve o hardware recomendado, software, infra-estrutura de rede e service packs que necessita:
- Microsoft Visual Studio .NET instalado num sistema operativo Microsoft Windows compatível.
- Pelo menos o Microsoft Excel livro ficheiro (.xls) com algumas linhas e colunas de dados.
Este artigo pressupõe que está familiarizado com os seguintes tópicos:
- Microsoft Visual C# .NET.
- Microsoft ADO.NET acesso a dados.
- Folhas de cálculo e livros do Microsoft Excel.
Exemplo
- Inicie o Visual Studio .NET e crie um novo projecto de Visual C# Windows formulários de aplicação.
- Adicione dois controlos DataGrid e de três controlos botão ao Form1. Altere a propriedade texto dos controlos botão para designar os botões de Obter dados de Meta , Formato de lista de tabelas e de Formato de lista de colunas , respectivamente.
- Mude para o módulo de código para o formulário e adicionar as seguintes instruções antes de qualquer outro código:
using System.ComponentModel;
using System.Data;
using System.Data.OleDb;
- A classe de formulário , inserir as seguintes declarações de nível de módulo. Que a ligação, aponte para um ficheiro de livro do Excel que contém algumas linhas e colunas de dados de cadeia.
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;
- Da classe de formulário , após a secção de código Windows criador de formulários gerados, insira o seguinte código. Este código chama GetOleDbSchemaTable para carregar a tabela e coluna lista preenche DataGrids e actualiza a lista de colunas quando altera a tabela seleccionada.
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();
}
- Insira o seguinte código para esquematizar e formatar tabelas DataGrid utilizando TableStyles . Tenha em atenção a utilização de PropertyDescriptor para facilitar a formatação não predefinida das colunas data.
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;
}
- Insira o seguinte código para esquematizar e formatar as colunas DataGrid utilizando TableStyle :
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;
}
- Execute o projecto.
- Clique em obter dados Meta (Button1).
A lista de tabelas (DataGrid1) é preenchida com todas as colunas de informações devolvidas para cada tabela no livro do Excel pelo método GetOleDbSchemaTable . Copia a lista de colunas (DataGrid2) ao mesmo tempo com todas as colunas de informações devolvidas para as colunas da primeira tabela na lista tabelas . - Na lista de tabelas , seleccione uma tabela diferente.
A lista de colunas mostra as colunas da tabela seleccionada como resultado de processador de eventos cm_PositionChanged . - Clique em formato de lista de tabelas (Button2). Isto define e aplica um TableMappingStyle para DataGrid1, efectuar os cabeçalhos das colunas mais amigáveis e apresentar apenas as quatro colunas de dados útil
TABLE_NAME
TABLE_TYPE
DATE_CREATED
DATE_MODIFIED
em vez das nove colunas devolvidas pelo método GetOleDbSchemaTable .
As colunas em branco que não são apresentadas são:TABLE_CATALOG
TABLE_SCHEMA
TABLE_GUID
DESCRIÇÃO
TABLE_PROPID
- Clique em formato de lista de colunas (Button3). Isto define e aplica um TableMappingStyle para DataGrid2, efectuar os cabeçalhos das colunas mais amigáveis e apresentar apenas as cinco mais úteis colunas de dados COLUMN_NAME ORDINAL_POSITION DATA_TYPE MAXIMUM_CHARACTER_LENGTH NUMERIC_PRECISION das 28 colunas devolvido pelo método GetOleDbSchemaTable .
As colunas que não são apresentadas são:
TABLE_CATALOG
TABLE_SCHEMA
TABLE_NAME (já conhecida)
COLUMN_GUID
COLUMN_PROPID
COLUMN_HASDEFAULT (sempre false)
COLUMN_DEFAULT
COLUMN_FLAGS
IS_NULLABLE (sempre true)
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
NOME_DOMÍNIO
DESCRIÇÃO
- Clique numa linha diferente na DataGrid1 para seleccionar uma tabela diferente. A lista de colunas é actualizada automaticamente. TableStyles anteriormente aplicada a cada DataGrid permanecem em vigor.
Resolução de problemas
- Os tipos de dados de coluna devolvidos pelo método GetOleDbSchemaTable para uma origem de dados do Excel não são iguais em todos os incidentes para os tipos de dados devolvidos pelo método OpenSchema em versões anteriores do ADO:
Reduzir esta tabelaExpandir esta tabela
| Tipo de coluna | ADO clássico | ADO.NET (OleDb) |
|---|
| Numérico | 5 adDouble | 5 OleDbType.Double |
| Moeda | adCurrency 6 | OleDbType.Currency 6 |
| Data/hora | adDate 7 | OleDbType.Date 7 |
| Valor boleano | 11 adBoolean | 11 OleDbType.Boolean |
| Texto < 255 | 202 adVarWChar | 130 OleDbType.WChar |
| Nota | 203 adLongVarWChar | 130 OleDbType.WChar |
- GetOleDbSchemaTable , semelhante ao OpenSchema , devolve uma única coluna ("F1") de uma folha de cálculo vazia do Excel quando, na realidade, não cabeçalhos de coluna ou dados existem.
Para obter informações adicionais, clique no número de artigo existente abaixo para visualizar o artigo na base de dados de conhecimento da Microsoft:
257819
(http://support.microsoft.com/kb/257819/EN-US/
)
COMO: Utilizar o ADO com dados do Excel a partir do Visual Basic ou VBA