Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Este tópico explica:
Como a estrutura constrói uma instrução SQL
Como substituir a instrução SQL
Observação
Essas informações se aplicam às classes ODBC do MFC. Se você estiver trabalhando com as classes MFC DAO, consulte o tópico "Comparação do Microsoft Jet Database Engine SQL e ANSI SQL" na Ajuda do DAO.
Construção de Instrução SQL
Seu conjunto de registros baseia a seleção de registros principalmente em uma instrução SQL SELECT . Quando você declara sua classe com um assistente, ele grava uma versão de substituição da GetDefaultSQL função de membro que se parece com isso (para uma classe de conjunto de registros chamada CAuthors).
CString CAuthors::GetDefaultSQL()
{
return "AUTHORS";
}
Por padrão, essa substituição retorna o nome da tabela especificado com o assistente. No exemplo, o nome da tabela é "AUTHORS". Quando você chamar posteriormente a função de membro do conjunto de registros Open , Open constrói uma instrução SELECT final do formulário:
SELECT rfx-field-list FROM table-name [WHERE m_strFilter]
[ORDER BY m_strSort]
onde table-name é obtido por chamada GetDefaultSQL e rfx-field-list é obtido a partir das chamadas de função RFX em DoFieldExchange. Isso é o que você obtém para uma instrução SELECT , a menos que você a substitua por uma versão de substituição em tempo de execução, embora você também possa modificar a instrução padrão com parâmetros ou um filtro.
Observação
Se você especificar um nome de coluna que contenha (ou possa conter) espaços, deverá colocar o nome entre colchetes. Por exemplo, o nome "First Name" deve ser "[First Name]".
Para substituir a instrução SELECT padrão, passe uma cadeia de caracteres contendo uma instrução SELECT completa quando você chamar Open. Em vez de construir sua própria cadeia de caracteres padrão, o conjunto de registros usa a cadeia de caracteres fornecida. Se sua instrução de substituição contiver uma cláusula WHERE , não especifique um filtro porque m_strFilter você teria duas instruções de filtro. Da mesma forma, se a sua instrução de substituição contiver uma cláusula ORDER BY, não especifique uma ordenação em m_strSort para que não tenha duas instruções de ordenação.
Observação
Se você usar cadeias de caracteres literais em seus filtros (ou outras partes da instrução SQL), talvez seja necessário "citar" (incluir em delimitadores especificados) essas cadeias de caracteres com um prefixo literal específico do DBMS e um caractere (ou caracteres) de sufixo literal.
Você também pode encontrar requisitos sintáticos especiais para operações como junções externas, dependendo do seu DBMS. Use funções ODBC para obter essas informações do seu driver para o DBMS. Por exemplo, chame ::SQLGetTypeInfo para um tipo de dados específico, como SQL_VARCHAR, para solicitar os caracteres LITERAL_PREFIX e LITERAL_SUFFIX. Se você estiver escrevendo código independente de banco de dados, consulte o Apêndice C: Gramática SQL na Referência do programador ODBC para obter informações detalhadas sobre a sintaxe.
Um objeto recordset constrói a instrução SQL que ele usa para selecionar registros, a menos que você passe uma instrução SQL personalizada. Como isso é feito depende principalmente do valor que você passa no parâmetro lpszSQL da Open função membro.
A forma geral de uma instrução SQL SELECT é:
SELECT [ALL | DISTINCT] column-list FROM table-list
[WHERE search-condition][ORDER BY column-list [ASC | DESC]]
Uma maneira de adicionar a palavra-chave DISTINCT à instrução SQL do seu conjunto de registros é incorporar a palavra-chave na primeira chamada de função RFX no DoFieldExchange. Por exemplo:
...
RFX_Text(pFX, "DISTINCT CourseID", m_strCourseID);
...
Observação
Use essa técnica somente com um conjunto de registros aberto como somente leitura.
Substituindo a instrução SQL
A tabela a seguir mostra as possibilidades para o parâmetro lpszSQL para Open. Os casos na tabela são explicados seguindo a tabela.
O parâmetro lpszSQL e a cadeia de caracteres SQL resultante
| Incidente | O que você passa em lpszSQL | A instrução SELECT resultante |
|---|---|---|
| 1 | NULO |
SELECTrfx-field-listFROMtable-nameCRecordset::Open chama GetDefaultSQL para obter o nome da tabela. A cadeia de caracteres resultante é um dos casos de 2 a 5, dependendo do que GetDefaultSQL retorna. |
| 2 | Um nome de tabela |
SELECTrfx-field-listFROMtable-name A lista de campos é retirada das instruções RFX em DoFieldExchange. Se m_strFilter e m_strSort não estiverem vazios, adiciona as cláusulas WHERE e/ou ORDER BY . |
| 3 * | Uma instrução SELECT completa, mas sem uma cláusula WHERE ou ORDER BY | Como passou. Se m_strFilter e m_strSort não estiverem vazios, adiciona as cláusulas WHERE e/ou ORDER BY . |
| 4 * | Uma declaração SELECT completa com uma cláusula WHERE e/ou ORDER BY | Como passou.
m_strFilter e/ou m_strSort devem permanecer vazios, ou duas instruções de filtro e/ou classificação serão produzidas. |
| 5 * | Uma chamada para um procedimento armazenado | Como passou. |
*
m_nFields deve ser menor ou igual ao número de colunas especificado na instrução SELECT . O tipo de dados de cada coluna especificado na instrução SELECT deve ser o mesmo que o tipo de dados da coluna de saída RFX correspondente.
Caso 1 lpszSQL = NULL
A seleção do conjunto de registros depende do que GetDefaultSQL retorna quando CRecordset::Open o chama. Os casos 2 a 5 descrevem as cadeias de caracteres possíveis.
Caso 2 lpszSQL = um nome de tabela
O conjunto de registros usa RFX (troca de campo de registro) para criar a lista de colunas a partir dos nomes de coluna fornecidos nas chamadas de função RFX na substituição de DoFieldExchange. Se você usou um assistente para declarar sua classe de conjunto de registros, esse caso terá o mesmo resultado que o caso 1 (desde que você passe o mesmo nome de tabela especificado no assistente). Se você não usar um assistente para escrever sua classe, o caso 2 é a maneira mais simples de construir a instrução SQL.
O exemplo a seguir constrói uma instrução SQL que seleciona registros de um aplicativo de banco de dados MFC. Quando a estrutura chama a 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 a instrução SQL SELECT , a estrutura chama a 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);
}
Quando concluída, a instrução SQL terá esta aparência:
SELECT CourseID, InstructorID, RoomNo, Schedule, SectionNo
FROM SECTION
Caso 3 lpszSQL = uma instrução SELECT/FROM
Você especifica a lista de colunas manualmente em vez de depender da RFX para construí-la automaticamente. Você pode querer fazer isso quando:
Você deseja especificar a palavra-chave DISTINCT após SELECT.
Sua lista de colunas deve corresponder aos nomes e tipos de coluna na mesma ordem em que estão listados em
DoFieldExchange.Você tem motivos para recuperar manualmente os valores das colunas usando a função ODBC
::SQLGetDataem vez de depender de RFX para vincular e recuperar colunas para você.Você pode, por exemplo, querer acomodar novas colunas que um cliente do seu aplicativo adicionou às tabelas do banco de dados depois que o aplicativo foi distribuído. Você precisa adicionar esses membros de dados de campo extras, que não eram conhecidos no momento em que você declarou a classe com um assistente.
A lista de colunas deve corresponder aos nomes e tipos de colunas na mesma ordem em que estão listados no
DoFieldExchange, seguidos pelos nomes das colunas acopladas manualmente. Para obter mais informações, consulte Recordset: Dynamically Binding Data Columns (ODBC).Você deseja unir tabelas especificando várias tabelas na cláusula FROM .
Para obter informações e um exemplo, consulte Recordset: Performing a Join (ODBC).
Caso 4 lpszSQL = SELECT/FROM Plus WHERE e/ou ORDER BY
Você especifica tudo: a lista de colunas (com base nas DoFieldExchangechamadas RFX), a lista de tabelas e o conteúdo de uma cláusula WHERE e/ou ORDER BY. Se especificar as suas cláusulas WHERE e/ou ORDER BY desta forma, não utilize m_strFilter e/ou m_strSort.
Caso 5 lpszSQL = uma chamada de procedimento armazenado
Se você precisar chamar uma consulta predefinida (como um procedimento armazenado em um banco de dados do Microsoft SQL Server), deverá escrever uma instrução CALL na cadeia de caracteres passada para lpszSQL. Os assistentes não oferecem suporte à declaração de 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ê poderá usar a CDatabase função ExecuteSQL de membro diretamente. Para uma consulta predefinida que retorna registos, deve também gravar manualmente as chamadas RFX em DoFieldExchange para quaisquer colunas que o procedimento retorne. As chamadas RFX devem estar na mesma ordem e retornar os mesmos tipos, como a consulta predefinida. Para obter mais informações, consulte Recordset: Declaring a Class for a Predefined Query (ODBC).
Ver também
SQL: Tipos de dados SQL e C++ (ODBC)
SQL: Fazendo chamadas SQL diretas (ODBC)