delphi中create的用法一直不是很清楚 有没有系统全面的介绍

Create是类的构造(constructor)函数,每个类都有构造函数,通过调它创建类的实例,比如:
var obj:TObject;
begin
  obj:=TObject.Create;//创建
  try
    //使用....
  finally
    obj.free;//释放
  end;
end;

当你写一个类,它会默认继承祖先类的构造函数,不过你可以把祖先的盖掉,加上自己的参数,比如:
TmyObj=Class(TObject)
public
  constructor Create(const s:string);//覆盖祖先的构造函数
  destructor Destroy;override;
end;
//...
constructor TmyObj.Create(const s:string);
begin
  inherited;//调用祖先的构造
  //处理自己的内容。。。
end;

每个类除了有构造函数,还有个析构函数(destructor),类释放的时候就会调用。只能简单的说这么多,还有不明白的找本基础的书看看吧

转自: http://zhidao.baidu.com/question/132219700.html
<think>好的,我现在需要回答用户关于Delphi中QuotedStr函数的用法的问题。用户之前询问过动态构建SQL语句时遇到的问题,现在他想了解QuotedStr的具体用法。 首先,我需要确认QuotedStr的作用。记得在Delphi中,QuotedStr用于给字符串添加单引号,并处理其中的单引号转义,这对防止SQL注入很重要。但用户可能不太清楚具体细节,所以需要详细解释。 接下来,用户可能是在构建SQL查询时遇到了问题,特别是字符串值的处理。之前他提到在LIKE子句中使用QuotedStr,所以应该强调在处理用户输入时正确使用该函数的重要性。 需要分步骤解释QuotedStr的功能:添加引号、转义内部引号、处理空值。同时,要比较不正确使用的情况,比如直接拼接字符串可能导致的错误或安全问题。 然后,用户可能想知道如何正确使用这个函数,所以需要给出示例,比如在INSERT或WHERE语句中的用法。同时,要注意不同数据库的引号习惯,比如MySQL可能用双引号,但这里假设使用的是标准单引号。 还要提到参数化查询作为更安全的替代方法,但指出QuotedStr在动态SQL中的必要性,特别是在字段名无法参数化的情况下。结合之前的回答,可能需要再次强调白名单验证的重要性,而QuotedStr主要用于值部分。 需要检查是否有常见的错误场景,比如忘记使用QuotedStr导致语法错误或注入漏洞。同时,指出虽然QuotedStr处理了引号,但并不能完全防止SQL注入,特别是如果字段名或表名未经验证的话。 最后,总结QuotedStr的最佳实践,并建议结合其他安全措施,如参数化查询和输入验证,以确保全面的安全性。</think>### Delphi 中 `QuotedStr` 的用法详解 `QuotedStr` 是 Delphi 的 `SysUtils` 单元中的核心字符串处理函数,**专为安全构建 SQL 语句设计**。其核心作用是通过规范化的引号包裹和转义处理,防止 SQL 注入并确保语法正确性。 --- #### 一、基础功能解析 函数原型: ```delphi function QuotedStr(const S: string): string; ``` **执行三步操作**: 1. **添加外层单引号** 将输入字符串包裹在单引号中:`'输入内容'` 2. **转义内部单引号** 将字符串内的单引号 `'` 转义为双单引号 `''`(符合 SQL 标准) 示例: `It's OK` → `'It''s OK'` 3. **空值特殊处理** 输入空字符串时生成 `''`(而非 `'''`) --- #### 二、典型应用场景 ##### 场景 1:WHERE 条件值处理 ```delphi // 用户输入:SearchBox.Text = "O'Neil" strSQL := 'SELECT * FROM users WHERE name = ' + QuotedStr(SearchBox.Text); // 生成:SELECT * FROM users WHERE name = 'O''Neil' ``` ##### 场景 2:INSERT 语句值处理 ```delphi strSQL := 'INSERT INTO products (name) VALUES (' + QuotedStr('Delphi''s Guide') + ')'; // 生成:INSERT INTO products (name) VALUES ('Delphi''s Guide') ``` ##### 场景 3:LIKE 模糊查询(需特别注意) ```delphi // 正确用法(包含通配符) strSQL := 'WHERE address LIKE ' + QuotedStr('%' + SearchText + '%'); // 若 SearchText = "CA",生成:WHERE address LIKE '%CA%' ``` --- #### 三、与直接拼接的对比实验 | 用户输入 | 直接拼接结果 | QuotedStr 处理结果 | 是否安全/正确 | |-----------------|------------------------------|------------------------------|--------------| | `test` | `WHERE name = test` | `WHERE name = 'test'` | ❌ 语法错误 | | `O'Neil` | `WHERE name = O'Neil` | `WHERE name = 'O''Neil'` | ❌ 注入漏洞 | | `'; DROP TABLE` | `WHERE name = '; DROP TABLE` | `WHERE name = '''; DROP TABLE` | ✅ 安全 | --- #### 四、进阶使用技巧 1. **数值型数据转换** 数字类型应先转换,避免多余引号: ```delphi IntToStr(Count) // 直接转换为字符串数字 FloatToStr(Price) // 浮点数转换 ``` 2. **日期类型处理** 使用特定格式函数(根据数据库要求): ```delphi QuotedStr(FormatDateTime('yyyy-mm-dd', Now)) // → '2023-08-20' ``` 3. **二进制数据编码** 对 BLOB 数据需先进行十六进制编码: ```delphi '0x' + BinToHexString(data) // MySQL 二进制格式 ``` --- #### 五、参数化查询的对比优势 虽然 `QuotedStr` 是有效的基础防护手段,但更推荐使用参数化查询: ```delphi with TADOQuery.Create(nil) do try SQL.Text := 'SELECT * FROM users WHERE name = :name'; Parameters.ParamByName('name').Value := SearchBox.Text; // 自动处理转义 Open; finally Free; end; ``` **优势对比**: - ✅ 完全杜绝 SQL 注入 - ✅ 自动处理数据类型转换 - ✅ 提升查询性能(数据库可缓存执行计划) --- #### 六、常见错误排查 1. **多层嵌套引号** 错误写法: ```delphi QuotedStr('"value"') // → '"value"'(外部单引号 + 内部双引号) ``` 正确处理方法: ```delphi 'WHERE json_field->>"$.key" = ' + QuotedStr(Value) // MySQL JSON 查询 2. **字符集问题** 当包含非 ANSI 字符时,确保数据库连接字符集设置正确: ```delphi // 在连接字符串中添加: 'CharacterSet=utf8;' // 针对 MySQL ``` --- #### 七、最佳实践总结 1. **值处理三原则**: - 文本/日期 → 必用 `QuotedStr` - 数字 → 直接转换不用引号 - 字段/表名 → 白名单校验(不可用 QuotedStr) 2. **防御组合策略**: ```mermaid graph TD A[用户输入] --> B{输入验证} B -->|通过| C[白名单校验字段名] C --> D[数值直接转换] C --> E[文本使用QuotedStr] E --> F[参数化查询] F --> G[执行SQL] ``` 通过正确使用 `QuotedStr` 配合其他安全措施,可构建既灵活
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值