¡Caminando hacia el éxito!

Aprende en Comunidad

Avalados por :

Conectando a Sybase ASE 15.7 en Windows 7: Solución al error de sintaxis ODBC

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

Estimados amigos,

Estoy mejorando una aplicación en C++ en Windows 7 para conectar a una base de datos Sybase ASE 15.7 (64 bits) utilizando el controlador ODBC.

Para recuperar un número limitado de filas, quiero usar la sintaxis "top n".

Para utilizar declaraciones preparadas, estoy usando un marcador de parámetro "?" para "top ?", donde "?" indicará el número de filas a seleccionar.

Las llamadas a SQLPrepare y SQLBindParameter tienen éxito. Sin embargo, SQLExecute falla con el siguiente error:

[Sybase][ODBC Driver][Adaptive Server Enterprise]Incorrect syntax near '@dr_ta0'., sqlstate:42000

La consulta que se está preparando y ejecutando es la siguiente:

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

SQLBindParameter se llama de la siguiente manera:

unsigned int m_rowsToGet = 100;

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

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

¿El controlador ODBC de Sybase ASE admite el marcador de parámetro para el comando "top n"?

¿Qué podría estar mal aquí? Esta misma consulta funciona bien con el controlador ODBC de MS-SQL.

Disculpen si este no es el foro correcto para esta pregunta. ¿Podrían ayudarme a migrar mi pregunta al foro correcto?

Muchas gracias de antemano por su ayuda y tiempo.

Saludos cordiales.

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

3 Respuestas

0
Cargando...

Hola,

En realidad, este es un problema de 2 partes, pero estás condenado de cualquier manera 😞

El ? se permite dentro de una cláusula superior desde un punto de vista de sintaxis si de hecho fuera a contener un número, pero internamente dentro del controlador esto intentará crear un procedimiento ligero que se envía al ASE. (create proc as select top ? col from)

Esto falla en el extremo de ASE, y se reenvía como una declaración de lenguaje con variable, pero esto luego genera el error de sintaxis ya que la variable no se puede usar en el contexto de una cláusula superior.

Se está enviando 'select top @dr_ta0 charpk' etc lo cual falla inmediatamente con un error de sintaxis en la fase de análisis.

Diría que dado que nada es legal desde el lado de ASE con respecto a esta consulta, entonces el controlador realmente debería generar un mensaje de error para evitar que lo hagas.

Para que esto funcione como lo requieres, necesita mejoras en el lado de ASE para permitir que una variable se use como n en una cláusula 'top n'.

Saludos,

Simon

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

Hola,

Gracias por tu tiempo y esta orientación.

He cambiado el diseño de nuestra aplicación para establecer el límite de filas recuperadas estáticamente en lugar de pasar como parámetro dinámico. Ahora estoy utilizando el límite inferior en la clave primaria de la tabla con la cláusula where.

Saludos cordiales

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

Hi,

What you could do to workaround it is add another layer of dynamic sql into the mix, so adjust your query to be:-

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

...and then use SQLBindParameter with SQL_VARCHAR for the ?.

This way it will build a dynamic sql statement as a string with the top clause.

This will then make it to the ASE as a dynamic parameterized language statement which should do the trick.

Cheers, 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?