已经不使用Visual C++多年了,最近应邀为朋友修改一个现存的VC++操作SQL Server2000的老程序,所以重新回顾了一下基本的代码格式。发布到这里,以便于以后再用到时迅速复习。
1 头文件stdafx.h
// stdafx.h : 标准系统包含文件的包含文件,
// 或是经常使用但不常更改的
// 特定于项目的包含文件
//
#pragma once
#include "targetver.h"
#define WIN32_LEAN_AND_MEAN // 从 Windows 头文件中排除极少使用的信息
// Windows 头文件:
#include <windows.h>
// C 运行时头文件
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <tchar.h>
// TODO: 在此处引用程序需要的其他头文件
#import "C:/Program Files (x86)/Common Files/System/ado/msado15.dll" no_namespace rename("EOF", "adoEOF") rename("BOF", "FirstOfFile")
2 实现文件adocpp.cpp
// ADOCPP.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
_ConnectionPtr pConnection;
_CommandPtr pCmd;
_RecordsetPtr pRecord;
int _tmain(int argc, _TCHAR* argv[])
{
CoInitialize(NULL);
try
{
HRESULT hr;
//创建连接实例
hr = pConnection.CreateInstance("ADODB.Connection");
if(SUCCEEDED(hr))
{
//连接数据库
_bstr_t connectStr = "Provider=SQLOLEDB;Data Source=服务器IP;Initial Catalog=数据库名;User ID=用户名;Password=密码";
hr = pConnection->Open(connectStr, "", "", adModeUnknown);
_variant_t vAffected;
_bstr_t sql;
//执行查询
pRecord = pConnection->Execute("select top 10 * from 表名", &vAffected, adCmdText);
//枚举查询结果集
_TCHAR buffer[100];
_variant_t vID;
_variant_t vTitle;
while(!pRecord->adoEOF)
{
vID = pRecord->GetCollect(_variant_t((long)0)); //按照序号取列值
vTitle = pRecord->GetCollect("列名"); //按照列名称取列值
if(vID.vt != NULL){
wsprintf(buffer, _T("%d-%s\r\n"), vID.intVal, (LPCWSTR)(_bstr_t)vTitle); //整数,字符串
wprintf(buffer);
}
pRecord->MoveNext();
}
//执行更新(如果影响行数为0, 不会抛出异常)
sql = "update lyb set name='hello' where ID=3";
pConnection->Execute(sql, &vAffected, adCmdText);
//执行插入
sql = "insert into 表名(name, neirong) values('test', 'test')";
pConnection->Execute(sql, &vAffected, adCmdText);
//执行删除(如果影响行数为0, 不会抛出异常)
sql = "delete from lyb where id=20";
pConnection->Execute(sql, &vAffected, adCmdText);
wsprintf(buffer, _T("%d"), vAffected.intVal);
wprintf(buffer);
//关闭连接和结果集
pRecord->Close();
pConnection->Close();
}
else
{
printf("ADO组件加载失败");
}
CoUninitialize();
}
catch(_com_error e) //SQL系统报错(如语法错误、违反约束),才会产生异常,用户程序逻辑问题,要根据影响行数来判定
{
MessageBox(NULL,e.Description(), _T("异常"), MB_OK);
}
return 0;
}