vc控制台程序能用ADO连接数据库么?或者有什么别的方法。解决办法
vc控制台程序能用ADO连接数据库么?或者有什么别的方法。
RT
我用SQL提供的API做了,但是本机还可以,局域网内就很慢了。网上还有说这种做法不是很安全。希望大家多多交流啊!
谢谢!!!
------解决方案--------------------
当然能用.
ADO是com组件,使用前CoInitialize,结束时CoUninitialize
------解决方案--------------------
1、#import "msado15.dll " no_namespace rename( "EOF ", "ADOEOF ")
引入 "msado15.dll "动态库。
2、定义一个变量 _ConnectionPtr m_AdoCon;代表一个代表与数据源进行的唯一会话
3、打开数据库
_bstr_t connString; //连接字符串
try
{
connString = _T( "Provider=MSDASQL.1;Data Source=kong;Persist Security Info=False ");
m_AdoCon.CreateInstance(__uuidof(Connection));//???
m_AdoCon-> Open(connString, " ", " ", -1);
}
catch (_com_error& comerr)
{
IErrorInfo* pErrorInfo = comerr.ErrorInfo();
HRESULT hr = comerr.Error();
if (pErrorInfo)
{
BSTR bsDesc = NULL;
pErrorInfo-> GetDescription( &bsDesc );
_bstr_t sDesc( bsDesc, false );
AfxMessageBox(sDesc.operator LPCTSTR());
pErrorInfo-> Release();
}
}
4、使用
CString strIp, SQL_STR, strTemp, strResult;
UINT port;
_RecordsetPtr AdoRst; //RecordSet的实例
_StreamPtr AdoStream; //Ado数据流
SQL_STR = m_strText; //SQL语句
if (m_AdoCon-> State == adStateClosed) //判断连接是否已经关闭
{
strTemp = "Ado connection hasn 't set up. ";
m_pWnd-> SendMessage(WM_FRESHWATCHLIST, (WPARAM)(&strTemp));
SendMsg(strTemp, FALSE);
return;
}
try
{
//Create Recordset Interface
AdoRst.CreateInstance(__uuidof(Recordset));
AdoRst-> Open((LPCTSTR)SQL_STR, m_AdoCon.GetInterfacePtr(),
adOpenDynamic,adLockOptimistic,adCmdUnknown); //打开并且执行SQL(SQL_STR)语句
if (strTemp != "SELECT ")
strResult =_T( "OK! ");
else
{
//Save the xmlResult to strResult
AdoStream.CreateInstance(__uuidof(Stream)); //
AdoRst-> Save(AdoStream.GetInterfacePtr(), adPersistXML);
strResult = ((BSTR)AdoStream-> ReadText(adReadAll)); //转换为XML格式
}
}
catch (_com_error& comerr)
{
//catch the COM exception
IErrorInfo* pErrorInfo = comerr.ErrorInfo();
HRESULT hr = comerr.Error();
if (pErrorInfo)
{
BSTR bsDesc = NULL;
pErrorInfo-> GetDescription( &bsDesc );
_bstr_t sDesc( bsDesc, false);
strResult = sDesc.operator LPCTSTR();
pErrorInfo-> Release();
}
}
5.取得表中的字段 GetCollect()
int nItem;
_variant_t vUsername,vBirthday,vID,vOld;
try
{
m_pRecordset.CreateInstance( "ADODB.Recordset ");
m_pRecordset-> Open( "SELECT * FROM users ",_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
m_bSuccess = TRUE;
while(!m_pRecordset-> adoEOF)
{
vID = m_pRecordset-> GetCollect( "ID ");
vUsername = m_pRecordset-> GetCollect( "username ");
vOld = m_pRecordset-> GetCollect( "old ");
vBirthday = m_pRecordset-> GetCollect( "birthday ");
nItem=m_userlist.InsertItem(0xffff,(_bstr_t)vID);
m_userlist.SetItem(nItem,1,1,(_bstr_t)vUsername,NULL,0,0,0);
m_userlist.SetItem(nItem,2,1,(_bstr_t)vOld,NULL,0,0,0);
m_userlist.SetItem(nItem,3,1,(_bstr_t)vBirthday,NULL,0,0,0);
m_pRecordset-> MoveNext();
}
}
6.添加数据 PutCollect()
RT
我用SQL提供的API做了,但是本机还可以,局域网内就很慢了。网上还有说这种做法不是很安全。希望大家多多交流啊!
谢谢!!!
------解决方案--------------------
当然能用.
ADO是com组件,使用前CoInitialize,结束时CoUninitialize
------解决方案--------------------
1、#import "msado15.dll " no_namespace rename( "EOF ", "ADOEOF ")
引入 "msado15.dll "动态库。
2、定义一个变量 _ConnectionPtr m_AdoCon;代表一个代表与数据源进行的唯一会话
3、打开数据库
_bstr_t connString; //连接字符串
try
{
connString = _T( "Provider=MSDASQL.1;Data Source=kong;Persist Security Info=False ");
m_AdoCon.CreateInstance(__uuidof(Connection));//???
m_AdoCon-> Open(connString, " ", " ", -1);
}
catch (_com_error& comerr)
{
IErrorInfo* pErrorInfo = comerr.ErrorInfo();
HRESULT hr = comerr.Error();
if (pErrorInfo)
{
BSTR bsDesc = NULL;
pErrorInfo-> GetDescription( &bsDesc );
_bstr_t sDesc( bsDesc, false );
AfxMessageBox(sDesc.operator LPCTSTR());
pErrorInfo-> Release();
}
}
4、使用
CString strIp, SQL_STR, strTemp, strResult;
UINT port;
_RecordsetPtr AdoRst; //RecordSet的实例
_StreamPtr AdoStream; //Ado数据流
SQL_STR = m_strText; //SQL语句
if (m_AdoCon-> State == adStateClosed) //判断连接是否已经关闭
{
strTemp = "Ado connection hasn 't set up. ";
m_pWnd-> SendMessage(WM_FRESHWATCHLIST, (WPARAM)(&strTemp));
SendMsg(strTemp, FALSE);
return;
}
try
{
//Create Recordset Interface
AdoRst.CreateInstance(__uuidof(Recordset));
AdoRst-> Open((LPCTSTR)SQL_STR, m_AdoCon.GetInterfacePtr(),
adOpenDynamic,adLockOptimistic,adCmdUnknown); //打开并且执行SQL(SQL_STR)语句
if (strTemp != "SELECT ")
strResult =_T( "OK! ");
else
{
//Save the xmlResult to strResult
AdoStream.CreateInstance(__uuidof(Stream)); //
AdoRst-> Save(AdoStream.GetInterfacePtr(), adPersistXML);
strResult = ((BSTR)AdoStream-> ReadText(adReadAll)); //转换为XML格式
}
}
catch (_com_error& comerr)
{
//catch the COM exception
IErrorInfo* pErrorInfo = comerr.ErrorInfo();
HRESULT hr = comerr.Error();
if (pErrorInfo)
{
BSTR bsDesc = NULL;
pErrorInfo-> GetDescription( &bsDesc );
_bstr_t sDesc( bsDesc, false);
strResult = sDesc.operator LPCTSTR();
pErrorInfo-> Release();
}
}
5.取得表中的字段 GetCollect()
int nItem;
_variant_t vUsername,vBirthday,vID,vOld;
try
{
m_pRecordset.CreateInstance( "ADODB.Recordset ");
m_pRecordset-> Open( "SELECT * FROM users ",_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
m_bSuccess = TRUE;
while(!m_pRecordset-> adoEOF)
{
vID = m_pRecordset-> GetCollect( "ID ");
vUsername = m_pRecordset-> GetCollect( "username ");
vOld = m_pRecordset-> GetCollect( "old ");
vBirthday = m_pRecordset-> GetCollect( "birthday ");
nItem=m_userlist.InsertItem(0xffff,(_bstr_t)vID);
m_userlist.SetItem(nItem,1,1,(_bstr_t)vUsername,NULL,0,0,0);
m_userlist.SetItem(nItem,2,1,(_bstr_t)vOld,NULL,0,0,0);
m_userlist.SetItem(nItem,3,1,(_bstr_t)vBirthday,NULL,0,0,0);
m_pRecordset-> MoveNext();
}
}
6.添加数据 PutCollect()