发现个奇怪问题,插入mssql数据库的

stephenchern 2016-05-25 10:04:47
将“设备” 二字 直接写在字符串上 可以执行成功
SqlStr := 'insert into db_product(h_id, h_type, yylb_id) '
+ 'select ''IPSC0000000000000001'', ''设备'', :yylb_id';
ExecADOQueryWithParam(ADOQuery, SqlStr,
['yylb_id'],
[‘abc'],
[ftString], False);

如果做为参数传进去 就会提示 h_type字段外键报错
SqlStr := 'insert into db_product(h_id, h_type, yylb_id) '
+ 'select ''IPSC0000000000000001'', :h_type, :yylb_id';
ExecADOQueryWithParam(ADOQuery, SqlStr,
['h_type', 'yylb_id'],
['设备', ‘abc'],
[ftString, ftString], False);

很奇怪了 上下两语句 基本一样 怎么会出现这样情况
还请指教 困扰已久 谢谢。
...全文
706 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
stephenchern 2016-05-26
  • 打赏
  • 举报
回复
估计是兄说的这样 用了这么多年 一直没注意 先谢谢 回头上面问题 我试试。
stephenchern 2016-05-26
  • 打赏
  • 举报
回复
http://wenku.baidu.com/link?url=ppPoXIsOupXT95hBqVcG8SDj-p-IBMCc_tJvhyEW9lCGfD2OE6nT7ERz-gxcZiJBiW_M4zK-FoYxni8Cez09FTcV0faQj0cYD9FlLPdEW6K&qq-pf-to=pcqq.c2c 解决了 delphi的bugs 参数最终长度 要自己再赋值
stephenchern 2016-05-26
  • 打赏
  • 举报
回复
现在的问题更是奇怪了 SqlStr := 'insert into dz_type(h_type)' + 'select :h_type'; ExecADOQueryWithParam(ADOQuery, SqlStr, ['h_type'], ['一二三四五'], [ftString], False); ADOQuery.Free; 数据库h_type字段类型是char(10) 数据库是mssql 执行上面语句 插入后 最终数据库只插入 一二 后面的被截掉了 ExecADOQueryWithParam函数如下: function ExecADOQueryWithParam(ADOQuery: TADOQuery; SqlStr: String; AParamName: array of string; AParamValue: array of Variant; AParamType: array of TFieldType; OpenFlag: Boolean): Boolean; var i: Integer; begin Result := True; with ADOQuery do begin Close; SQL.Clear; SQL.Add(SqlStr); for i := Low(AParamName) to High(AParamName) do begin if Parameters.FindParam(AParamName[i]) = nil then Continue; Parameters.ParamByName(AParamName[i]).DataType := AParamType[i];//20160524发现 字段类型没赋值 会导致null给字段的时候 报错 try case AParamType[i] of ftString, ftWideString: begin//VarIsEmpty:判断是否为Unassigned VarIsNull:判断是否为Null Parameters.ParamByName(AParamName[i]).Size := Length(AParamValue[i]); //如果Variant是Unassigned,则将其赋值为null if VarIsEmpty(AParamValue[i]) then AParamValue[i] := null else Parameters.ParamByName(AParamName[i]).Value := AParamValue[i]; end; ftInteger, ftFloat, ftDateTime, ftDate: begin//VarIsEmpty:判断是否为Unassigned VarIsNull:判断是否为Null //如果Variant是Unassigned,则将其赋值为null if VarIsEmpty(AParamValue[i]) then AParamValue[i] := null else Parameters.ParamByName(AParamName[i]).Value := AParamValue[i]; end; ftBoolean: begin //如果Variant是Unassigned;并且数据类型是Boolean类型,则将其赋值为false(因为对于Variant类型,若将其赋值为False,则Variant类型为Unassigned) if VarIsEmpty(AParamValue[i]) then Parameters.ParamByName(AParamName[i]).Value := False else Parameters.ParamByName(AParamName[i]).Value := AParamValue[i]; end; ftBlob: begin //若添加的是图片类型或文件类型的处理 参数值为图片文件所在的本地路径 if VarIsNull(AParamValue[i]) or VarIsEmpty(AParamValue[i]) then begin Parameters.ParamByName(AParamName[i]).Value := null; end else begin if FileExists(AParamValue[i]) then Parameters.ParamByName(AParamName[i]).LoadFromFile(AParamValue[i], ftBlob) else Parameters.ParamByName(AParamName[i]).Value := null; end; end; end; except Application.MessageBox(PChar('错误参数:'+AParamName[i]), '错误', MB_OK + MB_ICONINFORMATION); Exit; end; end; // ShowMessage(SqlStr); // SqlStr := ''; // for i := 0 to Length(AParamName) - 1 do // SqlStr := SqlStr + AParamName[i] + '=' + AParamValue[i] + #13; // ShowMessage(SqlStr); {异常提示:Parameter object is improperly defined.Inconsistent or incomplete information was provided 解决办法:} try if OpenFlag then Open else ExecSQL; except Result := False; raise Exception.Create('抛出异常'); Application.MessageBox(PChar('数据库执行出错'), '错误', MB_OK + MB_ICONERROR); ShowMessage('错误SQL代码:'+#13+ADOQuery.SQL.Text); end; end; end;
doloopcn 2016-05-25
  • 打赏
  • 举报
回复
漏了字符串的单引号 SqlStr := 'insert into db_product(h_id, h_type, yylb_id) ' + 'select ''IPSC0000000000000001'', :h_type, :yylb_id'; ExecADOQueryWithParam(ADOQuery, SqlStr, ['h_type', 'yylb_id'], [QuotedStr('设备'),QuotedStr( ‘abc')], [ftString, ftString], False);
lyhoo163 2016-05-25
  • 打赏
  • 举报
回复
SQL语句对字符串的引号,有时是有自我修复功能。
stephenchern 2016-05-25
  • 打赏
  • 举报
回复
不会吧 我之前都不会这样啊。。。之前所有代码 都用的好好的。

2,496

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