SAP/odbc-cpp-wrapper

Can't access stored result again after getting data from it

Closed this issue · 0 comments

Hi,
I have a class like this to store query results and access them from Unreal Engine's blueprint interface.

UCLASS(BlueprintType)
class FF_DB_SAPODBC_API USAP_ODBC_Result : public UObject
{
	GENERATED_BODY()

protected:

	odbc::ResultSetRef QueryResult;

public:

	virtual bool SetQueryResultPtr(odbc::ResultSetRef ResultReferance);

	UFUNCTION(BlueprintCallable)
	virtual bool GetColumnCount(int32& ColumnCount);

	UFUNCTION(BlueprintCallable)
	virtual bool GetMetaDataStruct(FString& Out_Code, FSAP_ODBC_MetaData& Out_MetaData, int32 ColumnIndex = 1);

	UFUNCTION(BlueprintCallable)
	virtual bool GetString(FString& Out_Code, TArray<FString>& Out_String, int32 ColumnIndex = 1);

	UFUNCTION(BlueprintCallable)
	virtual bool GetInt(FString& Out_Code, TArray<int32>& Out_String, int32 ColumnIndex = 1);

};

My GetInt and GetString functions are like this.

bool USAP_ODBC_Result::GetString(FString& Out_Code, TArray<FString>& Out_String, int32 ColumnIndex)
{
	if (this->QueryResult.isNull())
	{
		Out_Code = "Query result referance is null !";
		return false;
	}

	TArray<FString> TempArray;

	try
	{
		while (this->QueryResult->next())
		{
			odbc::String ValueString = this->QueryResult->getString(ColumnIndex);

			if (!ValueString.isNull())
			{
				TempArray.Add(UTF8_TO_TCHAR(ValueString->c_str()));
			}
		}	
	}

	catch (const std::exception& Exception)
	{
		Out_Code = Exception.what();
		return false;
	}

	Out_String = TempArray;

	return true;
}
bool USAP_ODBC_Result::GetInt(FString& Out_Code, TArray<int32>& Out_String, int32 ColumnIndex)
{
	if (this->QueryResult.isNull())
	{
		Out_Code = "Query result referance is null !";
		return false;
	}

	TArray<int32> TempArray;
	 
	try
	{
		while (this->QueryResult->next())
		{
			odbc::Int ValueInt = this->QueryResult->getInt(ColumnIndex);
			if (!ValueInt.isNull())
			{
				TempArray.Add(*ValueInt);
			}
		}
	}

	catch (const std::exception& Exception)
	{
		Out_Code = Exception.what();
		return false;
	}

	Out_String = TempArray;

	return true;
}

If I call one of them in application's life time, I can get necessary values but if I can one after another,
while (this->QueryResult->next()) doesn't run at all.

Should I execute my query every time when I want to access data ?