Compartilhar via


SQL: Personalizando a instrução de SQL do Recordset (ODBC)

Este tópico explica:

  • Como a estrutura constrói uma instrução SQL

  • Como substituir a instrução de SQL

ObservaçãoObservação

Essas informações se aplicam às classes MFC ODBC. Se você estiver trabalhando com as classes do MFC DAO, consulte o tópico "Comparação do Microsoft Jet banco de dados do mecanismo de SQL e ANSI SQL" na Ajuda do DAO.

Construção de instrução de SQL

Seu recordset baseia a seleção de registro principalmente em um SQL Selecionar instrução. Ao declarar sua classe com um assistente, ele grava uma versão de substituição da GetDefaultSQL função de membro parecida com isto (para uma classe de conjunto de registros chamado CAuthors).

CString CAuthors::GetDefaultSQL()
{
    return "AUTHORS";
}

Por padrão, essa substituição retorna o nome da tabela especificada com o assistente. No exemplo, o nome da tabela é "Autores". Quando você chamar mais tarde o conjunto de registros Abrir a função de membro, Abrir constrói um final Selecionar instrução do formulário:

SELECT rfx-field-list FROM table-name [WHERE m_strFilter] 
       [ORDER BY m_strSort]

onde table-name é obtida chamando GetDefaultSQL e rfx-field-list é obtido a partir de chamadas de função RFX em DoFieldExchange. Este é o que você recebe um Selecionar instrução, a menos que você substituí-lo com uma versão de substituição em tempo de execução, embora você também pode modificar a instrução padrão com parâmetros ou um filtro.

ObservaçãoObservação

Se você especificar um nome de coluna que contém (ou poderia conter) em espaços, coloque o nome entre colchetes. Por exemplo, o nome de "Nome" deve ser "[nome]".

Para substituir o padrão Selecionar instrução, passar uma seqüência de caracteres que contém um conjunto completo Selecionar instrução ao chamar Abrir. Em vez de construir sua própria seqüência de caracteres padrão, o conjunto de registros usa a seqüência de caracteres que você fornecer. Se a sua instrução de substituição contém um onde cláusula, não especificar um filtro na m_strFilter porque teria então duas declarações de filtro. Da mesma forma, se a sua instrução de substituição contém um ORDER BY cláusula, não especificar uma classificação em m_strSort para que você não terá duas instruções de classificação.

ObservaçãoObservação

Se você usar seqüências de caracteres literais em seus filtros (ou em outras partes da instrução SQL), talvez você precise "cotação" (coloque delimitadores especificados) tais cadeias de caracteres com um prefixo de literal específicas do DBMS e o caractere de sufixo literal (ou caracteres).

Você também pode encontrar os requisitos especiais de sintáticos para operações como, por exemplo, junções externas, dependendo do seu DBMS. Use as funções do ODBC para obter essas informações do seu driver para o DBMS. Por exemplo, chamar :: SQLGetTypeInfo para um tipo de dados específico, como SQL_VARCHAR, para solicitar a LITERAL_PREFIX e LITERAL_SUFFIX caracteres. Se você estiver escrevendo código que seja independente de banco de dados, consulte o Apêndice C na odbc sdk referência do programador no CD de Biblioteca MSDN para obter informações detalhadas de sintaxe.

Um objeto recordset constrói a instrução de SQL que ele usa para selecionar registros, a menos que você passe uma instrução de SQL personalizada. Como isso é feito depende principalmente o valor que você passar o lpszSQL parâmetro da Abrir a função de membro.

A forma geral de um SQL Selecionar instrução é:

SELECT [ALL | DISTINCT] column-list FROM table-list
    [WHERE search-condition][ORDER BY column-list [ASC | DESC]]

Uma maneira de adicionar o DISTINCT palavra-chave para a instrução de SQL do recordset é incorporar a palavra-chave na primeira chamada de função RFX em DoFieldExchange. For example:

...
    RFX_Text(pFX, "DISTINCT CourseID", m_strCourseID);
...
ObservaçãoObservação

Essa técnica é usada somente com um conjunto de registros aberto como somente leitura.

Substituindo a instrução de SQL

A tabela a seguir mostra as possibilidades para a lpszSQL parâmetro para Abrir. Os casos na tabela são explicados na tabela a seguir.

O parâmetro de lpszSQL e a seqüência resultante de SQL

Case

Passar no lpszSQL

A instrução SELECT resultante

1

NULL

Selecione lista de campos de rfx FROM nome de tabela

CRecordset::Openchamadas GetDefaultSQL para obter o nome da tabela. A seqüência de caracteres resultante é um dos casos de 2 a 5, dependendo do que GetDefaultSQL retorna.

2

Um nome de tabela

Selecione lista de campos de rfx FROM nome de tabela

A lista de campos é tirada de instruções as RFX em DoFieldExchange. Se m_strFilter e m_strSort não estão vazias, adiciona o onde e/ou ORDER BY cláusulas.

3 *

Uma completa Selecionar declaração, mas sem um onde ou ORDER BY cláusula

Como o passado. Se m_strFilter e m_strSort não estão vazias, adiciona o onde e/ou ORDER BY cláusulas.

4 *

