CADOConn conn; std::wstring strConn = L"Provider=SQLOLEDB;Data Source=127.0.0.1;Initial Catalog=SQL_PLC;User Id=sa;Password=bme12345;"; std::wstring strSQL; if (!conn.Open(strConn)) { std::cerr << "Failed to connect to database!" << std::endl; return -1; } // 插入数据 strSQL = L"INSERT INTO plcdata (出水压力,瞬时流量,总流量,当日运行次数,运行总次数) VALUES (?,?,?,?,?)"; if (!conn.Add(strSQL)) { std::cerr << "Failed to insert data!" << std::endl; } 修改程序参数化查询
时间: 2024-03-03 08:48:11 浏览: 142
好的,针对这段代码,我可以给出如下的修改建议:
1. 在进行 SQL 查询或插入操作时,应该使用参数化查询语句,以避免 SQL 注入攻击。具体做法是将 SQL 语句中的变量部分用占位符(例如 "?")代替。
2. 对于参数化查询语句中的每个占位符,都需要指定对应的参数值。这样可以保证 SQL 查询操作的正确性和安全性。
下面是修改后的代码示例:
```
CADOConn conn;
std::wstring strConn = L"Provider=SQLOLEDB;Data Source=127.0.0.1;Initial Catalog=SQL_PLC;User Id=sa;Password=bme12345;";
std::wstring strSQL;
if (!conn.Open(strConn))
{
std::cerr << "Failed to connect to database!" << std::endl;
return -1;
}
// 插入数据
strSQL = L"INSERT INTO plcdata (出水压力,瞬时流量,总流量,当日运行次数,运行总次数) VALUES (?,?,?,?,?)";
CADOCommand cmd;
cmd.SetCommandText(strSQL.c_str());
// 设置参数值
cmd.AddParameter(L"出水压力", adDouble, CADOParameterDirection::paramInput, 0.0);
cmd.AddParameter(L"瞬时流量", adDouble, CADOParameterDirection::paramInput, 0.0);
cmd.AddParameter(L"总流量", adDouble, CADOParameterDirection::paramInput, 0.0);
cmd.AddParameter(L"当日运行次数", adInteger, CADOParameterDirection::paramInput, 0);
cmd.AddParameter(L"运行总次数", adInteger, CADOParameterDirection::paramInput, 0);
// 执行查询
if (!conn.ExecuteCommand(&cmd))
{
std::cerr << "Failed to insert data!" << std::endl;
}
```
在这个修改后的代码中,我们使用了 `CADOCommand` 类来代替 `conn.Add()` 方法,这个类提供了更加灵活的参数化查询功能。我们首先将 SQL 语句赋值给 `cmd` 对象的 `CommandText` 属性,然后使用 `AddParameter()` 方法为每个占位符指定参数名、参数类型、参数方向和参数值。最后,通过 `conn.ExecuteCommand()` 方法执行 SQL 查询操作。
阅读全文