数据库应用程序肯定离不开SQL语句的应用,而平常用得最多的应该是TQuery,TADOQuery一类的控件,其他的还有TUpdateSQL,TADOCommand等控件。SQL语句就是在以上两种控件的SQL属性中设置。SQL属性的数据类型是TStringList。可以用SQL.Text、SQL.Add()、SQL.Clear等方式进行操作。
简单来说就是将一个字符串赋值给SQL属性,实现数据的操作。这个字符串就是SQL语句。例如:表Table1,有字段 A(int) B(varchar2) C(long row)。如果要插入一条记录,其中A=2,B='pic'。在DBMS中可以执行
SQL语句的地方写入INSERT INTO Table1(A,B) VALUES(2,'pic')。 但在Delphi的控件中有些地方要注意。B本身是字符串类型,对其赋值要加引号。而SQL.Text属性是String类型,所以在Delphi中要这样写 SQL.Text:='INSERT INTO Table1(A,B) VALUES (2,''pic'')'; 值'pic'前后都要用两个单引号。因为AB的值很多时候是在运行时获得,所以可以这样写 SQL.Text:='INSERT INTO Table1(A,B) VALUES ('+IntToStr(intA)+','''+strB+''')'; intA ,strB都是变量。但如果strB的值时带有单引号的话,问题就会出现了,因为这条SQL语句最终会发送到DBMS中执行,strB字符串所带的单引号会把语句的机构破坏,产生很多无法预计的后果。
上面的语句带了太多的引号,可读性太差,所以可以稍微改一下。Delphi提供了QuotedStr函数,该函数返回一个两端带引号的字符串,对于原字符串中的单引号,函数会把转换成两个单引号。SQL.Text:='INSERT INTO Table1(A,B) VALUES ('+IntToStr(intA)+','+QuotedStr(strB)+')'; 但同样对于带单引号的问题仍然无法解决。可以看到上面Table1还有一个C字段是Long Raw类型的,又要如何赋值呢?
SQL参数就是最佳的解决方案了。SQL.Text:='INSERT INTO Table1(A,B,C) VALUES (:A,:B,:C)'; :A 和:B就是参数变量,在以后根据需要赋值
Query.ParamByName('A').AsInteger:=intA;
Query.ParamByName('B').AsString:=strB;
Query.ParamByName('C').LoadFromFile('C:a.jpg',ftBlob);
这样既可以灵活的设置各字段所需的值和数据类型,而且SQL语句的可读性得到很大的提高。对于字符串变量所带的单引号、百分比、星号等敏感的字符都可以自动进行转换。
|
请发表评论