Avalados por :

Como descobrir o valor do Text Size nas configurações do DSN usando ODBC

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

Olá amigos,

Estou utilizando o controlador ODBC (o framework sobre a API ODBC) para conectar e ler dados do servidor de banco de dados ASE no Windows.

Tenho algumas perguntas sobre o controlador ODBC do ASE. Poderiam me orientar, por favor?

1) O ASE tem uma opção de banco de dados chamada "textsize" que estabelece o limite na quantidade de dados que podemos recuperar em uma declaração SELECT.

Esta opção pode ser configurada tanto na configuração do DSN (Avançado->Campo de texto Textsize) quanto através de "set textsize " para uma sessão.

--- Ao escanear BLOBs (tipos de dados de imagem), quero aumentar esse limite para 512 MB em minha aplicação. No entanto, não quero anular o limite se o usuário tiver o campo Text Size na configuração do DSN.

* Como podemos descobrir (programaticamente) o valor de Text Size configurado na configuração do DSN?

--- É possível fazer isso usando alguma função ODBC?

2) Qual é o limite máximo nos dados retornados pela chamada da função SQLGetData de uma vez?

--- Podemos determinar o tamanho dos dados armazenados em uma coluna, especialmente em colunas BLOB (ou imagem), usando a API ODBC?

Ou precisamos executar a consulta "select datalength(NomeColuna) from nometabela"?

3) Qual é o Administrador de Drivers ODBC mais estável e confiável para os sistemas operacionais Unix e Linux? É o unixODBC?

Muito obrigado antecipadamente por suas explicações e tempo.

Saudações cordiais

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

4 Respuestas

0
Cargando...

Obrigado Paul.

Isso não está relacionado com SQLGetData. Na verdade, o SQLGetData funciona bem para mim.

Estou tendo esse problema ao executar uma consulta e acessar os buffers vinculados da seguinte maneira (código pseudo):

// Definir o atributo da declaração para ler por coluna, número de linhas, cursor estático e ponteiro de status:

/*struct StmtAttrs

{

SQLINTEGER attr;

SQLPOINTER valptr;

SQLINTEGER len;

};*/

SQLHSTMT& stmt = m_stmtHdl.m_hdl;

StmtAttrs parms[5] = \

{{SQL_ATTR_ROW_BIND_TYPE, SQL_BIND_BY_COLUMN, 0},

{SQL_ATTR_CURSOR_TYPE, (SQLPOINTER)SQL_CURSOR_STATIC, 0},

{SQL_ATTR_ROW_ARRAY_SIZE, (SQLPOINTER)limit, 0},

{SQL_ATTR_ROW_STATUS_PTR, &m_rowStatus[0], 0},

{SQL_ATTR_ROWS_FETCHED_PTR, &m_rowsFetched, 0}};

uint32_t i = 0;

SQLINTEGER errcode;

for (; i < 5; ++i)

{

bool ret = sqlSetStmtAttr(stmt, parms[i].attr, parms[i].valptr, parms[i].len);

// Código de tratamento de erros

}

// Vincular os buffers de entrada para o número de colunas usando SQLBindCol:

// Preparar a consulta usando SQLPrepare

// Por exemplo: select top 2039 numpk,convert(binary(256),ablob) from myccinfo.dbo.bigdata NOLOCK order by numpk asc ;

// Executar a consulta com SQLExecute(stmt);

// Obter os dados usando SQLFetchScroll(stmt, SQL_FETCH_NEXT, 0);

// Iterar através de cada coluna e do buffer vinculado para ler os dados

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

Olá Ganesh!

Como está lidando com chamadas ODBC?

Está utilizando SQLGetData()? Temos uma solução que será lançada na versão 15.7 SP100 (deve ser esta semana ou na próxima) CR 727861: Driver ODBC da Sybase: a API SQLGetData() não recupera todos os dados da coluna se o comprimento do buffer for passado como 0.

Não sei se isso se aplica ao seu problema, mas forneça os detalhes da API e posso dar uma olhada. O problema que mencionei tinha a questão de passar o comprimento como 0, mas o indicador deveria retornar os bytes lidos e então a chamada era repetida até que o buffer que continha os dados fosse esvaziado.

O tipo de dados usado no SQLGetData era SQL_C_BINARY e estávamos vendo erros como "[Sybase][Driver ODBC]Dados de cadeia truncados à direita (32007)".

Saudações!

-Paul

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

Tenho outra pergunta específica sobre o controlador ODBC da Sybase.

Estou usando " select convert(binary(512), <columname>) from tablename " consulta para obter os primeiros 512 bytes de colunas BLOB (imagem, binárias).

Segundo http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.help.ase_15.0.blocks/html/blocks/block... , " O comprimento máximo permitido para expressões de caracteres e binárias é de 64K . ".

No entanto, só consigo usar isso para comprimentos de até 128 bytes. Se eu tentar usar 256 ou 512, o controlador ODBC retorna um valor de indicador NULL.

São 128 bytes o valor padrão para leitura usando convert()? Como podemos ler 512 bytes? Obrigado

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

Olá Ganesh,

Para unixODBC, de acordo com a documentação do SDK 15.7 (Guia do usuário do driver ODBC do Adaptive Server Enterprise da Sybase)

http://infocenter.sybase.com/help/topic/com.sybase.infocenter.dc20116.1570/html/aseodbc/aseodbc5.htm

Para Linux, normalmente é possível usar o unixODBC distribuído com Red Hat e SuSE. Eu utilizei as versões 2.2.11, 2.2.14 e também 2.3.1 e todas parecem funcionar corretamente. (Eu instalo múltiplas versões de unixODBC de acordo com o que os clientes estão utilizando para casos específicos).

Para UNIX, você pode usar o Administrador de drivers ODBC da Sybase iAnywhere incluído na instalação do driver ou a versão recomendada do unixODBC é a 2.2.14 se desejar instalar a sua própria.

Definitivamente verifique a nota sobre o SQLLEN de 4 bytes vs. 8 bytes. A partir do ESD#4 da versão 15.7, incluímos tanto o driver ODBC SQLLEN de 4 bytes quanto o de 8 bytes, dependendo de suas necessidades individuais.

No Red Hat 6 e versões posteriores, o Administrador de drivers unixODBC utiliza o SQLLEN de 8 bytes. Isso seria com a versão 2.2.14 e superiores.

Espero que isso seja útil,

Saudações,

-Paul

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?