Uma completa Selecionar instrução com um onde e/ou ORDER BY cláusula

Como o passado. m_strFilter e/ou m_strSort deve permanecer vazio ou o filtro de dois e/ou classificação declarações são produzidas.

5 *

Uma chamada para um procedimento armazenado

Como o passado.

* m_nFields deve ser menor ou igual ao número de colunas especificado na Selecionar instrução. O tipo de dados de cada coluna especificada na Selecionar instrução deve ser o mesmo tipo de dados da coluna de saída RFX correspondente.

Caso 1 lpszSQL = NULL

A seleção de recordset depende de qual GetDefaultSQL retorna quando CRecordset::Open chama o proprietário. Casos de 2 a 5 descrevem as seqüências de caracteres possíveis.

Caso lpszSQL 2 = um nome de tabela

O conjunto de registros usa a troca de campo de registro (RFX) para criar a lista de coluna de nomes de coluna, fornecidos no RFX função chama a substituição da classe do conjunto de registros do DoFieldExchange. Se você usou um Assistente para declarar sua classe de conjunto de registros, neste caso, tem o mesmo resultado que caso 1, (desde que você passar o mesmo nome de tabela que você especificou no Assistente). Se você não usar um Assistente para escrever sua classe, caso 2 é a maneira mais simples para construir a instrução SQL.

O exemplo seguinte constrói uma instrução de SQL que seleciona registros de um aplicativo de banco de dados do MFC. Quando a estrutura chama o GetDefaultSQL a função de membro, a função retorna o nome da tabela, SECTION.

CString CEnrollSet::GetDefaultSQL()
{
    return "SECTION";
}

Para obter os nomes das colunas para o SQL Selecionar declaração, as chamadas de estrutura de DoFieldExchange função de membro.

void CEnrollSet::DoFieldExchange(CFieldExchange* pFX)
{
    pFX->SetFieldType(CFieldExchange::outputColumn);
    RFX_Text(pFX, "CourseID", m_strCourseID);
    RFX_Text(pFX, "InstructorID", m_strInstructorID);
    RFX_Text(pFX, "RoomNo", m_strRoomNo);
    RFX_Text(pFX, "Schedule", m_strSchedule);
    RFX_Text(pFX, "SectionNo", m_strSectionNo);
}

Ao concluir, a instrução SQL é semelhante a:

SELECT CourseID, InstructorID, RoomNo, Schedule, SectionNo 
    FROM SECTION

Caso lpszSQL 3 = um SELECT / de instrução

Especifique a lista de colunas manualmente em vez de depender de RFX para construí-la automaticamente. Talvez você queira fazer quando:

  • Para especificar o DISTINCT seguinte da palavra-chave Selecionar.

    Sua lista de coluna deve corresponder os nomes de coluna e tipos na mesma ordem em que estão listados em DoFieldExchange.

  • Você tem razão para recuperar manualmente os valores de coluna usando a função ODBC :: SQLGetData em vez de depender de RFX vincular e recuperar as colunas para você.

    Por exemplo, convém para acomodar novas colunas que um cliente do seu aplicativo é adicionado às tabelas de banco de dados depois que o aplicativo foi distribuído. Você precisa adicionar esses membros de dados do campo extra, não eram conhecidos no momento em que a classe é declarada com um assistente.

    Sua lista de coluna deve corresponder os nomes de coluna e tipos na mesma ordem em que estão listados em DoFieldExchange, seguido pelos nomes das colunas acopladas manualmente. For more information, see O conjunto de registros: Vinculando dinamicamente a colunas de dados (ODBC).

  • Você deseja associar tabelas especificando-se várias tabelas na FROM cláusula.

    Para obter informações e um exemplo, consulte O conjunto de registros: Executar uma associação (ODBC).

Caso lpszSQL 4 = selecionar / e/FROM Plus WHERE ou ORDER BY

Você especificar tudo: a lista de colunas (com base em chamadas de RFX de DoFieldExchange), a lista de tabela e o conteúdo de um onde e/ou um ORDER BY cláusula. Se você especificar o onde e/ou ORDER BY cláusulas desta forma, não use m_strFilter e/ou m_strSort.

Caso lpszSQL 5 = uma chamada de procedimento armazenado

Se você precisar chamar uma consulta predefinida (como um procedimento armazenado em um banco de dados de Microsoft SQL Server), você deve escrever uma chamada a instrução na seqüência de caracteres que você passar para lpszSQL. Os assistentes não suportam a declarar uma classe de conjunto de registros para chamar uma consulta predefinida. Nem todas as consultas predefinidas retornam registros.

Se uma consulta predefinida não retornar registros, você pode usar o CDatabase a função de membro ExecuteSQL diretamente. Para uma consulta predefinida retornar registros, você deve escrever manualmente chama o RFX DoFieldExchange para todas as colunas retorna o procedimento. As chamadas RFX devem estar na mesma ordem e retornar os mesmos tipos, como a consulta predefinida. For more information, see O conjunto de registros: Declarar uma classe para uma consulta predefinida (ODBC).

Consulte também

Conceitos

SQL: SQL e tipos de dados C++ (ODBC)

SQL: Fazer chamadas diretas de SQL (ODBC)