有关sql中text长度问题

edwardrao 2000-12-05 02:29:00
有关sql中text长度问题:

假设有这么一句:query1.fieldbyname('df').asstring:=query2.fieldbyname('fff').asstring;

左边要插入到一sql数据库中,右边为一fox数据库,右边类型为mem类型,左边为text类型。但在插入时delphi提示字符被右截断,调试可看见右边和左边都可取得这个较长的数据,如果右边数据较短,则插入成功!但在sql-server中直接插入成功!

为什么不能在程序中插入,有什么问题,请各位大虾指点!不胜感激》
...全文
3346 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
BlueSQu 2001-01-08
  • 打赏
  • 举报
回复
Try
Tblob(query2.fieldbyname('fff')).LoadFromFile();
BlueSQu 2001-01-08
  • 打赏
  • 举报
回复
Try
Tblob(query2.fieldbyname('fff')).LoadFromFile();
edwardrao 2001-01-08
  • 打赏
  • 举报
回复
如何修改BDE设置
edwardrao 2000-12-08
  • 打赏
  • 举报
回复
谢谢您的意见。怪不得我在进行插入操作时,若判断待插入数据长度〉8K,就强制截断,则成功。
若去掉判断条件,则又提示出错。

但我还有一是]不明,向请教大虾:1 我若不用程序来进行插入操作,而直接用sql-server来插入,则操作成功 。
2 若先这样操作:insert into tablename('ff') values ('') ---在程序中先插入一个空值,然后,update tablename set ff='要插入的很长一段数据' ; 则操作也成功。

以上两点,都是在text取 默认值是进行的。也就是说,直接用程序进行插入很长的数据会出错,但是用以上两种方法都成功(都是在text取默认值情况下)不止何故?

请各位大虾继续解答,谢谢!
peacock 2000-12-07
  • 打赏
  • 举报
回复
我找到了,我曾经被这个问题害惨了,每次都只能存储8K的文本(图像),今天我特意查了资料,才知道,text或image保存的只是一个指向文本或图像数据的16字节指针,而SQL Server默认将text或image的长度定为8192,即8K,你可以使用SQL语句来改变它的大小,SET TEXTSIZE 2147438647,即2G,如果要恢复默认值,设为0就可以了!
xiaozhe 2000-12-07
  • 打赏
  • 举报
回复
再补充一下:objProcedure 为TStoredProc类型。
xiaozhe 2000-12-07
  • 打赏
  • 举报
回复
呵呵,用我的办法,存储数据量无限制。
FoxPro那边可以用
query1.fieldbyname('Bz').savetofile(strBztempFileName);
存到文件里去。
peacock 2000-12-07
  • 打赏
  • 举报
回复
16K
edwardrao 2000-12-06
  • 打赏
  • 举报
回复
sos
xiaozhe 2000-12-06
  • 打赏
  • 举报
回复
补充一下:strBztempFileName为文件名。
xiaozhe 2000-12-06
  • 打赏
  • 举报
回复
数据库肯定是没有问题的,问题出在BDE上,以上程序提交给BDE处理时,BDE会将其转成SQL语名执行,而SQL语句的长度是有限制的,所以,就会将memo字段截断了。
正确的处理方法是在SQL上用存储过程处理。
而在delphi上也用Tprocedure这个控件来做。
以下是一个简单的例子:
Delphi部分:
objProcedure.StoredProcName := 'Xgfx_bz_Write';
objProcedure.Params.Clear;
objProcedure.Params.CreateParam(ftstring,'@aZqdm',ptInput);
objProcedure.params.createparam(ftstring,'@aGprq',ptInput);
objProcedure.params.createparam(ftmemo,'@aBz',ptInput);
objProcedure.paramByname('@aZQDM').asstring := editcode.Text;
ObjProcedure.ParamByName('@aGprq').asdatetime := dateedit1.Date;
objProcedure.paramByname('@aBz').LoadFromFile(strBztempFileName,ftmemo);
try
objProcedure.ExecProc;
except
application.MessageBox('检查一下与服务器联结是否正常!','错误',MB_OK);
exit;
end;

