Compartilhar via


SQL: Personalizando conjunto de registros instrução SQL (ODBC)

Este tópico explica:

  • Como a estrutura constrói uma demonstrativo SQL

  • Como substituir o demonstrativo SQL

Observação:

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

Construção de demonstrativo SQL

O conjunto de registros baseia a seleção de registro principalmente em um SQL selecionar demonstrativo.Quando você declara sua classe com um assistente, ele grava uma versão de substituição do GetDefaultSQL função de membro que procura algo assim (para uma classe de conjunto de registros chamada CAuthors).

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

Por padrão, essa substituir retorna nome da tabela especificado com o assistente.No exemplo, o nome da tabela é "Autores." Quando você mais tarde telefonar em aberto função de membro , em aberto constrói um final selecionar demonstrativo do formulário:

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

em que table-name é obtida chamando GetDefaultSQL e rfx-field-list são obtidas das chamadas de função RFX no DoFieldExchange. Este é o que você tem um selecionar demonstrativo, a menos que você substituí-lo com uma versão de substituição em time de execução, embora você também pode modificar a demonstrativo padrão com parâmetros ou um filtro.

Observação:

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

Para substituir o padrão de selecionar demonstrativo, passar uma seqüência de caracteres contendo um completo selecionar demonstrativo ao chamar em aberto.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 sua demonstrativo substituição contiver um ONDE cláusula, não especificar um filtro no m_strFilter porque você poderia, em seguida, tem duas instruções de filtro.Da mesma forma, se sua demonstrativo substituição contiver um ORDENAR POR cláusula, não especificar uma classificação m_strSort para que não tenha dois classificar instruções.

Observação:

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

Você também pode encontrar sintáticos requisitos especiais para operações sistema autônomo associações externas, dependendo do seu DBMS.Use funções ODBC para obter essas informações do seu driver para o DBMS.Por exemplo, chamar :: SQLGetTypeInfo para um tipo de dados específico, sistema autônomo SQL_VARCHAR, para solicitar o LITERAL_PREFIX and LITERAL_SUFFIX caracteres.If you are writing database-independent code, see Appendix C in the ODBC SDKProgrammer's Reference on the MSDN Library CD for detailed syntax information.

Constrói um objeto conjunto de registros a demonstrativo SQL que ele usa para selecionar registros, a menos que você passar um personalizado demonstrativo SQL.Como isso é concluído depende principalmente o valor que você passar o lpszSQL parâmetro das em abertofunção de membro .

A forma geral de um SQL selecionar demonstrativo é:

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

Uma maneira de adicionar o DISTINTAS palavra-chave para o conjunto de registros demonstrativo SQL é incorporar a palavra-chave na primeira telefonar de função RFX em DoFieldExchange. Por exemplo:

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

Usar essa técnica somente com um conjunto de registros aberto sistema autônomo somente leitura.

Substituindo o demonstrativo SQL

A tabela a seguir mostra as possibilidades do lpszSQL parâmetro para em aberto.As ocorrências da tabela são explicadas a tabela a seguir.

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

Case

O que você passar lpszSQL

A demonstrativo selecionar resultante

1

NULL

SELECTrfx-field-listFROMtable-name

CRecordset::Open chamadas GetDefaultSQL Para obter o nome da tabela. A seqüência de caracteres resultante é um dos casos 2 a 5, dependendo de quais GetDefaultSQL Retorna.

2

Um nome da tabela

SELECTrfx-field-listFROMtable-name

A lista de campos é tirada das declarações de RFX DoFieldExchange. If m_strFilter and m_strSort não estão vazias, adiciona o ONDE and/or ORDENAR POR cláusulas.

3 *

Um completo selecionar demonstrativo, mas sem um ONDE or ORDENAR POR cláusula

sistema autônomo passado.If m_strFilter and m_strSort não estão vazias, adiciona o ONDE and/or ORDENAR POR cláusulas.

4 *

Um completo selecionar demonstrativo com um ONDE and/or ORDENAR POR cláusula

