


serban_b scrie:trebuie neaparat sa lucrez cu o baza de date insa eu am cunostinte doar de c++, sql si php medii
serban_b scrie:nu imi dau seama nici ce sa folosesc mi-am instalat vc++ 2008
serban_b scrie:mi-am luat si o carte "programarea bazelor de date cv++ 6" de la teora dar tot nu imi dau seama care e cel mai potrivit pentru aplicatia mea, sper sa ma puteti ajuta
// SQLSupport.h : SQL connectivity and query classes
#pragma once
#include <vector>
namespace SQL {
/*
// SQL 2000, 7 Driver={SQL Server};Server=myServerAddress;Database=myDataBase;Uid=myUsername;Pwd=myPassword;
Driver={SQL Server};Server=myServerAddress;Database=myDataBase;Trusted_Connection=Yes;
// SQL 2005 TRUSTED Driver={SQL Native Client};Server=myServerAddress;Database=myDataBase; Uid=myUsername;Pwd=myPassword;
USER Driver={SQL Native Client};Server=myServerAddress;Database=myDataBase; Trusted_Connection=yes;
INSTANCE Driver={SQL Native Client};Server=myServerName\theInstanceName;Database=myDataBase; Trusted_Connection=yes;
// SQL 2008 Driver={SQL Server Native Client 10.0};Server=myServerAddress;Database=myDataBase;Uid=myUsername;Pwd=myPassword;
Driver={SQL Server Native Client 10.0};Server=myServerAddress;Database=myDataBase;Trusted_Connection=yes;
Driver={SQL Server Native Client 10.0};Server=myServerName\theInstanceName; Database=myDataBase;Trusted_Connection=yes;
*/
class SqlError
{
private:
SQLSMALLINT m_iRec;
CStringW m_strSqlState;
SQLINTEGER m_lNativeError;
CStringW m_strErrorMsg;
public:
SqlError()
: m_iRec(-1)
, m_lNativeError(0)
{}
SqlError(SQLSMALLINT iRec,
const CStringW& strSqlState,
SQLINTEGER lNativeError,
const CStringW& strErrorMsg)
: m_iRec(iRec)
, m_strSqlState(strSqlState)
, m_lNativeError(lNativeError)
, m_strErrorMsg(strErrorMsg)
{}
SqlError(const SqlError& src)
{
m_iRec = src.Record();
m_strSqlState = src.SqlState();
m_lNativeError = src.NativeError();
m_strErrorMsg = src.ErrorMessage();
}
~SqlError()
{}
public:
SQLSMALLINT Record() const
{
return m_iRec;
}
const CStringW& SqlState() const
{
return m_strSqlState;
}
SQLINTEGER NativeError() const
{
return m_lNativeError;
}
const CStringW& ErrorMessage() const
{
return m_strErrorMsg;
}
public:
SqlError& operator=(const SqlError& src)
{
m_iRec = src.Record();
m_strSqlState = src.SqlState();
m_lNativeError = src.NativeError();
m_strErrorMsg = src.ErrorMessage();
return *this;
}
public:
bool IsWarning() const
{
return m_strSqlState.Compare(L"01000") == 0;
}
};
template<class T, SQLSMALLINT _HTYPE, SQLHANDLE _HNULL>
class Handle
{
public:
Handle()
: _hSql(_HNULL)
, _hType(_HTYPE)
, _res(SQL_SUCCESS)
{}
virtual ~Handle()
{}
private:
Handle(const Handle&);
Handle& operator=(const Handle&);
public:
operator bool() const
{
return _hSql != Null();
}
bool operator!() const
{
return _hSql == Null();
}
operator SQLHANDLE()
{
if(this == NULL)
{
return Null();
}
return _hSql;
}
static SQLHANDLE Null()
{
return _HNULL;
}
public:
virtual bool Open(SQLHANDLE hParent = SQL_NULL_HANDLE)
{
if(!_PrepareOpen(hParent))
{
return false;
}
if(!_Open(hParent))
{
return false;
}
return _PostOpen();
}
virtual bool Close()
{
if(!_PrepareClose())
{
return false;
}
return _Close();
}
protected:
virtual bool _PrepareOpen(SQLHANDLE hParent)
{
return true;
UNREFERENCED_PARAMETER(hParent);
}
virtual bool _PostOpen()
{
return true;
}
virtual bool _Open(SQLHANDLE hParent)
{
_res = ::SQLAllocHandle(_HTYPE, hParent, &_hSql);
return SQL_SUCCEEDED(_res);
}
virtual bool _PrepareClose()
{
return true;
}
virtual bool _Close()
{
if(_hSql == Null())
{
return false;
}
_res = ::SQLFreeHandle(_HTYPE, _hSql);
_hSql = Null();
return true;
}
public:
SQLRETURN GetLastError() const
{
return _res;
}
const std::vector<SqlError>& GetErrors() const
{
return _Errors;
}
bool HaveErrors() const
{
if(_Errors.empty())
{
return false;
}
// scan for errors or warnings
std::vector<SqlError>::const_iterator ite;
for(ite = _Errors.begin();
ite != _Errors.end();
ite++)
{
if(!ite->IsWarning())
{
return true;
}
}
return false;
}
bool ReadErrors()
{
if(!_Errors.empty())
{
_Errors.clear();
}
// read errors
SQLINTEGER lNativeError = 0;
WCHAR szErrorMsg[SQL_MAX_MESSAGE_LENGTH + 1] = L"";
WCHAR szSqlState[6] = L"";
SQLSMALLINT cchMsg = 0;
memset(szErrorMsg, 0, _countof(szErrorMsg) * sizeof(WCHAR));
memset(szSqlState, 0, _countof(szSqlState) * sizeof(WCHAR));
SQLSMALLINT iRec = 1;
while(true)
{
_res = ::SQLGetDiagRecW(_hType
, _hSql
, iRec
, szSqlState
, &lNativeError
, szErrorMsg
, _countof(szErrorMsg) - 1
, &cchMsg);
if(SQL_SUCCEEDED(_res))
{
_Errors.push_back(
SqlError(iRec, szSqlState, lNativeError, szErrorMsg));
}
if(_res == SQL_NO_DATA)
{
break;
}
iRec++;
}
return true;
}
protected:
SQLRETURN _res;
SQLSMALLINT _hType;
SQLHANDLE _hSql;
std::vector<SqlError> _Errors;
};
class Environment
: public Handle<Environment, SQL_HANDLE_ENV, SQL_NULL_HENV>
{
public:
Environment();
~Environment();
private:
Environment(const Environment&);
Environment& operator=(const Environment&);
public:
bool SetAttr(SQLINTEGER Attribute, SQLINTEGER Value);
bool SetODBCVersion(SQLINTEGER version = SQL_OV_ODBC3);
protected:
virtual bool _PostOpen();
};
class Connection
: public Handle<Connection, SQL_HANDLE_DBC, SQL_NULL_HDBC>
{
public:
explicit Connection(bool fAutoDisconnect = true);
~Connection();
private:
Connection(const Connection&);
Connection& operator=(const Connection&);
public:
bool Open(Environment* pEnv);
bool Connect(const CStringW& strServer,
const CStringW& strDatabase,
const CStringW& strUser,
const CStringW& strPassword,
HWND hwnd = NULL);
bool Disconnect();
bool IsConnected() const;
private:
bool _fAutoDisconnect;
bool _fConnected;
};
class Statement
: public Handle<Statement, SQL_HANDLE_STMT, SQL_NULL_HSTMT>
{
public:
Statement();
~Statement();
private:
Statement(const Statement&);
Statement& operator=(const Statement&);
public:
bool Open(Connection* pConn);
public:
bool ExecDirect(LPCWSTR pcwszStatement, SQLINTEGER iLength = SQL_NTS);
bool Fetch();
bool Cancel();
bool BindColumn(SQLUSMALLINT usColNumber, long* plVar, SQLLEN* pcbLen);
};
}; // namespace SQL// SQLSupport.cpp : SQL connectivity and query classes implementation
#include "stdafx.h"
#include "SQLSupport.h"
namespace SQL {
Environment::Environment()
{}
Environment::~Environment()
{
Close();
}
bool Environment::SetAttr(SQLINTEGER Attribute, SQLINTEGER Value)
{
_res = ::SQLSetEnvAttr(_hSql, Attribute, (SQLPOINTER*)Value, 0);
return SQL_SUCCEEDED(_res);
}
bool Environment::SetODBCVersion(SQLINTEGER version)
{
return SetAttr(SQL_ATTR_ODBC_VERSION, version);
}
bool Environment::_PostOpen()
{
_res = SetODBCVersion();
return SQL_SUCCEEDED(_res);
}
// Connection
Connection::Connection(bool fAutoDisconnect)
: _fAutoDisconnect(fAutoDisconnect)
, _fConnected(false)
{}
Connection::~Connection()
{
if(_fAutoDisconnect)
{
Disconnect();
}
Close();
}
bool Connection::Open(Environment* pEnv)
{
return __super::Open(pEnv->operator SQLHANDLE());
}
bool Connection::Connect(const CStringW& strServer,
const CStringW& strDatabase,
const CStringW& strUser,
const CStringW& strPassword,
HWND hwnd)
{
if(_hSql == NULL)
{
return false;
}
// set options here...
WCHAR szConnIn[256] = L"";
wsprintfW(szConnIn
, L"Driver={SQL Server};"
L"Server={%s};"
L"Database={%s};"
L"Uid={%s};"
L"Pwd={%s};"
, strServer
, strDatabase
, strUser
, strPassword);
WCHAR szConnOut[256] = L"";
SQLSMALLINT cchConnStrOut = _countof(szConnOut) - 1;
_res = ::SQLDriverConnectW(
_hSql
, hwnd
, (SQLWCHAR *)szConnIn
, SQL_NTS
, (SQLWCHAR *)szConnOut
, cchConnStrOut
, &cchConnStrOut
, SQL_DRIVER_NOPROMPT);
if(SQL_SUCCEEDED(_res))
{
_fConnected = true;
}
else
{
if(ReadErrors())
{
if(HaveErrors())
{
return false;
}
}
}
return SQL_SUCCEEDED(_res);
}
bool Connection::Disconnect()
{
if(_hSql == SQL_NULL_HDBC || !_fConnected)
{
return false;
}
_res = ::SQLDisconnect(_hSql);
_fConnected = false;
return SQL_SUCCEEDED(_res);
}
bool Connection::IsConnected() const
{
return _fConnected;
}
// Statement
Statement::Statement()
{}
Statement::~Statement()
{
Close();
}
bool Statement::Open(Connection* pConn)
{
return __super::Open(pConn->operator SQLHANDLE());
}
bool Statement::ExecDirect(LPCWSTR pcwszStatement,
SQLINTEGER iLength)
{
if(_hSql == SQL_NULL_HSTMT)
{
ATLASSERT(FALSE);
return false;
}
if(pcwszStatement == NULL)
{
ATLASSERT(FALSE);
return false;
}
_res = ::SQLExecDirectW(_hSql, (SQLWCHAR *)pcwszStatement, iLength);
if(_res != SQL_SUCCESS)
{
if(ReadErrors())
{
if(HaveErrors())
{
return false;
}
}
}
return SQL_SUCCEEDED(_res);
}
bool Statement::Fetch()
{
if(_hSql == SQL_NULL_HSTMT)
{
ATLASSERT(FALSE);
return false;
}
_res = ::SQLFetch(_hSql);
if(_res == SQL_NO_DATA)
{
return false;
}
return SQL_SUCCEEDED(_res);
}
bool Statement::Cancel()
{
if(_hSql == SQL_NULL_HSTMT)
{
ATLASSERT(FALSE);
return false;
}
_res = ::SQLCancel(_hSql);
return SQL_SUCCEEDED(_res);
}
bool Statement::BindColumn(SQLUSMALLINT usColNumber,
long* plVar,
SQLLEN* pcbLen)
{
if(_hSql == SQL_NULL_HSTMT)
{
ATLASSERT(FALSE);
return false;
}
if(plVar == NULL)
{
ATLASSERT(FALSE);
return false;
}
if(pcbLen == NULL)
{
ATLASSERT(FALSE);
return false;
}
_res = ::SQLBindCol(_hSql, usColNumber,
SQL_C_LONG, (SQLPOINTER)plVar,
0, (SQLINTEGER *)pcbLen);
return SQL_SUCCEEDED(_res);
}
}; // namespace SQL

