Testando o provedor de somente leitura
Para testar um provedor, você precisa de um consumidor.É útil se o consumidor pode corresponder ao com o provedor.Os modelos de consumidor OLEDB são um wrapper estreito ao redor do OLE DB e coincidirem com os objetos COM do provedor.Como a fonte é fornecida com os modelos do consumidor, é fácil depurar um provedor com eles.Os modelos de consumidor também são uma forma muito pequena e rápida para desenvolver aplicativos do consumidor.
O exemplo neste tópico cria um aplicativo do MFC Application assistente padrão para um consumidor de teste.O aplicativo de teste é uma caixa de diálogo simples com código de modelo de consumidor OLE DB adicionado.
Para criar o aplicativo de teste
Sobre o Arquivo menu, clicar Newe, em seguida, clicar Projeto.
No painel projeto Types, selecionar o Projetos do Visual C++ pasta.No painel Templates, selecionar Aplicativo MFC.
Para o nome do projeto, digite TestProve, em seguida, clicar OK.
MFC aplicativo assistente aparece.
Sobre o Tipo de aplicativo página, selecionar Caixa de diálogo com base em.
Sobre o Recursos avançados página, selecionar Automaçãoe, em seguida, clicar Concluir.
Observação: |
---|
O aplicativo não requer suporte a automação se você adicionar Em coInitialize in CTestProvApp::InitInstance. |
Você pode exibir e edição a caixa de diálogo TestProv (IDD_TESTPROV_DIALOG) selecionando-a na exibição de recurso.Coloque dois lista caixas, uma para cada seqüência de caracteres no conjunto de linhas, na caixa de diálogo.Desativar a propriedade de classificar para ambos lista caixas pressionando ALT + ENTER quando um lista estiver selecionada, clicando no Estilos guia e limpando a classificar a caixa de seleção.Além disso, faça um Executar botão na caixa de diálogo para buscar o arquivo.A caixa de diálogo TestProv concluída deve ter duas caixas de listagem rotuladas "String 1" e "Seqüência de 2", respectivamente; ele também temOK, Cancelar, and Executar botões.
Abra o arquivo de cabeçalho para a classe de caixa de diálogo (no TestProvDlg.h neste caso).Adicione o seguinte código ao arquivo de cabeçalho (fora de qualquer declaração de classe):
////////////////////////////////////////////////////////////////////////
// TestProvDlg.h
class CProvider
{
// Attributes
public:
char szField1[16];
char szField2[16];
// Binding Maps
BEGIN_COLUMN_MAP(CProvider)
COLUMN_ENTRY(1, szField1)
COLUMN_ENTRY(2, szField2)
END_COLUMN_MAP()
};
O código representa um registro de usuário que define quais colunas serão no conjunto de linhas.Quando o cliente chama IAccessor::CreateAccessor, ele utiliza essas entradas para especificar as colunas que deseja BIND.Os modelos de consumidor OLE DB também permitem que você vincule colunas dinamicamente.As macros COLUMN_ENTRY são a versão cliente do macros PROVIDER_COLUMN_ENTRY.Duas macros COLUMN_ENTRY Especifica ordinal, membro de tipo, comprimento e dados para as duas seqüências de caracteres.
Adicionar uma função de manipulador para o Executar botão pressionando CTRL e clicando duas vezes o Executar botão.Coloque o código a seguir na função:
///////////////////////////////////////////////////////////////////////
// TestProvDlg.cpp
void CtestProvDlg::OnRun()
{
CCommand<CAccessor<CProvider> > table;
CDataSource source;
CSession session;
if (source.Open("MyProvider.MyProvider.1", NULL) != S_OK)
return;
if (session.Open(source) != S_OK)
return;
if (table.Open(session, _T("c:\\samples\\myprov\\myData.txt")) != S_OK)
return;
while (table.MoveNext() == S_OK)
{
m_ctlString1.AddString(table.szField1);
m_ctlString2.AddString(table.szField2);
}
}
The CCommand, CDataSource, e CSession todas as classes pertencem a modelos de consumidor OLE DB. Cada classe imita um objeto COM o provedor.The CCommand objeto leva a CProvider classe, declarado no arquivo de cabeçalho, sistema autônomo um parâmetro de modelo. The CProvider parâmetro representa ligações que você usa para acessar os dados do provedor. Aqui está o Open código para a fonte de dados, a sessão e o comando:
if (source.Open("MyProvider.MyProvider.1", NULL) != S_OK)
return;
if (session.Open(source) != S_OK)
return;
if (table.Open(session, _T("c:\\samples\\myprov\\myData.txt")) != S_OK)
return;
As linhas para em em aberto cada uma das classes de criam cada objeto COM no provedor.Para localizar o provedor, use o ProgID do provedor.Você pode obter o ProgID do registro do sistema ou examinando o arquivo MyProvider.rgs (em em aberto diretório e procure a chave ProgID do provedor).
O arquivo MyData.txt está incluído com o exemplo MyProv.Para criar um arquivo de sua preferência, use um editor e digite um número par de seqüências de caracteres, pressionando ENTER entre cada cadeia de caracteres.Altere o nome de caminho, se você mover o arquivo.
Transmite a seqüência de caracteres "c:\\Exemplos\\myprov\\MyData.txt" notable.Open linha. Se você entrar no Open telefonar, você verá que essa seqüência de caracteres é transmitida para o SetCommandText método no provedor. Observe que o ICommandText::Execute método usado dessa seqüência.
Para buscar os dados, telefonar MoveNext na tabela. MoveNext chamadas a IRowset::GetNextRows, GetRowCount, e GetData funções. Quando não há mais nenhuma linha (ou seja, a posição corrente no conjunto de linhas é maior que GetRowCount), o loop é encerrado:
while (table.MoveNext() == S_OK)
{
m_ctlString1.AddString(table.szField1);
m_ctlString2.AddString(table.szField2);
}
Observe que, quando não existem mais linhas, provedores de retornam DB_S_ENDOFROWSET.The DB_S_ENDOFROWSETvalor de não é um erro.Você sempre deve verificar S_OK Para cancelar um loop de busca de dados e não usar a macro teve êxito.
Agora será capaz de criar e testar o programa.