﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-weisa</title><link>http://www.blogjava.net/weisa/</link><description /><language>zh-cn</language><lastBuildDate>Thu, 07 May 2026 00:22:11 GMT</lastBuildDate><pubDate>Thu, 07 May 2026 00:22:11 GMT</pubDate><ttl>60</ttl><item><title>将数组存入数据库的解决方法及用VC与数据库交互</title><link>http://www.blogjava.net/weisa/archive/2011/12/21/366915.html</link><dc:creator>weisa</dc:creator><author>weisa</author><pubDate>Wed, 21 Dec 2011 03:09:00 GMT</pubDate><guid>http://www.blogjava.net/weisa/archive/2011/12/21/366915.html</guid><wfw:comment>http://www.blogjava.net/weisa/comments/366915.html</wfw:comment><comments>http://www.blogjava.net/weisa/archive/2011/12/21/366915.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/weisa/comments/commentRss/366915.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/weisa/services/trackbacks/366915.html</trackback:ping><description><![CDATA[<div><pre>implode()  ---把数组转换成字符串  <br />explode()  ---把字符串转换成数组  <br />对于一维数组可以简单的用  <br />implode()<br />explode()<br />函数做数组&#8212;&#8212;串的变换，但需注意分隔符要使用数组中不存在的字符  <br /> 对于多维数组可以用序列化函数处理  <br />serialize()<br />unserialize()<br />---------------------------------------<br />ADO连接数据库，使用控件<div><span style="font-size: 10.5pt; font-family: &quot;Times New Roman&quot;,&quot;serif&quot;;">Microsoft ADO Data Control 6.0 (SP6) (OLEDB)<br /><div>ADO库包含三个基本接口:_ConnectionPtr接口、_CommandPtr接口和_RecordsetPtr接口。<br /><div>声明两个变量:<br />_ConnectionPtr      l_pConnection;<br />_RecordsetPtr   l_pRecordset;<br />下面开始连接数据库<br />l_pConnection.CreateInstance("ADODB.Connection");<br />也可以是l_pConnection.CreateInstance(__uuidof(Connection));二者选一。<br /><div><br />下面列出了连接三种数据库的语句<br />CString strConn;<br />1、连接SQL SERVER<br />strConn.Format("driver={SQL Server}; Server=%s; DATABASE=%s; UID=%s; PWD=%s", strServer, dbName, user, psw);<br />strServer是服务器名，如果访问本地数据库，可是设strServer = &#8220;172.0.0.1&#8221;或&#8221;.&#8221;;这是我试过的，都可以。<br />dbName是数据库名称，user, psw是用户名和密码。<br />2、连接ORACLE<br />trConn.Format("Provider=MSDAORA.1;Data Source=%s;", "%s", "%s", adModeUnknown, dbName, user, psw);<br />dbName, user, psw分别是数据库名，用户名，密码。<br />3、连接ACCESS<br />strConn.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;<br />Persist Security Info=False;Jet OLEDB:Database Password=%s", dbName, psw);<br />"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=fnamepath","","",adModeUnknown<br />dbName是数据库路径名，如&#8220;F:\\DB\\hermes.mdb&#8221;,psw是密码。<br /><br /><div>设置了连接语句，下面要和数据库进行连接了，对于上面三种数据库都是要执行下面这个连接的，下面语句是打一开连接的语句。<br />connPtr-&gt;Open((_bstr_t)strConn, "", "", adModeUnknown);<br />adModeUnknown:缺省。当前的许可权未设置<br />adModeRead:只读<br />adModeWrite:只写<br />adModeReadWrite:可以读写<br />adModeShareDenyRead:阻止其它Connection对象以读权限打开连接<br />adModeShareDenyWrite:阻止其它Connection对象以写权限打开连接<br />adModeShareExclusive:阻止其它Connection对象以读写权限打开连接<br />adModeShareDenyNone:阻止其它Connection对象以任何权限打开连接</div><br /><div>4、连接UDL<br />CString strConnect = "File Name=" + udlDir;<br />connPtr-&gt;Open((_bstr_t)strConnect, (_bstr_t)user, (_bstr_t)psw, adModeUnknown);     <br />字符串udlDir是udl文件路径，user和pssw是udl连接数据库的用户名和密码。<br /><br /><div>得到记录集：<br />l_pRecordset.CreateInstance("ADODB.Recordset");<br />l_pRecordset-&gt;Open(_bstr_t(l_strSQLConn), <br />              _variant_t((IDispatch*)l_pConnection, true), <br />             adOpenStatic, adLockOptimistic, adCmdText);<br />l_strSQLConn是select语句<br /><br /><div>// 遍历结果集<br />while( !l_pRecordset-&gt;adoEOF)<br />{<br />&#8230;&#8230;// 在这里添加操作结果集的代码如：<br />strTemp = (LPCSTR)(_bstr_t)l_pRecordsetTable-&gt;GetCollect(_variant_t((long)i));// 得到某个字段的记录。<br />       l_pRecordset-&gt;MoveNext();<br />}</div><div>对数据库的操作一般使用异常机制。也就是try{&#8230;}catch(){..}<br />注意，一个_RecordsetPtr的对象只能得到一个记录集，重复用时就会出错。当要打开两个数据库时最好定义两个_RecordsetPtr对象</div><br /><div>四、关闭记录集和连接<br />关闭记录集：<br />l_pRecordsetTable-&gt;Close();<br />l_pRecordsetTable = NULL;<br /><br />关闭连接：<br />l_pConnection-&gt;Close();<br />l_pConnection = NULL;<br /><br />// 释放环境   <br />::CoUninitialize();</div><div>附加：<br />l_pRecordset执行select语句后就可以得到表的字段名，字段数，字段大小，我写了三个函数，分别得到指定表的字段数，<br />指定字段的字段名及字段大小。<br /><br /><div>// 得到字段名<br />BOOL CLx4Dlg::GetFieldsName(_RecordsetPtr RcdPtr, int nField, CString &amp; strFieldName)   <br />{   <br />       if(NULL == RcdPtr || nField &gt;= RcdPtr-&gt;GetFields()-&gt;Count)return FALSE;<br />       _variant_t vt((long)nField);<br />       strFieldName.Format(_T("%s"), (char*)(RcdPtr-&gt;GetFields()-&gt;Item[vt]-&gt;Name)); <br />       return true;<br />}<br /><br />// 得到字段大小<br />int CLx4Dlg::GetFieldsSize(_RecordsetPtr RcdPtr, int nField)   <br />{   <br />       if(NULL == RcdPtr || nField &gt;= RcdPtr-&gt;GetFields()-&gt;Count)return FALSE;<br />       _variant_t vt((long)nField);<br />       int nSize = RcdPtr-&gt;GetFields()-&gt;Item[vt]-&gt;DefinedSize;          // 返回已声明的字段大小<br />       //int nSize = RcdPtr-&gt;GetFields()-&gt;Item[vt]-&gt;ActualSize;   // 返回给定字段中数据的实际大小<br />      return nSize;<br />}</div><div>SQL 语句：<br />得到SQL SERVER的所有用户类型的表<br />select name from sysobjects where xtype='U'<br /><br />得到ORACLE的所有用户表<br />select tname from tab where tabtype='TABLE'<br /><br />得到ACCESS的所有用户建的表<br />SELECT Name FROM MSysObjects WHERE Flags=0 AND Type=1<br />SELECT MSysObjects.Name FROM MSysObjects WHERE Type=1</div></div></div></div></div></div></div></span></div><br /></pre></div><img src ="http://www.blogjava.net/weisa/aggbug/366915.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/weisa/" target="_blank">weisa</a> 2011-12-21 11:09 <a href="http://www.blogjava.net/weisa/archive/2011/12/21/366915.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>