cristianamarie scrie:Oricum, nici C++ nu e de mare folos decit la ADO si in special OLEDB. Restul sint API-uri C (ODBC).

Silviu Ardelean scrie:Pentru ODBC mai exista si clasele wrapper din MFC, CDatabase, CRecordset, etc, iar acestea sunt C++ toata ziua.

cristianamarie scrie:Silviu Ardelean scrie:Pentru ODBC mai exista si clasele wrapper din MFC, CDatabase, CRecordset, etc, iar acestea sunt C++ toata ziua.
(Clarificare) Keyword: wrapper. In afara ca sint niste convenience wrappers, API-ul e C si se lucreaza cu handles. Spre deosebire de OLEDB sau ADO unde chiar e C++/COM si se lucreaza cu obiecte C++ (ma rog, interfete). Asta voiam sa zic. Oricum, nu era important.


serban_b scrie:m-am uitat pe articolul de pe codeproject, am vazut ca are totul foarte bine explicat, toate functile, pentru moment incerc sa fac ceva pe baza celor scrise acolo

serban_b scrie:[...] trec la php acolo mi se pare totul mult mai simplu in privinta asta

serban_b scrie:din pacate nu am inteles mai nimic din cele 2 fisiere postate de cristianamarie
alloc environment
alloc connection
connect
alloc statement
execute statement
...
disconnect
free connection
free environment
serban_b scrie:daca nu trec la php acolo mi se pare totul mult mai simplu in privinta asta

neagu_laurentiu scrie:De cand browser-ul e un container eficient de rulare ?
Niciodata nu am inteles de ce unii inlocuiesc aplicatiile desktop cu ceva unde se reinventeaza roata - si macar de-ar fi "roata" (inclusiv Oracle are obiceiul asta)...


neagu_laurentiu scrie:Pai hotaraste-te, ori faci aplicatii ori simulezi aplicatii ! De cand browser-ul e un container eficient de rulare ?
Niciodata nu am inteles de ce unii inlocuiesc aplicatiile desktop cu ceva unde se reinventeaza roata - si macar de-ar fi "roata" (inclusiv Oracle are obiceiul asta)...

Utilizatorii ce navighează pe acest forum: Niciun utilizator înregistrat şi 2 vizitatori