Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Blade Knight

Retornar valor de consulta(query) em string

Recommended Posts

Bom dia a todos.

Eu havia pedido ajuda numa comunidade do orkut, onde escrevi isso:

Antes de mas nada, quero dizer que sou iniciante em c++ e pedir que relevem caso meu problema seja "bobo".

 

Tenho uma classe de conexão com o banco de dados MSSQL.. e nessa classe, gostaria de acrescentar uma função que retorne o valor de uma consulta(query), em string.

 

Nesta classe, existe uma função que retorna apenas valores de colunas int...

A função é esta:

int SQL::ReturnInt()
{
   long Size, Result = 0;

   while(true)
{
    if(SQL_SUCCEEDED(SQLFetch(this->bSQLStmt)) == 0)
	{
	    break;
	}

	if(SQL_SUCCEEDED(SQLGetData(this->bSQLStmt,1,SQL_C_LONG,&Result,sizeof(long),&Size)) == 0)
	{
           break;
	}

	return Result;
}

return 0;
}

 

"Tentando" seguir esta função, fiz esta para testes, tentando retornar o valor em string:

char SQL::ReturnValue()
{
char Result;
long Size;

   while(true)
{
    if(SQL_SUCCEEDED(SQLFetch(this->bSQLStmt)) == 0)
	{
	    break;
	}

	if(SQL_SUCCEEDED(SQLGetData(this->bSQLStmt,1,SQL_C_CHAR,&Result,sizeof(char),&Size)) == 0)
	{
           break;
	}

	return Result;
}

return 0;
}

Fiz outras também, só que ambas não funcionaram!

O resultado sempre é o mesmo: (null)

 

~

 

Se por acaso, não conseguiram entender minha dificuldade, vou tentar dar um outro exemplo:

 

Supondo que o valor da "Coluna" é "Laranja"... eu executaria o script:

bSQL->Execute("SELECT Coluna FROM Tabela WHERE Nome = 'Maria'");

 

Daria à result, o resultado da consulta:

char result = bSQL->ReturnValue();

 

Exibiria o resultado:

printf("O valor é: %s",result);

 

E após a compilação:

O valor é: Laranja

 

Então, alguns membros me ajudaram, falando que devia fazer deste modo:

string SQL::ReturnValue()
{
SQLCHAR Result[500];
SQLINTEGER Size;

   while(true)
{
    if(SQL_SUCCEEDED(SQLFetch(this->bSQLStmt)) == 0)
	{
	    break;
	}

	if(SQL_SUCCEEDED(SQLGetData(this->bSQLStmt,1,SQL_C_CHAR,Result,sizeof(Result),&Size)) == 0)
	{
           break;
	}

	return string(reinterpret_cast< const char* >(Result)); 
}
return "";
}

 

E na hora de exibir a função, seria deste modo:

bSQL->Execute("SELECT Coluna FROM Tabela WHERE Nome = 'Maria'");
string Result = bSQL->ReturnValue();
bLog->WriteLog("O valor é: %s",Result.c_str());

Porém, na hora de exibir o resultado, o processo é encerrado sem erro, sem nada.

 

Alguma alma caridosa, poderia me ajudar?

 

SQL.cpp:

#include <SQL.h>
#include <SQLExt.h>
#include "SQL.h"

SQL * bSQL = new SQL();

SQL::SQL()
{
}

SQL::~SQL()
{
   this->StartDisconnection();
}

void SQL::LoadSettings()
{
this->Driver = "{SQL Server}";
GetPrivateProfileStringA(CONF_ALL,"Hostname","(local)",this->Hostname,20,PATH_SQL);
GetPrivateProfileStringA(CONF_ALL,"Username","sa",this->Username,20,PATH_SQL);
GetPrivateProfileStringA(CONF_ALL,"Password","123456",this->Password,50,PATH_SQL);
GetPrivateProfileStringA(CONF_ALL,"Database","MuOnline",this->Database,20,PATH_SQL);

if(!this->StartConnection())
{
	MessageBox(NULL,"Não foi possível estabelecer conexão com o SQL Server.",PLUG_NVS,MB_OK);
	::ExitProcess(0);
}
}

bool SQL::StartConnection()
{
   if(this->bSQLConnected == 1)
{
       return false;
}

   if(SQL_SUCCEEDED(SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&this->bSQLEnvironment)) == 0)
   {
    return false;
   }

   if(SQL_SUCCEEDED(SQLSetEnvAttr(this->bSQLEnvironment,SQL_ATTR_ODBC_VERSION,(void*)SQL_OV_ODBC3,0)) == 0)
   {
       this->FreeHandle();
       return false;
   }

   if(SQL_SUCCEEDED(SQLAllocHandle(SQL_HANDLE_DBC,this->bSQLEnvironment,&this->bSQLConnection)) == 0)
   {
       this->FreeHandle();
       return false;
   }

   SQLSetConnectOption(this->bSQLConnection,SQL_LOGIN_TIMEOUT,5);
   SQLSetConnectOption(this->bSQLConnection,SQL_CURSOR_TYPE,SQL_CURSOR_STATIC);

SQLCHAR ConStrIn[1024],ConStrOut[1024];
   SQLSMALLINT ConOutSize = 0;

sprintf((char*)ConStrIn,"DRIVER=%s; SERVER=%s; UID=%s; PWD=%s; DATABASE=%s;",this->Driver,this->Hostname,this->Username,this->Password,this->Database);
   SQLRETURN Connect = SQLDriverConnect(this->bSQLConnection,NULL,ConStrIn,SQL_NTS,ConStrOut,sizeof(ConStrOut),&ConOutSize,SQL_DRIVER_NOPROMPT);

   if(SQL_SUCCEEDED(Connect) == 0) 
   {
	this->FreeHandle();
       return false;
   }

   this->bSQLConnected = 1;
   return true;
}

