起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 327|回复: 14

[[结贴]数据库insert 错误

[复制链接]
发表于 2009-9-15 15:12:30 | 显示全部楼层 |阅读模式
---------------------------
X3 Studio
---------------------------
运行系统初始化的时候发生异常:ExecuteSQL error: 赋予 类型 'nvarchar' 的大小(22612)超过了任意数据类型的最大允许值(8000)。

类型:Exception。
---------------------------
确定   
---------------------------

代码:
var
  lQuery: TQuery;
const
   insSQL = 'Insert into TTEXTMAIL(FRECEIVERID,FTITLE,FCONTENT,FFLAG, FMAILTYPE) values (:ReceiverID, :Title, :Content,0,''HTML'')';
begin
    lQuery:= TQuery.Create(nil);
    try
      lQuery.ConnectionString:= 'DATABASEURL=Biz:\SYSTEM\SYSTEM.DATABASE';
      lQuery.CommandText:= insSQL;
      lQuery.Params.ParamByName('ReceiverID').AsString := ReceiverID;
      lQuery.Params.ParamByName('Title').AsString := Title;
      lQuery.Params.ParamByName('Content').AsString := Content;
      lQuery.Execute;
    finally
      lQuery.Free;
    end;
end;

当content长度大于8000就会报错。SQL server 2000数据库,fcontent字段类型为text
回复

使用道具 举报

 楼主| 发表于 2009-9-15 15:28:05 | 显示全部楼层
---------------------------
小于8000又报这个错
X3 Studio
---------------------------
运行随便测试的时候发生异常:ExecuteSQL error: 赋予 参数 '@A2' 的大小(7817)超过了最大允许值(4000)。

类型:Exception。
---------------------------
确定   
---------------------------
回复 支持 反对

使用道具 举报

发表于 2009-9-15 15:57:52 | 显示全部楼层
楼主,你这样的insert 的SQL语句,直接在数据库上执行看看是否ok
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-9-16 08:46:06 | 显示全部楼层
直接在查询分析器插入没问题
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-9-16 08:54:58 | 显示全部楼层
我今天有事,可能下午或者明天回复
回复 支持 反对

使用道具 举报

发表于 2009-9-16 09:35:34 | 显示全部楼层
楼主,打个资源包上来看看吧。另外把你传入的数据也一块发上来。
回复 支持 反对

使用道具 举报

发表于 2009-9-16 09:44:37 | 显示全部楼层
友情跟帖
SQLSERVER2000 对于变量VARCHAR最大允许8000字符(汉字算做2个字符)    NVARCHAR最大允许4000字符
如果超过,建议lz采用拼凑字符串的形式而非参数形式
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-9-16 13:52:25 | 显示全部楼层
回6楼:
用不着打包,一个Memo,一个button
button onclick事件
var
  lQuery: TQuery;
begin
    lQuery:= TQuery.Create(nil);
    try
      lQuery.ConnectionString:= 'DATABASEURL=Biz:\SYSTEM\SYSTEM.DATABASE';
      lQuery.CommandText:= 'Insert into TTEXTMAIL(FRECEIVERID,FTITLE,FCONTENT,FFLAG, FMAILTYPE) values (''ReceiverID'', ''Title'' , Memo.text,0,''HTML'')';
      lQuery.Execute;
    finally
      lQuery.Free;
    end;
end;


SQL 生成表:
create table TTEXTMAIL
(
   FID int not null identity(1,1) primary key,
   FRECEIVERID CHAR(32)  not null,
   FTITLE CHAR(100),
   FCONTENT TEXT,
   FFLAG int,
   FMAILTYPE varchar(4)
)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-9-16 13:57:30 | 显示全部楼层
谢谢7楼的回复。关键是我没用varchar或者nvarchar格式,用的text
回复 支持 反对

使用道具 举报

发表于 2009-9-16 14:31:41 | 显示全部楼层
按你的说法,我在sql2000下作了测试,没问题。
procedure TMainForm.Button1Click(Sender: TObject);
var
  i : Integer;
  lStrings : TStringList;
begin
  lStrings := TStringList.Create;
  try
    Memo1.Clear;
    for i := 0 to 8009 do
      lStrings.Add(SysUtils.IntToStr(i));

    Memo1.Lines.AddStrings(lStrings);
  finally
    lStrings.Free;
  end;
end;

procedure TMainForm.Button2Click(Sender: TObject);
begin
  Query1.CommandText:= ' Insert into TTEXTMAIL(FRECEIVERID,FTITLE,FCONTENT,FFLAG, '
                     + ' FMAILTYPE) values (''ReceiverID'', ''Title'' , '
                     + ' '''+Memo1.text+''' ,0,''HTML'')';
  Query1.Execute;
end;

结果图

snap1.png

4.35 KB, 下载次数: 132

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-16 01:47 , Processed in 0.047190 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表