Avalados por :

Conectando ao Sybase ASE 15.7 no Windows 7: Solução para erro de sintaxe ODBC

  • Creado 01/03/2024
  • Modificado 01/03/2024
  • 1 Vistas
0
Cargando...

Prezados amigos,

Estou aprimorando um aplicativo em C++ no Windows 7 para conectar a um banco de dados Sybase ASE 15.7 (64 bits) usando o driver ODBC.

Para recuperar um número limitado de linhas, pretendo usar a sintaxe "top n".

Para usar declarações preparadas, estou utilizando um marcador de parâmetro "?" para "top ?", onde "?" indicará o número de linhas a serem selecionadas.

As chamadas para SQLPrepare e SQLBindParameter são bem-sucedidas. No entanto, o SQLExecute falha com o seguinte erro:

[Sybase][ODBC Driver][Adaptive Server Enterprise]Erro de sintaxe próximo a '@dr_ta0'., sqlstate:42000

A consulta que está sendo preparada e executada é a seguinte:

" select top ? charpk,ccno,anumber,updateddate from myccinfo.dbo.charpktable NOLOCK order by charpk asc ; "

SQLBindParameter é chamado da seguinte maneira:

unsigned int m_rowsToGet = 100;

SQL_RETURN ret = SQLBindParameter(stmt, 1, SQL_PARAM_INPUT, SQL_C_ULONG,

SQL_INTEGER, 0, 0, &m_rowsToGet, 0, );

O driver ODBC do Sybase ASE suporta o marcador de parâmetro para o comando "top n"?

O que poderia estar errado aqui? Esta mesma consulta funciona bem com o driver ODBC do MS-SQL.

Desculpem se este não é o fórum correto para esta pergunta. Poderiam me ajudar a migrar minha pergunta para o fórum correto?

Muito obrigado desde já pela sua ajuda e tempo.

Atenciosamente.

Pedro Pascal
Se unió el 07/03/2018
Pinterest
Telegram
Linkedin
Whatsapp

3 Respuestas

0
Cargando...

Olá,

Na verdade, este é um problema de 2 partes, mas você está condenado de qualquer maneira ?

O ? é permitido dentro de uma cláusula superior do ponto de vista da sintaxe se de fato fosse conter um número, mas internamente dentro do controlador isso tentará criar um procedimento leve que é enviado ao ASE. (create proc as select top ? col from)

Isso falha no extremo do ASE e é reenviado como uma declaração de linguagem com variável, mas isso então gera o erro de sintaxe, pois a variável não pode ser usada no contexto de uma cláusula superior.

Está sendo enviado 'select top @dr_ta0 charpk' etc, o que falha imediatamente com um erro de sintaxe na fase de análise.

Eu diria que, dado que nada é legal do lado do ASE em relação a esta consulta, então o controlador realmente deveria gerar uma mensagem de erro para evitar que isso aconteça.

Para que isso funcione como você precisa, são necessárias melhorias no lado do ASE para permitir que uma variável seja usada como n em uma cláusula 'top n'.

Cumprimentos,

Simon

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Olá,

Obrigado pelo seu tempo e orientação.

Alterei o design da nossa aplicação para definir o limite de linhas recuperadas estaticamente em vez de passar como parâmetro dinâmico. Agora estou usando o limite inferior na chave primária da tabela com a cláusula where.

Cumprimentos

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Oi,

O que você poderia fazer para contornar isso é adicionar mais uma camada de SQL dinâmico na mistura, então ajuste sua consulta para ser:-

"execute ('select top ' + ? + 'charpk,ccno,anumber,updateddate from myccinfo.dbo.charpktable NOLOCK order by charpk asc');"

...e depois use SQLBindParameter com SQL_VARCHAR para o ?.

Dessa forma, ele construirá uma declaração SQL dinâmica como uma string com a cláusula top.

Isso fará com que chegue ao ASE como uma declaração de linguagem parametrizada dinâmica que deve resolver o problema.

Saúde, Simon

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019

contacto@primeinstitute.com

(+51) 1641 9379
(+57) 1489 6964

© 2024 Copyright. Todos los derechos reservados.

Desarrollado por Prime Institute

¡Hola! Soy Diana, asesora académica de Prime Institute, indícame en que curso estas interesado, saludos!
Hola ¿Puedo ayudarte?