void SQL::StartDisconnection()
{
   if(this->bSQLConnected == 1)
   {
       SQLDisconnect(this->bSQLConnection);
	this->FreeHandle();
   }

   this->bSQLConnection = NULL;
   this->bSQLEnvironment = NULL;
   this->bSQLConnected = 0;
}

void SQL::FreeHandle()
{
   if(this->bSQLConnection != NULL)
{
    SQLFreeHandle(SQL_HANDLE_DBC,this->bSQLConnection);
}

if(this->bSQLEnvironment != NULL)
{
    SQLFreeHandle(SQL_HANDLE_ENV,this->bSQLEnvironment);
}
}

bool SQL::Execute(char *Query,...)
{
if(this->bSQLConnected == 0)
{
       return false;
}

   if(SQL_SUCCEEDED(SQLAllocHandle(SQL_HANDLE_STMT,this->bSQLConnection,&this->bSQLStmt)) == 0)
   {
    return false;
}

char Temp[1024];
va_list pArguments;
va_start(pArguments,Query);
vsprintf(Temp,Query,pArguments);
va_end(pArguments);

   if(SQL_SUCCEEDED(SQLPrepare(this->bSQLStmt,(unsigned char*)Temp,strlen(Temp))) == 0)
   {
    return false;
}

SQLRETURN Execute = SQLExecute(this->bSQLStmt);
   if(Execute == SQL_SUCCESS || Execute == SQL_SUCCESS_WITH_INFO || Execute == SQL_NO_DATA)
   {
    if(SQLRowCount(this->bSQLStmt,&this->bSQLRowCount) != SQL_SUCCESS)
	{
	    this->bSQLRowCount = 0;
	}

	if(SQLNumResultCols(this->bSQLStmt,(SQLSMALLINT*)&this->bSQLColCount) != SQL_SUCCESS)
	{
	    this->bSQLColCount = 0;
	}

	return true;
}

return false;
}

char *SQL::ReturnLastError()
{
char Error[1024];
   SQLCHAR State[20];
SQLINTEGER NativeError;
SQLSMALLINT OutErrorSize;

SQLError(this->bSQLEnvironment,this->bSQLConnection,this->bSQLStmt,State,&NativeError,(SQLCHAR*)Error,sizeof(Error),&OutErrorSize);

   return &Error[0];
}

int SQL::ReturnRow()
{
   return this->bSQLColCount;
}

int SQL::ReturnInt()
{
   long Size, Result = 0;

   while(true)
{
    if(SQL_SUCCEEDED(SQLFetch(this->bSQLStmt)) == 0)
	{
	    break;
	}

	if(SQL_SUCCEEDED(SQLGetData(this->bSQLStmt,1,SQL_C_LONG,&Result,sizeof(long),&Size)) == 0)
	{
           break;
	}

	return Result;
}

return 0;
}

string SQL::ReturnValue()
{
SQLCHAR Result[500];
SQLINTEGER Size;

   while(true)
{
    if(SQL_SUCCEEDED(SQLFetch(this->bSQLStmt)) == 0)
	{
	    break;
	}

	if(SQL_SUCCEEDED(SQLGetData(this->bSQLStmt,1,SQL_C_CHAR,Result,sizeof(Result),&Size)) == 0)
	{
           break;
	}

	return string(reinterpret_cast< const char* >(Result)); 
}
return "";
}

bool SQL::ReturnFetchRow(char *Out,int Len)
{
long Size;

   while(true)
{
    if(SQL_SUCCEEDED(SQLFetch(this->bSQLStmt)) == 0)
	{
	    break;
	}

	for(int x = 0; x < this->bSQLColCount; x++)
	{
	    if(SQL_SUCCEEDED(SQLGetData(this->bSQLStmt,(x + 1),SQL_C_CHAR,&Out[x],Len,&Size)) == 0)
		{
               break;
		}
	}

	return 1;
}

return 0;
}

 

SQL.h

#pragma once

class SQL
{
public:
   SQL();
virtual ~SQL();

void LoadSettings();
bool StartConnection();
void StartDisconnection();
bool Execute(char *Query,...);
char *ReturnLastError();
void FreeHandle();
int ReturnRow();
int ReturnInt();
string ReturnValue();
bool ReturnFetchRow(char *Out,int Len);
private:
bool bSQLConnected;
HENV bSQLEnvironment;
HDBC bSQLConnection;
HSTMT bSQLStmt;
long bSQLRowCount;
long bSQLColCount;

char *Driver;
char Hostname[20];
char Username[20];
char Password[50];
char Database[20];
};
extern SQL * bSQL;

 

Obs: no SQL.cpp também é incluido outro arquivo .h que chama algumas bibliotecas.. não postei que não achei necessário.

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não li o código.

Bom,debugar o código nunca matou nimguem.

Você poderia por exemplo fazer algo simples como compilar o programa com simbolos de debugação e rodar o gdb ou outro debuger nele.Dai dava um break na linha final e no próprio gdb de um print em valores criticos (como a string e etc).Se o problema for identificado ali,dê breaks em outras localidades e dê step imprimindo valores e lendo o código até achar o problema.

O problema também pode estar: na sua conexão que não foi bem sucedida,na sua query que não foi bem sucedida,etc...

E se essa hora de exibir estiver antes da finalização do programa,será que esse encerramento não está só supostamente não imprimindo algo?

Afinal,o programa está escrevendo para o log apontado por bLog,e você talvez não saiba disso.

Veja isso que foi citado e diga o resultado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.