C++ 封装ADO实现参数化SQLserver的增删查改
时间: 2024-03-03 12:49:05 浏览: 160
MFC+SQLSERVER2008
5星 · 资源好评率100%
好的,这是一个比较复杂的问题,我会尽量详细地回答你。
首先,我们需要明确一下,ADO是什么。ADO(ActiveX Data Objects)是一种Microsoft的数据访问技术,它提供了一种访问各种数据源的统一方式,包括SQL Server、Oracle、Access等等。使用ADO可以方便地进行数据库的操作,包括增、删、改、查等。
接下来,我们来看一下如何使用C++封装ADO来实现参数化SQL Server的增删查改。
1. 引入头文件和命名空间
首先,我们需要引入头文件和命名空间。头文件包括<comutil.h>和<ado.h>,命名空间为ADODB。代码如下:
```cpp
#include <comutil.h>
#include <ado.h>
using namespace ADODB;
```
2. 建立连接
建立连接是数据库操作的第一步。我们可以定义一个函数来建立连接,代码如下:
```cpp
_ConnectionPtr m_pConnection; // 连接对象
void ConnectDatabase()
{
try
{
::CoInitialize(NULL); // 初始化COM库
m_pConnection.CreateInstance(__uuidof(Connection)); // 创建连接对象
// 设置连接字符串,这里的“test”是数据库名称,你需要根据实际情况修改
m_pConnection->ConnectionString = _bstr_t("Provider=SQLOLEDB.1;Data Source=(local);Initial Catalog=test;Integrated Security=SSPI;");
m_pConnection->Open("", "", "", adConnectUnspecified); // 建立连接
}
catch (_com_error e)
{
// 连接失败,输出错误信息
printf("Connect database failed: %s\n", (char*)e.Description());
}
}
```
这里的连接字符串中,Data Source是数据库服务器名称,Initial Catalog是数据库名称,Integrated Security=SSPI表示使用Windows身份验证方式登录。如果需要使用用户名和密码登录,可以将Integrated Security设置为False,并且在ConnectionString中添加User ID和Password属性。
3. 执行SQL语句
建立连接之后,我们就可以执行SQL语句了。我们可以定义一个函数来执行SQL语句,代码如下:
```cpp
_RecordsetPtr m_pRecordset; // 记录集对象
void ExecuteSQL(const char* szSQL)
{
try
{
m_pRecordset.CreateInstance(__uuidof(Recordset)); // 创建记录集对象
m_pRecordset->Open(_bstr_t(szSQL), m_pConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText); // 执行SQL语句
}
catch (_com_error e)
{
// 执行失败,输出错误信息
printf("Execute SQL failed: %s\n", (char*)e.Description());
}
}
```
这里的szSQL是SQL语句,例如:
```cpp
const char* szSQL = "SELECT * FROM Table1";
```
4. 参数化SQL语句
为了防止SQL注入攻击,我们需要对SQL语句进行参数化处理。我们可以定义一个函数来实现参数化SQL语句,代码如下:
```cpp
_CommandPtr m_pCommand; // 命令对象
_ParameterPtr m_pParameter; // 参数对象
void ExecuteParamSQL(const char* szSQL, const char* szName, const char* szValue)
{
try
{
m_pCommand.CreateInstance(__uuidof(Command)); // 创建命令对象
m_pCommand->ActiveConnection = m_pConnection; // 设置连接对象
m_pCommand->CommandText = _bstr_t(szSQL); // 设置SQL语句
m_pParameter = m_pCommand->CreateParameter(_bstr_t(szName), adVarChar, adParamInput, strlen(szValue), _variant_t(szValue)); // 创建参数对象
m_pCommand->Parameters->Append(m_pParameter); // 添加参数对象
m_pRecordset = m_pCommand->Execute(NULL, NULL, adCmdText); // 执行命令并返回记录集对象
}
catch (_com_error e)
{
// 执行失败,输出错误信息
printf("Execute param SQL failed: %s\n", (char*)e.Description());
}
}
```
这里的szName是参数名称,szValue是参数值,例如:
```cpp
const char* szSQL = "SELECT * FROM Table1 WHERE Name = ?";
const char* szName = "Name";
const char* szValue = "John";
ExecuteParamSQL(szSQL, szName, szValue);
```
5. 增删查改
最后,我们来看一下如何进行增删查改操作。
增:
```cpp
const char* szSQL = "INSERT INTO Table1 (Name, Age) VALUES (?, ?)";
const char* szName = "Name";
const char* szValue1 = "John";
const char* szAge = "Age";
const char* szValue2 = "20";
ExecuteParamSQL(szSQL, szName, szValue1, szAge, szValue2);
```
删:
```cpp
const char* szSQL = "DELETE FROM Table1 WHERE Name = ?";
const char* szName = "Name";
const char* szValue = "John";
ExecuteParamSQL(szSQL, szName, szValue);
```
查:
```cpp
const char* szSQL = "SELECT * FROM Table1 WHERE Age > ?";
const char* szName = "Age";
const char* szValue = "18";
ExecuteParamSQL(szSQL, szName, szValue);
while (!m_pRecordset->adoEOF)
{
// 输出记录集中的数据
printf("%s\t%d\n", (char*)_bstr_t(m_pRecordset->Fields->GetItem("Name")->Value), m_pRecordset->Fields->GetItem("Age")->Value.intVal);
m_pRecordset->MoveNext();
}
```
改:
```cpp
const char* szSQL = "UPDATE Table1 SET Age = ? WHERE Name = ?";
const char* szName1 = "Age";
const char* szValue1 = "30";
const char* szName2 = "Name";
const char* szValue2 = "John";
ExecuteParamSQL(szSQL, szName1, szValue1, szName2, szValue2);
```
以上就是C++封装ADO实现参数化SQL Server的增删查改的方法。希望对你有帮助!
阅读全文