2011年12月21日

将数组存入数据库的解决方法及用VC与数据库交互

implode()  ---把数组转换成字符串  
explode() ---把字符串转换成数组
对于一维数组可以简单的用
implode()
explode()
函数做数组——串的变换,但需注意分隔符要使用数组中不存在的字符
对于多维数组可以用序列化函数处理
serialize()
unserialize()
---------------------------------------
ADO连接数据库,使用控件
Microsoft ADO Data Control 6.0 (SP6) (OLEDB)
ADO库包含三个基本接口:_ConnectionPtr接口、_CommandPtr接口和_RecordsetPtr接口。
声明两个变量:
_ConnectionPtr l_pConnection;
_RecordsetPtr l_pRecordset;
下面开始连接数据库
l_pConnection.CreateInstance("ADODB.Connection");
也可以是l_pConnection.CreateInstance(__uuidof(Connection));二者选一。

下面列出了连接三种数据库的语句
CString strConn;
1、连接SQL SERVER
strConn.Format("driver={SQL Server}; Server=%s; DATABASE=%s; UID=%s; PWD=%s", strServer, dbName, user, psw);
strServer是服务器名,如果访问本地数据库,可是设strServer = “172.0.0.1”或”.”;这是我试过的,都可以。
dbName是数据库名称,user, psw是用户名和密码。
2、连接ORACLE
trConn.Format("Provider=MSDAORA.1;Data Source=%s;", "%s", "%s", adModeUnknown, dbName, user, psw);
dbName, user, psw分别是数据库名,用户名,密码。
3、连接ACCESS
strConn.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;
Persist Security Info=False;Jet OLEDB:Database Password=%s", dbName, psw);
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=fnamepath","","",adModeUnknown
dbName是数据库路径名,如“F:\\DB\\hermes.mdb”,psw是密码。

设置了连接语句,下面要和数据库进行连接了,对于上面三种数据库都是要执行下面这个连接的,下面语句是打一开连接的语句。
connPtr->Open((_bstr_t)strConn, "", "", adModeUnknown);
adModeUnknown:缺省。当前的许可权未设置
adModeRead:只读
adModeWrite:只写
adModeReadWrite:可以读写
adModeShareDenyRead:阻止其它Connection对象以读权限打开连接
adModeShareDenyWrite:阻止其它Connection对象以写权限打开连接
adModeShareExclusive:阻止其它Connection对象以读写权限打开连接
adModeShareDenyNone:阻止其它Connection对象以任何权限打开连接

4、连接UDL
CString strConnect = "File Name=" + udlDir;
connPtr->Open((_bstr_t)strConnect, (_bstr_t)user, (_bstr_t)psw, adModeUnknown);
字符串udlDir是udl文件路径,user和pssw是udl连接数据库的用户名和密码。

得到记录集:
l_pRecordset.CreateInstance("ADODB.Recordset");
l_pRecordset->Open(_bstr_t(l_strSQLConn),
_variant_t((IDispatch*)l_pConnection, true),
adOpenStatic, adLockOptimistic, adCmdText);
l_strSQLConn是select语句

// 遍历结果集
while( !l_pRecordset->adoEOF)
{
……// 在这里添加操作结果集的代码如:
strTemp = (LPCSTR)(_bstr_t)l_pRecordsetTable->GetCollect(_variant_t((long)i));// 得到某个字段的记录。
l_pRecordset->MoveNext();
}
对数据库的操作一般使用异常机制。也就是try{…}catch(){..}
注意,一个_RecordsetPtr的对象只能得到一个记录集,重复用时就会出错。当要打开两个数据库时最好定义两个_RecordsetPtr对象

四、关闭记录集和连接
关闭记录集:
l_pRecordsetTable->Close();
l_pRecordsetTable = NULL;

关闭连接:
l_pConnection->Close();
l_pConnection = NULL;

// 释放环境
::CoUninitialize();
附加:
l_pRecordset执行select语句后就可以得到表的字段名,字段数,字段大小,我写了三个函数,分别得到指定表的字段数,
指定字段的字段名及字段大小。

// 得到字段名
BOOL CLx4Dlg::GetFieldsName(_RecordsetPtr RcdPtr, int nField, CString & strFieldName)
{
if(NULL == RcdPtr || nField >= RcdPtr->GetFields()->Count)return FALSE;
_variant_t vt((long)nField);
strFieldName.Format(_T("%s"), (char*)(RcdPtr->GetFields()->Item[vt]->Name));
return true;
}

// 得到字段大小
int CLx4Dlg::GetFieldsSize(_RecordsetPtr RcdPtr, int nField)
{
if(NULL == RcdPtr || nField >= RcdPtr->GetFields()->Count)return FALSE;
_variant_t vt((long)nField);
int nSize = RcdPtr->GetFields()->Item[vt]->DefinedSize; // 返回已声明的字段大小
//int nSize = RcdPtr->GetFields()->Item[vt]->ActualSize; // 返回给定字段中数据的实际大小
return nSize;
}
SQL 语句:
得到SQL SERVER的所有用户类型的表
select name from sysobjects where xtype='U'

得到ORACLE的所有用户表
select tname from tab where tabtype='TABLE'

得到ACCESS的所有用户建的表
SELECT Name FROM MSysObjects WHERE Flags=0 AND Type=1
SELECT MSysObjects.Name FROM MSysObjects WHERE Type=1

posted @ 2011-12-21 11:09 weisa 阅读(283) | 评论 (0)编辑 收藏

仅列出标题  
<2024年5月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

导航

统计

常用链接

留言簿

随笔档案

搜索

最新评论