sistema autônomo passado.m_strFilter and/or m_strSort deve permanece vazio ou dois filtros e/ou classificar declarações são produzidas.

5 *

Uma telefonar para um procedimento armazenado

sistema autônomo passado.

* m_nFields deve ser menor ou igual ao número de colunas especificado na selecionar demonstrativo.O tipo de dados de cada coluna especificada no selecionar demonstrativo deve ser o mesmo sistema autônomo o tipo de dados de RFX correspondente coluna de saída.

Caso 1 lpszSQL = nulo

A seleção do conjunto de registros depende de qual GetDefaultSQL Retorna quando CRecordset::Open faz a chamada. Casos de 2 a 5 descrevem as seqüências de caracteres possíveis.

Caso lpszSQL 2 = nome da tabela

O conjunto de registros usa a troca de campo de registro (RFX) para criar a lista de coluna de nomes de coluna fornecida nas chamadas de função RFX na substituir da classe de conjunto de registros de DoFieldExchange. Se você usou um Assistente para declarar clsistema autônomos seu conjunto de registros, este csistema autônomoe h sistema autônomo o mesmo resultado sistema autônomo csistema autônomoe 1 (desde que psistema autônomos o mesmo nome da tabela especificado no Assistente).Se você não usar um Assistente para escrever sua classe, caso 2 é a maneira mais simples para construir o demonstrativo SQL.

O exemplo seguinte constrói um demonstrativo SQL que seleciona registros de um aplicativo de banco de dados MFC.Quando a estrutura chama o GetDefaultSQL 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 demonstrativo, a estrutura chama o 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 demonstrativo SQL é semelhante a:

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

Caso lpszSQL 3 = um selecionar / FROM demonstrativo

Você especificar manualmente a lista de colunas em vez de confiar em RFX para construí-la automaticamente.Convém fazer essa quando:

  • Para especificar o DISTINTAS palavra-chave a seguirselecionar.

    Sua lista de coluna deve correspondem aos nomes de coluna e tipos na mesma ordem conforme eles são listados na DoFieldExchange.

  • Você tenha motivo para recuperar valores de coluna usando o ODBC função manualmente**:: SQLGetData** em vez de contar com RFX BIND e recuperar colunas para você.

    Por exemplo, convém para acomodar novas colunas de 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 que você declarou a classe com um assistente.

    Sua lista de coluna deve correspondem aos nomes de coluna e tipos na mesma ordem conforme eles são listados na DoFieldExchange, seguido por nomes das colunas manualmente acoplados. Para obter mais informações, consulte conjunto de registros: Vinculação dinâmica colunas de dados (ODBC).

  • Você deseja ingressar tabelas especificando várias tabelas no DE cláusula.

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

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

Tudo o que você especificar: a lista de colunas (com base nas chamadas RFX no DoFieldExchange), a Lista em Tabela e o Sumário de um ONDE and/or an ORDENAR POR cláusula.Se você especificar o seu ONDE and/or ORDENAR POR cláusulas desta forma, não use m_strFilter and/or m_strSort.

Caso lpszSQL 5 = uma telefonar de procedimento armazenado

Se você precisar chamar uma consulta predefinida (sistema autônomo um procedimento armazenado em um banco de dados do Microsoft SQL servidor), você deverá gravar um telefonar demonstrativo na seqüência de caracteres que você passar para lpszSQL. Os assistentes não têm suporte para 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 função de membro ExecuteSQL diretamente. Para uma consulta predefinida que retorna registros, manualmente você deve escrever que o RFX chama em DoFieldExchange para todas as colunas retorna o procedimento. sistema autônomo chamadas RFX devem estar na mesma ordem e retornar sistema autônomo mesmos tipos, que consulta predefinida.Para obter mais informações, consulte conjunto de registros: Declarar uma classe para uma consulta predefinida (ODBC).

Consulte também

Conceitos

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

SQL: Fazendo chamadas SQL Direct (ODBC)