Использую ATL OLEDB для доступа к MSSQL из MSVS:
Работает везде, не надо таскать лишнего ничего.
CString sQ;
CCommand<CDynamicAccessor> Cmnd;
HRESULT hr = S_OK;
sQ.Format("SELECT ID_Point FROM Points WHERE ID_Parent=(SELECT ID_Parent FROM Points WHERE ID_Point=%d) AND Point_Type=%d", Trg_ID, Trg_TY);
hr = Cmnd.Open(m_Sssn, sQ); if(hr == S_OK) hr = Cmnd.MoveFirst();
if(hr == S_OK) Trg_ID = *(long*)Cmnd.GetValue("ID_Point"); Cmnd.Close(); Cmnd.ClearRecordMemory();
И всё!!!
А можно так:
sQ.Format("INSERT INTO Points (ID_Parent, Point_Type, PointName) "
"VALUES (SELECT ID_Parent FROM Points WHERE ID_Point=%d, %d, 'Параметры')", Trg_ID, Trg_TY);
hr = Cmnd.Open(m_Sssn, sQ); Cmnd.Close(); Cmnd.ClearRecordMemory();
Только надо соединиться перед этим:
CDataSource m_Conn;
CSession m_Sssn;
CDBPropSet dbinit(DBPROPSET_DBINIT);
dbinit.AddProperty(DBPROP_INIT_DATASOURCE, Srv);
dbinit.AddProperty(DBPROP_INIT_CATALOG, Dbn);
dbinit.AddProperty(DBPROP_AUTH_USERID, Uid);
dbinit.AddProperty(DBPROP_AUTH_PASSWORD, Pwd);
dbinit.AddProperty(DBPROP_INIT_LCID, (long)1033);
dbinit.AddProperty(DBPROP_INIT_PROMPT, (short)DBPROMPT_NOPROMPT);
dbinit.AddProperty(DBPROP_IRowsetChange, true);
dbinit.AddProperty(DBPROP_IRowsetUpdate, true);
dbinit.AddProperty(DBPROP_UPDATABILITY,
DBPROPVAL_UP_CHANGE |
DBPROPVAL_UP_INSERT |
DBPROPVAL_UP_DELETE);
hr = m_Conn.Open(_T("SQLOLEDB"), &dbinit);
if(!FAILED(hr))
hr = m_Sssn.Open(m_Conn);
......................... // Что-то делаешь
......................... // Что-то делаешь
......................... // Что-то делаешь
if(m_Sssn.m_spOpenRowset != NULL) m_Sssn.Close();
if(m_Conn.m_spInit != NULL) m_Conn.Close();
Делаешь свой класс, в котором держишь M_Con и иже с ним, и обращаешься к нему по мере надобности из любого места программы.
Работает с любыми типами запросовинсертящими, upдатящими ит.д.