SQL里边的存储过程:

CREATE PROCEDURE dbo.Xgfx_bz_write(@aZqdm varchar(6),@aGprq datetime,@aBz text) AS
declare @ptrBbsm varchar(16)
select @ptrBbsm = textptr(Bz) from Xgfx where zqdm=@azqdm and Gprq=@aGprq
if isnull(@ptrBbsm,'&&&&&&&&&&') = '&&&&&&&&&&'
update Xgfx set Bz = 'null' where Zqdm=@aZqdm and Gprq=@aGprq
select @ptrBbsm = textptr(Bz) from Xgfx where zqdm=@azqdm and Gprq=@aGprq
writetext Xgfx.Bz @ptrBbsm @aBz

如果还不明白,可以给我发信:xiaozhee@363.net
mywater 2000-12-06
  • 打赏
  • 举报
回复
1
我估计是数据库设计有错:
检查SQL中,有问题的字段,检查这个字段的设置,是Text类型,还是Char 或 Varchar
注意,使用Text,或者把Varchar length 设置大!
2
看一看数据库连接( DataBase )的属性,是否有关于32k方面限制的设置??
edwardrao 2000-12-06
  • 打赏
  • 举报
回复
在插入时
出现字符右截断错误!

我该怎么办,各位大虾?

救久我!
flyby 2000-12-06
  • 打赏
  • 举报
回复
用六来操作:stringstream
strm:stringstream;
strm:=TStringStream.create(query2.fieldbyname('fff').asstring);
在用sql语句插入query1中
edwardrao 2000-12-06
  • 打赏
  • 举报
回复
sos
edwardrao 2000-12-05
  • 打赏
  • 举报
回复
procedure TForm1.PreQuery(Query:TQuery;qrysql:string);
begin
Query.Close;
Query.SQL.Clear ;
Query.SQL.Add(qrysql);
end; // 对上面prequery函数的补充说明
edwardrao 2000-12-05
  • 打赏
  • 举报
回复
var
StrString:string;
begin
StrString:='insert into '+sSqlTable+' values(:cateid,:title,:source,:contents,:date,:inputdate,:importance,:processed,:checked,:published,:attach,:clicks)';
PreQuery(qryMsSql,StrString);
qryMsSql.ParamByName('cateid').asinteger:=StrToInt(sSqlCategory);
qryMsSql.ParamByName('title').asstring:=qryFoxPro.fieldbyname('TITLE').asstring;
qryMsSql.ParamByName('source').asstring:='';
qryMsSql.ParamByName('contents').asstring:=qryFoxPro.fieldbyname('CONT').asstring; // 这里有时会字符右截断
qryMsSql.ParamByName('date').asinteger:=DateTimeToSecond(qryFoxPro.fieldbyName('DA').asdatetime,qryFoxPro.FieldByName('TM').asstring); // DateTimeToSecond为自己编写的将日期转换成秒数的函数。
qryMsSql.ParamByName('inputdate').asinteger:=StrToInt(DateSysToSQL(qryFoxPro.fieldbyName('DA').asdatetime));
qryMsSql.ParamByName('importance').asinteger:=0;
qryMsSql.ParamByName('processed').asinteger:=0;
qryMsSql.ParamByName('checked').asinteger:=0;
qryMsSql.ParamByName('published').asinteger:=1;
qryMsSql.ParamByName('attach').asinteger:=0;
qryMsSql.ParamByName('clicks').asinteger:=0;
qryMsSql.ExecSQL ;
end;

帮忙看一下,谢谢!
Daiver 2000-12-05
  • 打赏
  • 举报
回复
可否把你的程序给我,我帮你看看!
edwardrao 2000-12-05
  • 打赏
  • 举报
回复
help?
sos!
edwardrao 2000-12-05
  • 打赏
  • 举报
回复
能具体点吗?大虾!
我的意识是要将fox的所有mem 类型数据导入sql中,遇到字符右截断,怎么办?
加载更多回复(6)

5,392

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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