【VC开源代码栏目提醒】:文章导读:在新的一年中,各位网友都进入紧张的学习或是工作阶段。网学会员整理了VC开源代码-ADOWin32ConsoleRDSCreateRecordset.cpp的相关内容供大家参考,祝大家在新的一年里工作和学习顺利!
// ADOWin32ConsoleRDSCreateRecordset.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stdio.h>
#include <tchar.h>
#include <objbase.h>
#import "c:\program files\common files\system\ado\msado15.dll" rename("EOF", "adoEOF") rename("BOF", "adoBOF")
#import "c:\program files\common files\system\msadc\msadco.dll"
void dump_com_error(_com_error &e)
{
_tprintf(_T("Exception!\n"));
_tprintf(_T("\a\tCode = %08lx\n"), e.Error());
_tprintf(_T("\a\tCode meaning = %s\n"), e.ErrorMessage());
_bstr_t bstrSource(e.Source());
_bstr_t bstrDescription(e.Description());
_tprintf(_T("\a\tSource = %s\n"), (LPCTSTR) bstrSource);
_tprintf(_T("\a\tDescription = %s\n"), (LPCTSTR) bstrDescription);
}
void CreateRecordset(_bstr_t FieldNames[], short iFieldCount, ADODB::_RecordsetPtr& pRecordset)
{
// Place and Placeholder are for putting stuff into Safearrays
// You load the object into Placeholder, and then set Place
// to the index of the element that you want to fill.
short i;
long Place; //Index
VARIANT Placeholder;
HRESULT hRes;
// 创建Array of Pointers to Field Safe Arrays,每一个字段一个Array
SAFEARRAY FAR** apsaField = new SAFEARRAY FAR*[iFieldCount];
//声明字段 Safe Array边界
SAFEARRAYBOUND sabField[1]; // 一维数组
sabField[0].cElements = 4; // 数组中元素的个数
sabField[0].lLbound = 0; //数组元素的起始计数
//所有字段的数组都是相同的,下面的for循环填出每一个字段的数组,同时程序中
//设置每个字段的类型是相同的adVarChar,这样便于批处理
for (i = 0; i < iFieldCount; i++)
{
//创建字段数组
apsaField[i] = SafeArrayCreate(VT_VARIANT, 1, sabField);
//每个字段数组必须是四个元素,并且是四个类型(VT_BSTR, VT_I2,
// VT_I2, and VT_BOOL)中的一种
// 字段名字
Place = 0;
VariantInit(&Placeholder);
Placeholder.vt = VT_BSTR;
Placeholder.bstrVal = SysAllocString(FieldNames[i]);
hRes = SafeArrayPutElement(apsaField[i], &Place, &Placeholder);
if (hRes != S_OK)
{
LPCTSTR lpszError = "Error Field Name";
}
VariantClear(&Placeholder);
// 字段类型
Place = 1;
VariantInit(&Placeholder);
Placeholder.vt = VT_I2; // Type of this variant, NOT the type of the Field
Placeholder.lVal = 200; // adVarchar
hRes = SafeArrayPutElement(apsaField[i], &Place, &Placeholder);
if (hRes != S_OK)
{
LPCTSTR lpszError = "Error Field Type";
}
VariantClear(&Placeholder);
// 字段长度
Place = 2;
VariantInit(&Placeholder);
Placeholder.vt = VT_I2;
Placeholder.lVal = 2000;
hRes = SafeArrayPutElement(apsaField[i], &Place, &Placeholder);
if (hRes != S_OK)
{
LPCTSTR lpszError = "Error Field Length";
}
VariantClear(&Placeholder);
// Field Not Null Constraint
Place = 3;
VariantInit(&Placeholder);
Placeholder.vt = VT_BOOL;
Placeholder.boolVal = VARIANT_FALSE;
hRes = SafeArrayPutElement(apsaField[i], &Place, &Placeholder);
if (hRes != S_OK)
{
LPCTSTR lpszError = "Error Field Not Null Constraint";
}
VariantClear(&Placeholder);
}
// 声明 Record Safe Array 边界
SAFEARRAYBOUND sabRecord[1];
sabRecord[0].cElements = iFieldCount;
sabRecord[0].lLbound = 0;
//创建Record Safe Array,对于Recordset来说是一个Schema Array
SAFEARRAY* psaRecord;
psaRecord = SafeArrayCreate(VT_VARIANT, 1, sabRecord);
//添加字段Safe Arrays到Record Safe Array
for (i = 0; i < iFieldCount; i++)
{
Place = (long) i;
VariantInit(&Placeholder);
Placeholder.vt = VT_ARRAY | VT_VARIANT;
Placeholder.parray = apsaField[i];
hRes = SafeArrayPutElement(psaRecord, &Place, &Placeholder);
if (hRes != S_OK)
{
LPCTSTR lpszError = "Add Field to to Record";
}
VariantClear(&Placeholder);
}
//在Variant结构中设置Record Safe Array
_variant_t varRecord;
varRecord.vt = VT_ARRAY | VT_VARIANT;
varRecord.parray = psaRecord;
try
{
// RDS 1.5
//RDS::DIBindMgrPtr pDataControl(__uuidof(RDS::DataControl));
// RDS 2.0
RDS::IBindMgrPtr pDataControl(__uuidof(RDS::DataControl));
pRecordset = pDataControl->CreateRecordSet((const VARIANT&) varRecord);
}
catch (_com_error &e)
{
dump_com_error(e);
}
//销毁Field Safe Arrays和Array of Pointers to Field Safe Arrays
delete [] apsaField;
}
//添加记录集
void AddRecord(_variant_t FieldValues[], short iFieldCount, ADODB::_RecordsetPtr pRecordset)
{
pRecordset->AddNew();
for (short i = 0; i < iFieldCount; i++)
{
pRecordset->Fields->Item[i]->Value = FieldValues[i];
}
}
//显示记录集的内容
void ReadRecordset(ADODB::_RecordsetPtr pRecordset)
{
pRecordset->MoveFirst();
while (!pRecordset->adoEOF)
{
for (short i = 0; i < pRecordset->Fields->Count; i++)
{
_bstr_t bstrName = pRecordset->Fields->Item[i]->Name;
_variant_t varValue = pRecordset->Fields->Item[i]->Value;
_bstr_t bstrValue = (_bstr_t) varValue;
LPCTSTR lpszName = (LPCTSTR) bstrName;
LPCTSTR lpszValue = (LPCTSTR) bstrValue;
if(i==0)
_tprintf(_T("\n"));
_tprintf(_T("%s: %s\n"), lpszName, lpszValue);
}
pRecordset->MoveNext();
}
}
int _tmain(int argc, _TCHAR* argv[])
{
HRESULT hResult = CoInitialize(NULL);
short iFieldCount;
//创建一个具有两个字段的记录集
iFieldCount = 2;
try
{
_bstr_t FN1[2]; //字段名字
_variant_t FV1[2]; //字段值
ADODB::_RecordsetPtr pRS1;
FN1[0] = "CompanyName";
FN1[1] = "TickerSymbol";
//创建记录集
CreateRecordset(FN1, iFieldCount, pRS1);
//添加一条记录
FV1[0] = "Phillip Morris";
FV1[1] = "MO";
AddRecord(FV1, iFieldCount, pRS1);
//显示记录集的内容
ReadRecordset(pRS1);
pRS1->Close();
pRS1.Release();
}
catch (_com_error &e)
{
dump_com_error(e);
}
::CoUninitialize();
}
上一篇:
ADOWin32ConsolePropertyItem.cpp
下一篇:
法律专业开题报告范文