如何向postgresql忘记密码中添加bytea类型的大对象数据

postgreSQL:插入bytea类型的大对象数据。
[问题点数:40分]
postgreSQL:插入bytea类型的大对象数据。
[问题点数:40分]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
相关帖子推荐:
2010年6月 其他数据库开发大版内专家分月排行榜第二2010年6月 Oracle大版内专家分月排行榜第二2010年5月 其他数据库开发大版内专家分月排行榜第二
2011年1月 其他数据库开发大版内专家分月排行榜第三2010年12月 其他数据库开发大版内专家分月排行榜第三
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。postgresql: 大对象(二:文档中未曾说明的服务端函数)
在PostgreSQL官方文档中,涉及大对象的操作函数有分客户端和服务端,客户端函数是封装在libpq库中。必须通过c调用。然而设计实际应用时,并不是都是用c+libpq这种形式,常常用odbc, ado或jdbc等接口,所以客户端函数对我们没有多大用处。
实际上,libpq上封装的客户端函数也是简单调用服务端函数(lo_export,lo_import除外),但在官方文档中却没有完全介绍这些服务端函数。大家可以通过以下命令获取大对象服务端函数的清单:
select * from pg_proc where proname like 'lo%';
现在依次介绍,注意以下是服务端函数,虽然有些和客户端同名,但性质不一样,服务端函数可在任何语言中以发送SQL语句的方式调用。
1、lo_creat(int open_mode) &-- 建立一个新的空白大对象,open_mode为打开类型,这是个过时的标志,目前以-1代替,返回大对象地址(整型)oid。
2、lo_create(oid loid) & & &-- 建立一个地址为loid的空白大对象,返回大对象地址oid(整型)。
3、lo_unlink(oid loid) & & &-- 删除一个地址为loid的大对象,返回整型 1-成功 &-1 -失败。
4、lo_import(text filename) -- 将服务器文件filename的数据导入一个新的大对象,返回大对象地址oid(整型)。
5、lo_export(oid loid, text filename) --将大对象loid的数据导出到一个服务器文件filename中,返回导出长度(整型)。
注意以上2个函数是很危险的命令,必须要有超级用户super的权限。同时服务器文件filename必须是运行服务器的操作用户(默认是postgres)所能读写的。
以上2个函数的存在是postgres服务程序不允许由root启动的原因之一,否则服务器的操作系统就没有安全可言。
客户端函数也有以上2个相同名称的函数,但读写的是客户端的文件,性质是不一样的。客户端的这2个函数可以由以下函数封装。
接着继续介绍文档未曾公开的服务端函数:
6、lo_open(oid loid, integer open_mode) &-- 打开一个地址为loid的大对象,为读写做准备,open_mode为打开类型: inv_write(写,值为131072)、inv_read(读,值为262144)或者inv_write|inv_read (读写,值为393216)。返回文件句柄fd(整型),若fd为负数,失败。
7、loread(integer fd, integer len) &-- 读句柄fd当前位置开始的len大小的数据,返回数据内容(bytea类型)。
8、lowrite(integer fd, bytea buf) & -- 在句柄fd当前位置开始将二进制数据buf写入大对象中,返回所写的长度(整型)。
9、lo_lseek(integer fd, integer offset, integer whence) -- 改变句柄fd当前的读写位置。whence是寻址方式,seek_set(值为0)从对象头开始,seek_cur(值为1)从当前读写位置开始,seek_end(值为2)从对象尾开始,offset是偏移尺寸。返回新的读写位置(整型),-1表示错误。
注:loread、lowrite会自动改变当前读写位置,所以若顺序读写,lo_lseek这个命令就没什么用。
10、lo_tell(integer fd) & & &-- 返回句柄fd的当前位置(整型)
11、lo_truncate(integer fd, integer len) -- 截取句柄fd所打开的大对象长度为len大小。若len大于原来大对象的长度,会在大对象后缀一个'\0'字符。成功返回0,失败为负数。
12、lo_close(integer fd) & &-- 关闭句柄fd, 成功返回0,失败为负数。
以上6-12函数必须在一个transaction内完成,也就是说句柄fd只在一个事务内有效,事务结束它自动关闭。
您对本文章有什么意见或着疑问吗?请到您的关注和建议是我们前行的参考和动力&&
您的浏览器不支持嵌入式框架,或者当前配置为不显示嵌入式框架。1,/kb/262447/zh-tw
可透過 ADO 持續性的資料列集為 XML 時,OLE DB 不提供此服務。同樣地,OLE DB 不提供從 XML 檔案物件載入 OLE DB 資料列集的服務。若要保存為 XML 資料的 OLE DB 資料列集,請先包裝 OLE DB 資料列集的 ADO 資料錄集物件中使用 ADO IADORecordsetConstruction
本章節所提供的程式碼範例顯示如何
保存為 XML 檔案的 OLE DB 資料列集。從 XML 檔案載入 OLE DB 資料列集
保存到外部 XML 檔案的 OLE DB 資料列集的方式所示的Rowset2Xml()函式,它的資料列集,並將它傳輸至 ADO 資料錄集物件。然後會使用然後方法資料錄集物件上,將資料列集儲存到外部的 XML 檔案。
載入 OLE DB 資料列集從外部的 XML 檔案也示範了在Xml2Rowset()函式,建立 ADO 資料錄集物件,並使用Open方法,來開啟檔案。然後它會藉由使用 IADORecordsetConstruction 介面的get_Rowset()方法擷取從資料錄集物件的資料列集。
程式碼使用 Microsoft SQL Server 資料來源。若要執行範例時,您可以使用下列的指令碼來建立表格 「 書籍 」 「 pubs 」 資料庫中。
CREATE TABLE Books (
id int IDENTITY (1, 1) NOT NULL ,
Title char(50) ,
Publisher char(50)
) ON [PRIMARY]
INSERT INTO books(Title, Publisher) VALUES ('Debugging applications','MS Press')
INSERT INTO books(Title, Publisher) VALUES ('Inside SQL Server 7.0','MS Press')
以下是範例的程式碼:
#include &atldbcli.h&
#import &C:\Program files\Common Files\System\Ado\msado15.dll& no_namespace
rename(&EOF&, &ADOEOF&)
class CdboBooksAccessor
TCHAR m_Title[51];
TCHAR m_Publisher[51];
BEGIN_COLUMN_MAP(CdboBooksAccessor)
COLUMN_ENTRY(1, m_id)
COLUMN_ENTRY(2, m_Title)
COLUMN_ENTRY(3, m_Publisher)
END_COLUMN_MAP()
DEFINE_COMMAND(CdboBooksAccessor, _T(& \
FROM dbo.Books&))
class CdboBooks : public CCommand&CAccessor&CdboBooksAccessor& &
HRESULT Open()
hr = OpenDataSource();
if (FAILED(hr))
return OpenRowset();
HRESULT OpenDataSource()
CDBPropSet dbinit(DBPROPSET_DBINIT);
dbinit.AddProperty(DBPROP_AUTH_PERSIST_SENSITIVE_AUTHINFO, false);
dbinit.AddProperty(DBPROP_AUTH_USERID, OLESTR(&sa&));
dbinit.AddProperty(DBPROP_INIT_CATALOG, OLESTR(&pubs&));
dbinit.AddProperty(DBPROP_INIT_DATASOURCE, OLESTR(&vcdb01&));
dbinit.AddProperty(DBPROP_INIT_LCID, (long)1033);
dbinit.AddProperty(DBPROP_INIT_PROMPT, (short)4);
hr = db.Open(_T(&SQLOLEDB.1&), &dbinit);
if (FAILED(hr))
return m_session.Open(db);
HRESULT OpenRowset()
return CCommand&CAccessor&CdboBooksAccessor& &::Open(m_session);
CSession m_
HRESULT Rowset2Xml();
//OLEDB rowset -& external xml file
HRESULT Xml2Rowset();
//xml file -& OLEDB rowset
void dump_error(_com_error &e);
void main()
CoInitialize(NULL);
hr = Rowset2Xml();
hr = Xml2Rowset();
catch(_com_error &e)
dump_error(e);
HRESULT Rowset2Xml()
HRESULT hr = S_OK;
CdboBooks cmdB
hr = cmdBooks.Open();
ADORecordsetConstructionPtr spADORsC
_RecordsetPtr spRs(__uuidof(Recordset));
spADORsConst = spRs;
hr = spADORsConst-&put_Rowset((LPUNKNOWN)(cmdBooks.m_spRowset));
spRs-&Save(&books.xml&, adPersistXML);
HRESULT Xml2Rowset()
HRESULT hr = S_OK;
CdboBooks cmdB
hr = cmdBooks.OpenDataSource();
//load the ADO recordset
_RecordsetPtr spRs(__uuidof(Recordset));
hr = spRs-&Open(&books.xml&,&Provider=MSP&,adOpenForwardOnly,adLockReadOnly,adCmdFile);
ADORecordsetConstructionPtr spADORsC
//QI for ADORecordsetConstruction interface
spADORsConst = spRs;
//Create CCommand
hr = cmdBooks.CreateCommand(cmdBooks.m_session);
//hook up the rowset with ADO Recordset
spADORsConst-&get_Rowset((LPUNKNOWN*)&(cmdBooks.m_spRowset));
//in order to retrieve data, we have to bind
hr = cmdBooks.Bind();
//test the CCommand object out
while( cmdBooks.MoveNext() == S_OK)
printf(&%d
%s\n&, cmdBooks.m_id, cmdBooks.m_Title, cmdBooks.m_Publisher);
void dump_error(_com_error &e)
_bstr_t bstrSource(e.Source());
_bstr_t bstrDescription(e.Description());
// Print Com errors.
printf(&Error\n&);
printf(&\tCode = %08lx\n&, e.Error());
printf(&\tCode meaning = %s&, e.ErrorMessage());
printf(&\tSource = %s\n&, (LPCSTR) bstrSource);
printf(&\tDescription = %s\n&, (LPCSTR) bstrDescription);
附註有關程式碼:
為了簡單起見,程式碼不會檢查所有傳回 HRESULT。它是很好的作法,來檢查 HRESULT,並使用 CDBErrorInfo/AtlTraceErrorRecords(),取回更具描述性的錯誤。在Rowset2Xml () 函式,
hr = cmdBooks.Open();
呼叫來建立 CCommand,並執行 select 陳述式中,然後再擷取此 CCommand 相關聯的 CRowset。或者,您可以明確地取得 IRowset 回呼叫執行,如下所示:
CCommand&CAccessor&CdboBooksAccessor& &
hr = cmd.CreateCommand(session);
CComBSTR bsSQLsmd=OLESTR(&SELECT * FROM Books&);
CComPtr&ICommandText& spCommandT
hr = cmd.m_spCommand-&QueryInterface(&spCommandText);
if (SUCCEEDED(hr))
hr = spCommandText-&SetCommandText(DBGUID_SQL, bsSQLsmd);
CComPtr&IRowset& pIRowset = NULL;
hr = cmd.m_spCommand-&Execute(NULL, IID_IRowset, NULL, &cRowsAffected, (IUnknown**)&pIRowset);
2,m/kb/262450/zh-cn
如何: c + + 示例的 ADO 记录集 XML 持久性
文章编号: 262450 -&
与 ADO 2.5 或更高版本中,记录集对象可以保持到实现 IStream 接口的任何对象。本文中的代码示例演示如何向/从外部的 xml 文件、 ADO IStream 对象和 XML DOM 对象的保留/负载 ADO 记录集。
1.该示例使用的 SQL Server 数据库 pubs 数据库中的 authors 表。
2.修改连接字符串,以提供适当的数据源名称和用户凭据。
3.因为有两个 #import dll,为简化编程,我重命名为 MSXML,ADO (ADODB) 命名空间,并为这两个 dll 中定义的接口使用 MSXML。或者,可以不执行此操作的情况下总是前缀具有适当的命名空间的接口。
注意:您必须更改用户 ID = & 用户名 & 和密码运行此代码之前,为正确的值 = & 强密码 &。请确保用户 ID 具有在数据库执行此操作的相应权限。
// 1. ADO Recordset &-& external xml file
// 2. ADO Recordset &-& ADO IStream Object
// 3. ADO Recordset &-& DOM Document
#import &C:\Program files\Common Files\System\Ado\msado15.dll& rename_namespace(&MSXML&)
rename(&EOF&, &ADOEOF&)
#import &c:\winnt\system32\msxml.dll&
using namespace MSXML;
#include &stdio.h&
#include &io.h&
void dump_error(_com_error &e) ; //exception handling
void main()
CoInitialize(NULL);
//open the connection, get the reocrdset ready
_ConnectionPtr pC
_RecordsetPtr pRs;
hr = pConn.CreateInstance(__uuidof(Connection));
hr = pRs.CreateInstance(__uuidof(Recordset));
pConn-&CursorLocation = adUseC
_bstr_t strConn(&Provider=Data Source=juliaj01;Initial Catalog=User Id=&username&;Password=&strong password&;&);
hr = pConn-&Open(strConn, &&username&&, &&strong password&&, adConnectUnspecified);
hr = pRs-&Open(&SELECT * from authors&, pConn.GetInterfacePtr(), adOpenForwardOnly, adLockReadOnly, adCmdText);
//preparation to save RS as xml file,
struct _finddata_t xml_
if( (hFile = _findfirst(&authors.xml&, &xml_file )) != -1L)
DeleteFile(&authors.xml&); //if the file exists, delete it
// 1. Persist it to an external xml file by calling Save with file name and adPersistXML
hr = pRs-&Save(&authors.xml&, adPersistXML);
// 2. Persist it to ADO IStream Object
_StreamPtr pS //declare one first
pStream.CreateInstance(__uuidof(Stream)); //create it after
hr = pRs-&Save(pStream.GetInterfacePtr(), adPersistXML);
//old trick, call Save
// 3. Persist it to DOM Document
IXMLDOMDocumentPtr pXMLDOMD
pXMLDOMDoc.CreateInstance(__uuidof(DOMDocument));
hr = pRs-&Save(pXMLDOMDoc.GetInterfacePtr(), adPersistXML);
// if you want to check out the content call printf(pXMLDOMDoc-&Getxml());
//Recycle the Recordset object
hr = pRs-&Close();
// 4. load the recordset back from the file by calling Open with MSPersist provider and adCmdFile.
// the Recordset will be a ReadOnly, Forwardly only
hr = pRs-&Open(&authors.xml&,&Provider=MSP&,adOpenForwardOnly,adLockReadOnly,adCmdFile);
hr = pRs-&Close();
Load from IStream object, call Open, first param is pStream.GetInterfacePtr()
Set the steam object position to the beginning of the stream:
pStream-&Position = 0;
call Open,
passing in vtMissing for connection string, see Q245485 for details
hr = pRs-&Open(pStream.GetInterfacePtr(),vtMissing, adOpenForwardOnly,adLockReadOnly,adCmdFile);
hr = pRs-&Close();
// 6 .Load from DOM Document, call Open, first param is pXMLDOMDoc.GetInterfacePtr() and
// pass in vtMissing for connection string, see Q245485
hr = pRs-&Open(pXMLDOMDoc.GetInterfacePtr(), vtMissing, adOpenForwardOnly, adLockReadOnly, adCmdFile);
hr = pRs-&Close();
//Don't forget to clean up the stream object
hr = pStream-&Close();
catch(_com_error &e)
dump_error(e);
void dump_error(_com_error &e)
_bstr_t bstrSource(e.Source());
_bstr_t bstrDescription(e.Description());
// Print Com errors.
printf(&Error\n&);
printf(&\tCode = %08lx\n&, e.Error());
printf(&\tCode meaning = %s&, e.ErrorMessage());
printf(&\tSource = %s\n&, (LPCSTR) bstrSource);
printf(&\tDescription = %s\n&, (LPCSTR) bstrDescription);
注意:本文中提供的示例代码包含对 MSXML 2.5 或更早版本的引用。如果已在替换模式下,您的计算机上安装了较新版本的 MSXML,则代码示例将自动使用此新版本。如果已通过并行模式下,您的计算机上安装了较新版本的
MSXML,代码可能会使用较旧的版本。
若要使用 MSXML 6.0 中运行此代码,下面的代码行必须进行更改:
#import&C:\Program 必须 Files\System\Ado\msado15.dll&rename_namespace(&MSXML&) 重命名 (&EOF&,&ADOEOF&)
#import 使用 MSXML ; 命名为&c:\winnt\system32\msxml.dll&
#import&C:\Program 必须 Files\System\Ado\msado15.dll&rename_namespace(&MSXML2&) 重命名 (&EOF&,&ADOEOF&)
#import&c:\winnt\system32\msxml6.dll&使用命名空间 MSXML2 ;
pXMLDOMDoc.CreateInstance(__uuidof(DOMDocument))
pXMLDOMDoc.CreateInstance(__uuidof(DOMDocument60))
若要使用 MSXML 6.0 中运行此代码,下面的代码行必须进行更改:
#import&C:\Program 必须 Files\System\Ado\msado15.dll&rename_namespace(&MSXML&) 重命名 (&EOF&,&ADOEOF&)
#import 使用 MSXML ; 命名为&c:\winnt\system32\msxml.dll&
#import&C:\Program 必须 Files\System\Ado\msado15.dll&rename_namespace(&MSXML2&) 重命名 (&EOF&,&ADOEOF&)
#import&c:\winnt\system32\msxml6.dll&使用命名空间 MSXML2 ;
pXMLDOMDoc.CreateInstance(__uuidof(DOMDocument))
pXMLDOMDoc.CreateInstance(__uuidof(DOMDocument60))
有关详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
标题作者内容类型语言区域设置版本保密内容状态工作组
MT 发布日期操作
如何保持/装载到文件,或从
XML 使用 ATL OLE DB 使用者模板类的 OLE DB 行集合
发生错误时打开 XML 流的 ADO 记录集
文章编号: 262450 - 最后修改: 日 - 修订: 3.0
这篇文章中的信息适用于:
Microsoft ActiveX Data Objects 2.5Microsoft ActiveX Data Objects 2.6Microsoft Visual C++ 6.0 企业版Microsoft Visual C++ 6.0 专业版Microsoft Visual C++, 32-bit Learning Edition 6.0Microsoft XML Parser 2.5Microsoft XML Parser 2.6Microsoft XML Parser 3.0Microsoft XML Core Services 6.0
kbmt kbhowto KB262450 KbMtzh
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版:&
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均&依样&提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。
3,/zh-cn/library/jj249917.aspx
4,/kb/242249/zh-cn
ADOPERSIST.exe 是 Visual C++ 示例,演示如何将 ADO 记录集保存为 IStream 对象,然后重新加载它从另一个 ADO 记录集。
ADO 1.5 x 和 2.x 记录集的实现提供了数据到磁盘文件的持久性有关的两个功能:
若要保存到文件中的记录集对象的 ADORecordset.Save()。ADORecordset.Open(),以重新加载文件中的记录集。
出于性能或由于其他原因它可能有时需要将 ADO 记录集保存到内存中,只能作为数据的流。为实现这一点,您可以使用 ADO 记录集的 IPersistStream 接口实现。
此示例使用以下步骤来保存 ADO 记录集:
对给定的 ADO 记录集,获取对 IPersistStream 对象的指针调用 QueryInterface()。使用 CreateStreamOnHGlobal() 创建的标准,COM IStream 对象。调用的 COM 函数 OleSaveToStream() 可以将 IPersistStream 对象保存到的 IStream 对象。
给定的 IStream 对象,该示例然后重建从它的另一个 ADO 记录集。这是使用保存的数据的流,并调用 OleLoadFromStream() 的 IStream 指针。
下面是示例中的键的代码:
int main(int argc, char* argv[])
HRESULT hr=S_OK;
_RecordsetP //Recordset for Saving Data
_RecordsetPtr rs2; //Recordset for Loading Data
IStreamPtr pS
//----------------------------------------
// Create a recordset for testing
//----------------------------------------
if (FAILED(CreateTestRS(&rs)))
printf(&Couldn't create the first recordset\n&);
//----------------------------------------
// Create IStream
//----------------------------------------
if (FAILED(SaveRS(rs, (IStream**)&pStream)))
printf(&Couldn't save the recordset\n&);
//----------------------------------------
// Load another recordset from IStream
//----------------------------------------
if (FAILED(LoadRS(&rs2, pStream)))
printf(&Couldn't save the recordset\n&);
//Now display the names of the fields of the rs that we just recreated
for (short i =0;i&rs2-&Fields-&Ci++)
printf(&Name of field %d is %s\n&, i, (LPCTSTR) rs2-&Fields-&GetItem(i)-&Name);
//----------------------------------------
// Pause and then exit so that the user
//----------------------------------------
printf(&Press any key to end program\n&);
//----------------------------------------
// Create a recordset from scratch
//----------------------------------------
HRESULT CreateTestRS(_Recordset** prs/*OUT*/)
* prs=NULL;
_RecordsetPtr pRS;
pRS.CreateInstance( __uuidof(Recordset));
pRS-&CursorLocation = adUseC
pRS-&CursorType = adOpenS
pRS-&LockType = adLockBatchO
// append fields
pRS-&Fields-&Append(_bstr_t(&ADOField1&), adVarChar, 45,adFldFixed);
pRS-&Fields-&Append(_bstr_t(&ADOField2&), adBoolean, 0,adFldFixed);
pRS-&Fields-&Append(_bstr_t(&ADOField3&), adCurrency, 0,adFldFixed);
pRS-&Fields-&Append(_bstr_t(&ADOField4&), adDate, 0,adFldFixed);
pRS-&Open(vtMissing, vtMissing, adOpenStatic,adLockBatchOptimistic,-1);
*prs= pRS.Detach();
catch (_com_error & e)
return e.Error();
return S_OK;
HRESULT SaveRS(_RecordsetPtr pRS/*IN*/, IStream* * ppStream/*OUT*/)
HRESULT hr=S_OK;
*ppStream=NULL;
// QI and return IPersistStream
IPersistStreamPtr pIPersist(pRS);
if (pIPersist )
//Create a standard stream in memory
if (FAILED(hr=CreateStreamOnHGlobal(0, TRUE, (IStream **)ppStream)))
// Persist the pRS
if (FAILED(hr=OleSaveToStream(pIPersist, *ppStream)))
return E_NOINTERFACE;
catch (_com_error & e)
return e.Error();
return S_OK;
HRESULT LoadRS(_Recordset* *ppRS/*OUT*/, IStreamPtr pStream/*IN*/)
HRESULT hr=S_OK;
*ppRS=NULL;
if (NULL==pStream)
return E_NOINTERFACE;
// Load the pRS.
LARGE_INTEGER
li.QuadPart = 0;
//Set the pointer to the beginning of the stream
if (FAILED(hr=pStream-&Seek(li, STREAM_SEEK_SET, 0)))
if (FAILED(hr=OleLoadFromStream(pStream,
__uuidof(_Recordset),
reinterpret_cast&LPVOID *&(ppRS)))
catch (_com_error & e)
return e.Error();
return S_OK;
下面是一些可从 Microsoft 下载中心下载的文件:
有关如何下载 Microsoft 支持文件的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
如何从在线服务获得
Microsoft 支持文件
微软已对此文件进行病毒扫描。Microsoft 使用的最新的病毒检测软件,对投递日期的该文件可用。该文件存储在安全增强型服务器上,以防止对文件进行任何未经授权的更改。
ADOPersist.cpp
ADOPersist.dsp
5,/kb/262447/zh-cn
本节提供的代码示例演示如何为
保持 OLE DB 行集设置为 XML 文件。从 XML 文件加载 OLE DB 行集
Rowset2Xml()函数,它将一个行集,并将其传送到 ADO 记录集对象中显示持久保存到外部 XML 文件的 OLE DB 行集的方法。然后使用save
()方法上的记录集对象保存到外部 XML 文件的行集。
加载的 OLE DB 行集的外部的 xml 文件演示了在Xml2Rowset()函数中,它创建 ADO 记录集对象,并使用Open方法打开该文件。然后它使用
IADORecordsetConstruction 接口的get_Rowset()方法检索记录集对象的行集。
该代码使用 Microsoft SQL Server 数据源。若要运行此示例,可用于以下脚本创建表&书&&pubs&数据库中。
CREATE TABLE Books (
id int IDENTITY (1, 1) NOT NULL ,
Title char(50) ,
Publisher char(50)
) ON [PRIMARY]
INSERT INTO books(Title, Publisher) VALUES ('Debugging applications','MS Press')
INSERT INTO books(Title, Publisher) VALUES ('Inside SQL Server 7.0','MS Press')
下面是该示例的代码:
#include &atldbcli.h&
#import &C:\Program files\Common Files\System\Ado\msado15.dll& no_namespace
rename(&EOF&, &ADOEOF&)
class CdboBooksAccessor
TCHAR m_Title[51];
TCHAR m_Publisher[51];
BEGIN_COLUMN_MAP(CdboBooksAccessor)
COLUMN_ENTRY(1, m_id)
COLUMN_ENTRY(2, m_Title)
COLUMN_ENTRY(3, m_Publisher)
END_COLUMN_MAP()
DEFINE_COMMAND(CdboBooksAccessor, _T(& \
FROM dbo.Books&))
class CdboBooks : public CCommand&CAccessor&CdboBooksAccessor& &
HRESULT Open()
hr = OpenDataSource();
if (FAILED(hr))
return OpenRowset();
HRESULT OpenDataSource()
CDBPropSet dbinit(DBPROPSET_DBINIT);
dbinit.AddProperty(DBPROP_AUTH_PERSIST_SENSITIVE_AUTHINFO, false);
dbinit.AddProperty(DBPROP_AUTH_USERID, OLESTR(&sa&));
dbinit.AddProperty(DBPROP_INIT_CATALOG, OLESTR(&pubs&));
dbinit.AddProperty(DBPROP_INIT_DATASOURCE, OLESTR(&vcdb01&));
dbinit.AddProperty(DBPROP_INIT_LCID, (long)1033);
dbinit.AddProperty(DBPROP_INIT_PROMPT, (short)4);
hr = db.Open(_T(&SQLOLEDB.1&), &dbinit);
if (FAILED(hr))
return m_session.Open(db);
HRESULT OpenRowset()
return CCommand&CAccessor&CdboBooksAccessor& &::Open(m_session);
CSession m_
HRESULT Rowset2Xml();
//OLEDB rowset -& external xml file
HRESULT Xml2Rowset();
//xml file -& OLEDB rowset
void dump_error(_com_error &e);
void main()
CoInitialize(NULL);
hr = Rowset2Xml();
hr = Xml2Rowset();
catch(_com_error &e)
dump_error(e);
HRESULT Rowset2Xml()
HRESULT hr = S_OK;
CdboBooks cmdB
hr = cmdBooks.Open();
ADORecordsetConstructionPtr spADORsC
_RecordsetPtr spRs(__uuidof(Recordset));
spADORsConst = spRs;
hr = spADORsConst-&put_Rowset((LPUNKNOWN)(cmdBooks.m_spRowset));
spRs-&Save(&books.xml&, adPersistXML);
HRESULT Xml2Rowset()
HRESULT hr = S_OK;
CdboBooks cmdB
hr = cmdBooks.OpenDataSource();
//load the ADO recordset
_RecordsetPtr spRs(__uuidof(Recordset));
hr = spRs-&Open(&books.xml&,&Provider=MSP&,adOpenForwardOnly,adLockReadOnly,adCmdFile);
ADORecordsetConstructionPtr spADORsC
//QI for ADORecordsetConstruction interface
spADORsConst = spRs;
//Create CCommand
hr = cmdBooks.CreateCommand(cmdBooks.m_session);
//hook up the rowset with ADO Recordset
spADORsConst-&get_Rowset((LPUNKNOWN*)&(cmdBooks.m_spRowset));
//in order to retrieve data, we have to bind
hr = cmdBooks.Bind();
//test the CCommand object out
while( cmdBooks.MoveNext() == S_OK)
printf(&%d
%s\n&, cmdBooks.m_id, cmdBooks.m_Title, cmdBooks.m_Publisher);
void dump_error(_com_error &e)
_bstr_t bstrSource(e.Source());
_bstr_t bstrDescription(e.Description());
// Print Com errors.
printf(&Error\n&);
printf(&\tCode = %08lx\n&, e.Error());
printf(&\tCode meaning = %s&, e.ErrorMessage());
printf(&\tSource = %s\n&, (LPCSTR) bstrSource);
printf(&\tDescription = %s\n&, (LPCSTR) bstrDescription);
说明有关的代码:
为简单起见,代码不会检查所有返回的 HRESULT。它是一种很好的做法,检查该 HRESULT,并使用 CDBErrorInfo/AtlTraceErrorRecords() 得到更具描述性的错误。在&Rowset2Xml () 函数,
hr = cmdBooks.Open();
调用以创建该 CCommand 并执行在选择语句,然后检索该 CRowset 与此 CCommand 相关联。或者,可以显式获得了 IRowset 回通过调用执行,如下所示:
CCommand&CAccessor&CdboBooksAccessor& &
hr = cmd.CreateCommand(session);
CComBSTR bsSQLsmd=OLESTR(&SELECT * FROM Books&);
CComPtr&ICommandText& spCommandT
hr = cmd.m_spCommand-&QueryInterface(&spCommandText);
if (SUCCEEDED(hr))
hr = spCommandText-&SetCommandText(DBGUID_SQL, bsSQLsmd);
CComPtr&IRowset& pIRowset = NULL;
hr = cmd.m_spCommand-&Execute(NULL, IID_IRowset, NULL, &cRowsAffected, (IUnknown**)&pIRowset);
6.csdn&http://bbs.csdn.net/topics/
7,http://blog.csdn.net/yuvmen/article/details/5879385
生成应用程序框架并初始化库环境
创建一个标准的应用程序,然后在使用数据库的函数中初始化库(因为库是一个库)。
初始化库环境
程序最后要调用;释放程序占用的资源。
注意!!!不要多次关闭!!!!!!!!!!!!
引入库文件
使用前必须在工程的文件最后用直接引入符号#引入库文件,以使编译器能正确编译。代码如下:
类的定义是作为一种资源存储在)中,在其内部称为类型库。类型库描述了自治接口,以及++使用的接口。当使用#指令时,在运行时++需要从中读取这个类型库,并以此创建一组++头文件。这些头文件具有和扩展名,读者可以在项目的目录下找到这两个文件。在++程序代码中调用的类要在这些文件中定义。
程序的第三行指示对象不使用名称空间。在有些应用程序中,由于应用程序中的对象与中的对象之间可能会出现命名冲突,所以有必要使用名称空间。如果要使用名称空间,则可把第三行程序修改为:。第四行代码将中的文件结束更名为,以避免与定义了自己的的其他库冲突。
.利用智能指针进行数据库操作
在头文件中定义两个智能指针类实例并在对话框中加入一个。
库包含三个智能指针、和。
通常被用来创建一个数据连接或执行一条不返回任何结果的语句,如一个存储过程。
返回一个记录集。它提供了一种简单的方法来执行返回记录集的存储过程和语句。在使用接口时,可以利用全局接口,也可以在接口里直接使用连接串。是一个记录集对象。与以上两种对象相比,它对记录集提供了更多的控制功能,如记录锁定、游标控制等。
在使用程序的事件响应中加入以下代码
初始化指针
初始化指针
连接叫作的数据源
注意:这是连接不需要用户或密码的函数
否则形式为
执行语句得到一个记录集把其指针赋值给
:动态乐观封锁法:文本查询语句
遍历所有记录
取纪录字段值方式之一
得到字段的值
将该值加入到列表控件中
取纪录字段值方式之二
数据类型转换
姓名年龄生日
转到下一条纪录
注意!!!不要多次关闭!!!!否则会出错
程序中通过和转换对象和++类型的数据类封装了自治数据类型。在中使用类要比直接使用数据类型容易得多。
好,编译后该程序就能运行了,但记住运行前要创建一个叫的数据源。该程序将把表中的字段值显示在列表控件中。
.执行命令并取得结果记录集
为了取得结果记录集,我们定义一个指向对象的指针
并为其创建对象的实例
命令的执行可以采用多种形式,下面我们一进行阐述。
利用对象的方法执行命令
方法的原型如下所示
其中是命令字串,通常是命令。
参数是操作完成后所影响的行数
参数表示中内容的类型,可以取如下值之一:
表明是文本命令
表明是一个表名
表明是一个存储过程
执行完后返回一个指向记录集的指针,下面我们给出具体代码并作说明。
执行命令:创建表格包含四个字段整形字符串整形日期型
往表格里面添加记录
将所有记录字段的值加一
执行统计命令得到包含记录条数的记录集
取得第一个字段的值放入变量
上两句可以写成—
关闭记录集
共有条记录
显示当前记录条数
利用对象来执行命令
定义为无参数
非常关键的一句,将建立的连接赋值给它
执行命令,取得记录集
在这段代码中我们只是用对象来执行了查询语句,对象在进行存储过程的调用中能真正体现它的作用。下次我们将详细介绍。
直接用对象进行查询取得记录集
定义连接字符串
要执行的语句
初始化对象
省略对返回值的判断
方法的原型是这样的
①是数据查询字符串
②是已经建立好的连接(我们需要用对象指针来构造一个对象
③光标类型,它可以是以下值之一请看这个枚举结构
不作特别指定
前滚静态光标。这种光标只能向前浏览记录集,比如用向前滚动这种方式可以提高浏览速度。但诸如都不能使用
采用这种光标的记录集看不到其它用户的新增、删除操作,但对于更新原有记录的操作对你是可见的。
动态光标。所有数据库的操作都会立即在各用户记录集上反应出来。
静态光标。它为你的记录集产生一个静态备份,但其它用户的新增、删除、更新操作对你的记录集来说是不可见的。
④锁定类型,它可以是以下值之一,请看如下枚举结构:
只读记录集
悲观锁定方式。数据在更新时锁定其它所有动作,这是最安全的锁定机制
乐观锁定方式。只有在你调用方法时才锁定记录。在此之前仍然可以做数据的更新、插入、删除等动作
,乐观分批更新。编辑时记录不会锁定,更改、插入及删除是在批处理模式下完成。
⑤可以取如下值之一:
表明是文本命令
表明是一个表名
表明是一个存储过程
记录集的遍历、更新
根据我们刚才通过执行命令建立好的表,它包含四个字段
以下的代码实现:打开记录集,遍历所有记录,删除第一条记录,添加三条记录,移动光标到第二条记录,
更改其年龄,保存到数据库。
取得第列的值从开始计数,
你也可以直接给出列的名称,如下一行
取得字段的值
在方式下的窗口输出记录集中的记录
姓名年龄生日
移到下一条记录
移到首条记录
删除当前记录
添加三条新记录并赋值
添加新记录
从第一条记录往下移动一条记录即移动到第二条记录处
修改其年龄
保存到库中
备注:多次查询可把查询过程做成一个函数让获得连接指针查询结果
:动态乐观封锁法:文本查询语句
出错处理:
——没有找到目标表
——目标表已经存在
表已经存在
是一组用于和数据源进行交互的面向对象类库。
的主要对象有哪些?
用于连接到数据库和管理对数据库的事务;
用于对数据库发出命令;
用于从数据源读取只进数据记录流;
用于对单层数据、数据和关系数据进行存储、远程处理和编程;
用于将数据推入,并使数据与数据库保持一致;
快速入门:
用轻松实现:
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:122596次
积分:2839
积分:2839
排名:第4719名
原创:150篇
转载:140篇
评论:17条
(6)(3)(3)(8)(3)(1)(4)(8)(3)(10)(5)(3)(21)(6)(4)(6)(11)(11)(8)(3)(13)(15)(18)(20)(12)(13)(8)(1)(6)(16)(5)(1)(5)(4)(7)(1)(4)(13)(3)}

我要回帖

更多关于 postgresql忘记密码 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信