描述:
现在问题是能连上数据库,但是删除记录和修改记录存在问题,删除记录时,返回值hr为0表示成功,但是数据库里记录没有删除,不知道问题出在哪里,麻烦大侠帮帮看看,谢谢
#define WIN32_LEAN_AND_MEAN
#define _WIN32_WINNT 0x0501
#define WINVER 0x0501
#include <Windows.h>
#include <ole2.h>
#include <TCHAR.h>
#define COM_NO_WINDOWS_H //如果已经包含了Windows.h或不使用其他Windows
//库函数时
#define DBINITCONSTANTS
#define INITGUID
#define OLEDBVER 0x0270
#include <oledb.h>
#include <oledberr.h>
#include <msdasc.h>
#define GRS_ROUNDUP_AMOUNT 8
#define GRS_ROUNDUP_(size,amount) (((ULONG)(size)+((amount)-1))&~((amount)-1))
#define GRS_ROUNDUP(size) GRS_ROUNDUP_(size, GRS_ROUNDUP_AMOUNT)
#define GRS_ALLOC(size) HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,size)
#define GRS_FREE(p) if( NULL != (p) ){HeapFree(GetProcessHeap(),0,p);(p) = NULL;}
#define GRS_COM_RELEASE(p) if(p){(p)->Release();(p)=NULL;}
#define GRS_COM_CHECK(a) if(FAILED(a)){::DebugBreak();goto GRS_CLEARUP;}
#define GRS_USE_IDBCREATECOMMAND //使用IDBCreateCommand接口创建Session对象 注释后使用习惯的IOpenRowset接口
//#define GRS_USE_IMULTIPLERESULTS //使用IMultipleResults接口得到结果集 注释后直接使用
int WINAPI _tWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow)
{
::CoInitialize(NULL);
IDBPromptInitialize* pIDBPromptInitialize = NULL;
IDBInitialize* pIDBInitialize = NULL;
IDBCreateSession* pIDBCreateSession = NULL;
IOpenRowset* pIOpenRowSet = NULL;
IDBCreateCommand* pIDBCreateCommand = NULL;
ICommandText* pICommandText = NULL;
ICommandProperties* pICommandProperties = NULL;
IMultipleResults* pIMultipleResults = NULL;
IRowset* pIRowset = NULL;
IColumnsInfo* pIColumnsInfo = NULL;
IAccessor* pIAccessor = NULL;
IRowsetChange* pIRowsetChange = NULL;
IRowsetUpdate* pIRowsetUpdate = NULL;
DBPROPSET ps[1];
DBPROP prop[3];
//==============================================================================================
//注意改写这个SQL语句,首先保证SQL语句是正确的
TCHAR* pSQL = _T("SELECT name,id FROM bb");
//==============================================================================================
ULONG cColumns = 0;
DBCOLUMNINFO* rgColumnInfo = NULL;
LPWSTR pStringBuffer = NULL;
DBROWCOUNT cRowsAffected = 0;//注意不要被这个参数迷惑大多数情况下它是没用的
//并不能通过它知道结果集中实际包含多少行
ULONG iCol = 0;
ULONG dwOffset = 0;
DBBINDING* rgBindings = NULL;
HACCESSOR phAccessor = NULL;
void* pData = NULL;
ULONG cRowsObtained = 0;
HROW* rghRows = NULL;
ULONG iRow = 0;
LONG cRows = 10;//一次读取10行
DBROWSTATUS pdwStatus = 0; //行状态 实际就是DWORD类型
void* pCurData = NULL;
void* pNewData = NULL;
HROW hNewRows = NULL;
HRESULT hr;
DWORD dwUpdateRows;
HROW *pUpRow;
//============================================================================================================
//1、初始化部分,数据库连接
GRS_COM_CHECK(CoCreateInstance(CLSID_DataLinks, NULL, CLSCTX_INPROC_SERVER,
IID_IDBPromptInitialize, (void **)&pIDBPromptInitialize));
//下面这句将弹出前面所说的对话框
GRS_COM_CHECK(pIDBPromptInitialize->PromptDataSource(NULL, ::GetDesktopWindow(),
DBPROMPTOPTIONS_PROPERTYSHEET, 0, NULL, NULL, IID_IDBInitialize,
(IUnknown **)&pIDBInitialize));
GRS_COM_CHECK(pIDBInitialize->Initialize());//根据对话框采集的参数连接到指定的数据库
//============================================================================================================
//============================================================================================================
//2、创建事务部分
GRS_COM_CHECK( pIDBInitialize->QueryInterface(IID_IDBCreateSession, (void**)&pIDBCreateSession) );
//创建一个IOpenRowset接口 或者直接创建一个IDBCreateCommand 接口
#ifdef GRS_USE_IDBCREATECOMMAND
//使用IDBCreateCo