Delphi中能否将Edit控件输入值作为表名执行SQL建表操作
问题根因
你当前的写法无法实现需求,这是SQL本身的限制:SQL参数仅支持传递数据值(比如字段写入值、查询条件值),不支持用来传递表名、列名这类数据库对象标识符。
你将表名作为参数传入时,数据库驱动会自动把参数值作为字符串处理,最终执行的SQL会变成类似Create Table '你的表名' (...)的格式,表名位置多了不符合语法的引号,你收到的incorrect syntax near @P1报错里的@P1就是驱动自动生成的参数占位符,数据库识别不了表名位置的占位符才会抛出语法错误。
正确实现方案
你需要通过动态拼接SQL的方式实现表名动态传入,注意必须对用户输入做严格的安全校验,避免SQL注入风险:
- 先编写表名校验逻辑,限制用户输入的表名仅允许使用字母、数字、下划线,过滤所有特殊字符、SQL关键字,也可以增加表名重复判断,避免重复建表报错
- 动态拼接建表SQL语句再执行,参考代码如下:
procedure TRyby_Form01.WyjazdyBTNClick(Sender: TObject); var Wyjazd : string; CreateTableSQL: string; begin Wyjazd := Trim(WyjazdEDT.Text); // 自定义校验逻辑,过滤非法输入 if not CheckTableNameValid(Wyjazd) then begin ShowMessage('表名不合法,请仅使用字母、数字、下划线,长度不超过30字符'); Exit; end; // 拼接建表语句 CreateTableSQL := Format( 'CREATE TABLE %s (' + 'Ryba CHAR(20), ' + 'Miara INT, ' + 'Waga DECIMAL(6,3), ' + 'Data DATE, ' + 'przyneta CHAR(60), ' + 'metoda CHAR(20))', [Wyjazd] ); wyjazdquery3.SQL.Text := CreateTableSQL; wyjazdquery3.ExecSQL; // 其余wyjazdquery4、wyjazdquery5如果也用到该动态表名,同样按拼接方式处理即可 // 其余业务逻辑... end;
注意:如果你的数据库对表名大小写敏感,或者需要支持带特殊字符的表名,可以在拼接时给表名加上对应数据库的标识符包裹符,比如MySQL用反引号`,SQL Server用方括号[]。
内容的提问来源于stack exchange,提问作者Jichał Murek
相关产品推荐
相关产品推荐

