首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

数据库编程里边使用Parameters和不使用的异同

2012-12-31 
数据库编程里面使用Parameters和不使用的异同。先看代码#include vcl.h#pragma hdrstop#include Unit1.h

数据库编程里面使用Parameters和不使用的异同。
先看代码

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
ADOQuery1->Close();
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add(  "select * from test..branch where branch = " +Edit1->Text );
ADOQuery1->Open();
}
//---------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
ADOQuery1->Close();
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add( "select * from test..branch where branch = :a ");
ADOQuery1->Parameters->ParamValues["a"] = Edit1->Text;
ADOQuery1->Open();
}


当Edit1 输入 1000 or 1=1 时,button查询出所有branch的结果, button2 报错:应用程序在当前操作中使用了错误类型的值。

可见两种写法并不一定能得到相同的结果,而且写法一可能造成注入。
以前我都用写法一,认为直接写简单,现在看来,有区别。
共享给大家看看。
这个代码同样适用其他语言,比如delphi,c#,php,perl什么的。
参考的一本书 SQL Hacks中的 Hacks 8.网上有chm版的
[解决办法]
我也是以前喜欢拼sql,现在都用参数了。
ParamValues代码整齐规范易读,还防注入。推荐。
[解决办法]
用参数代入的方式可以有效防范SQL注入攻击。

另外,SQL语句字符串的生成,用格式化最好,我现在比较反对用字符串拼接,影响可读性,并且容易出错。
[解决办法]
嗯,Sql格式化:Format('%d',[nCount])
[解决办法]
参数用1000 or 1=1 当然会类型错误了
[解决办法]
数据类型!

void __fastcall TForm1::Button2Click(TObject *Sender)
{
ADOQuery1->Close();
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add( "select * from test..branch where branch = :a ");
ADOQuery1->Parameters->ParamValues["a"] = Edit1->Text.ToIntDef(0);
ADOQuery1->Open();
}
[解决办法]
受教了,平常都是拼SQL,看来真的要考虑改成参数类型。

热点排行