F
Erstmal Danke für Deine Antwort!
Ich programmiere leider erst seit 3 Wochen C++ und bin im Umgang mit dynamischer Speicherreservierung noch nicht so vertraut.
Gut möglich, dass da das ein oder andere Speicherleck noch drin ist. Ich bin für jede Hilfe dankbar
Das ist also der komplette Code (ungeschönt).
Aufgabe dieser Methode:
Ich möchte eine zentrale Schnittstelle schreiben, von der ich eine Verbindung zum SQL-Server aufbaue, um dann von überall im Programm nur noch die notwendigsten Daten übergeben zu müssen.
Es werden über eine Struktur, durch eine dynamischen Liste, die Anzahl der Parameter, Input- oder Output-Typ, Datentyp und Wert übergeben.
Nach dem Execute-Befehl werden die Output-Werte wieder zurück in die dynamische Liste geschrieben.
Die Datensätze werden in einem RecordSet gespeichert, das ebenfalls im Methodenaufruf übereben wird.
bool SQLMngr::execStoredProcedure(SqlProzedur &meineSqlProzedur)
{
USES_CONVERSION;
VARIANT vVariable;
//Variablen-Deklaration
CWaitCursor wait;
bool bSuccess = true;
bool bVersion = false;
try
{
//besteht keine Verbindung zur DB
if(m_Conn == 0)
{
//Verbindung aufbauen
m_Conn = ADODB::_ConnectionPtr(__uuidof(ADODB::Connection));
m_Conn->ConnectionTimeout = 6; //Zeitangabe in Sekunden
m_Conn->Open(getConnstr(),"","",ADODB::adConnectUnspecified);
}
//Recordset öffnen
m_Cmd.CreateInstance(__uuidof(ADODB::Command));
meineSqlProzedur.myRecordSet.CreateInstance(__uuidof(ADODB::Recordset));
m_Cmd->ActiveConnection = m_Conn;
//Stored Procedure festlegen
m_Cmd->CommandType = ADODB::adCmdStoredProc;
m_Cmd->CommandText = _bstr_t(meineSqlProzedur.prozedurname);
//zusammenbauen der Parameter für die StoredProc
for(int i = 0; i < meineSqlProzedur.paramSqlAnzahl; i++)
{
//Richtung festlegen
ADODB::ParameterDirectionEnum paramRichtung;
paramRichtung = (meineSqlProzedur.myParams[i].parameterRichtung == false) ? ADODB::adParamOutput : ADODB::adParamInput;
//Datentyp festlegen
ADODB::DataTypeEnum paramDatentyp;
if(meineSqlProzedur.myParams[i].parameterDatentyp == false)
{
//Ganzzahl
paramDatentyp = ADODB::adInteger;
vVariable.vt = VT_INT;
}
else
{
//Zeichenkette
paramDatentyp = ADODB::adVarChar;
vVariable.vt = VT_BSTR;
}
vVariable.bstrVal = _bstr_t(meineSqlProzedur.myParams[i].parameterWert);
m_Cmd->Parameters->Append(m_Cmd->CreateParameter(_bstr_t(meineSqlProzedur.myParams[i].parameterName),
paramDatentyp,
paramRichtung,
8000, //max. Wert für einen varchar
vVariable));
}
meineSqlProzedur.myRecordSet = m_Cmd->Execute(NULL,NULL,ADODB::adCmdStoredProc);
//Zusammenbauen der Output-Parameter zur Rückgabe an die dyn. Liste 'meineSqlProzedur'
for(int i = 0; i < meineSqlProzedur.paramSqlAnzahl; i++)
{
vVariable.vt = VT_BSTR;
vVariable = m_Cmd->Parameters->GetItem(meineSqlProzedur.myParams[i].parameterName)->Value;
meineSqlProzedur.myParams[i].parameterWert = const_cast<char*>((LPCTSTR) W2A((_bstr_t)vVariable));
}
//Zusammenbauen der Output-Parameter zur Rückgabe an die dyn. Liste 'meineSqlProzedur' <--
}
catch (_com_error& ce)
{
handle_com_error("Fehler bei Verbindung SqlServer",
m_pApp->m_pProf->getSqlDSNName(),ce);
}
return bSuccess;
}
cu
Chris