我在VC中想直接用SQL语句,不过不太懂SQL,
CString strSQL="Update db1 Set zt='开' where jh=“01”
db.ExecuteSQL(strSQL)用了,实现了SQL的UPDATE操作,
但我想实现select查询功能,select zt from db1 where ...,希望大家给个select的示范语句,我看一下,我不知道zt的返回值得到后如何输入到变量,zt的值用什么方法转换到vc中,我现在糊涂了。
CString strSQL="Update db1 Set zt='开' where jh=“01”
db.ExecuteSQL(strSQL)用了,实现了SQL的UPDATE操作,
但我想实现select查询功能,select zt from db1 where ...,希望大家给个select的示范语句,我看一下,我不知道zt的返回值得到后如何输入到变量,zt的值用什么方法转换到vc中,我现在糊涂了。
_variant_t fieldvalue;
strSQL.Format ( "select zt from db1 where ...");
m_pRecordSet.CreateInstance("ADODB.Recordset");
m_pRecordSet->Open(_variant_t(strSQL), _variant_t((IDispatch *)pConn, true),
adOpenKeyset, adLockReadOnly, adCmdText);
CString ztvalue;
while(!m_pRecordSet->EndOfFile){
fieldvalue=m_pRecordSet->Fields->Item["zt"]->Value;
::VariantChangeType(&fieldvalue,&fieldvalue,0,VT_BSTR);
ztvalue=fieldvalue.bstrVal;
...
m_pRecordSet->MoveNext() ;
}
}
网上有很多关于数据库开发的例子,你可以找找,推荐一个网站:www.vckbase.com
一个是用CRecordset的,另一个是用OLEDB的。都是超级简单的方法。
{
CString strSQL;
strSQL.Format("SELECT ip,port,password,recid FROM %s",SERVER_LIST_TABEL_NAME); LPCTSTR sFilter;
CDatabase db;
TRY
{
db.OpenEx(m_OwnInfo.m_strConnectString,CDatabase::noOdbcDialog);
}
CATCH(CDBException,e)
{
OnLogEventProc("无法打开数据库,可能是密码错误");
return FALSE;
}
END_CATCH;
CRecordset lSet(&db);
sFilter = "(ip = '%s') AND (port = '%d') AND (password = '%s')";
lSet.m_strFilter.Format(sFilter,
m_OwnInfo.m_strIp,
m_OwnInfo.m_uPort,
m_OwnInfo.m_strPwd);
TRY
{
lSet.Open(CRecordset::snapshot,strSQL,CRecordset::readOnly);
if (lSet.IsEOF())
{
lSet.Close();
OnLogEventProc("服务器运行密码错误");
return FALSE;
}
else
{
sFilter = "(ip <> '%s') OR (port <> '%d')";
lSet.m_strFilter.Format(sFilter,
m_OwnInfo.m_strIp,
m_OwnInfo.m_uPort);
lSet.Requery();
if (!(lSet.IsEOF()))
{
CDBVariant var;
lSet.MoveFirst();
// short nFields = lSet.GetODBCFieldCount( );
CServerInfo * pServerInfo = NULL;
while(!(lSet.IsEOF()))
{
pServerInfo = new CServerInfo;
lSet.GetFieldValue("ip",var);
ASSERT(var.m_dwType==DBVT_STRING);
var.m_pstring->TrimLeft();
var.m_pstring->TrimRight();
pServerInfo->m_strIp = *(var.m_pstring);
lSet.GetFieldValue("port",var);
ASSERT(var.m_dwType==DBVT_LONG);
pServerInfo->m_uPort = var.m_lVal;
lSet.GetFieldValue("password",var);
var.m_pstring->TrimLeft();
var.m_pstring->TrimRight();
pServerInfo->m_strPwd = *(var.m_pstring);
m_lstMaxServer.AddTail(pServerInfo);
lSet.MoveNext();
}
}
lSet.Close();
}
}
CATCH(CDBException,e)
{
#ifdef _DEBUG
AfxMessageBox(e->m_strError);
AfxMessageBox("读取最大配置表出错,可能影响整个系统的运行一致性");
#endif
OnLogEventProc("读取最大配置表出错,可能影响整个系统的运行一致性");
return FALSE;
}
END_CATCH;
return TRUE;
}
CDBVariant valueVariant;
m_Recordset->GetFieldValue(short(i),valueVariant)
(i为第i列),取得第i列的值,赋给一个变量valueVariant。
然后 你就可以根据实际的数据类型把valueVariant转换为所需要的值,赋给VC中的相应
变量即可
HRESULT CGetSyncInfo::GetLastModify(LPCTSTR lpszTable, DBTIMESTAMP &dt)
{
HRESULT hr = E_FAIL;
CSession session;
CCommand<CDynamicAccessor>cmd;
CString strCmd; ZeroMemory(&dt,sizeof(DBTIMESTAMP));
strCmd.Format(TEXT("SELECT MAX(LastModify) AS MaxLastModify FROM %s"),lpszTable);
hr = session.Open(*m_pDS);
if(FAILED(hr))
return hr;
hr = cmd.Open(session,strCmd);
if(FAILED(hr))
return hr;
hr = cmd.MoveFirst();
if(hr == S_OK)
{
ULONG uIdx = 0;
dt = *(DBTIMESTAMP*)cmd.GetValue(uIdx);
return S_OK;
}
return hr;
}