超难问题:BCB怎样获得包含'\0'的字段数据

My_Love 2009-08-17 10:56:00
在SQL Server的字段AAA:char(16)中的数据是'ABC'+Char(0)+Char(0)+'LM'+Char(0)+'='共计9个字节.
在BCB中
TField *XX = ADOTable1->FindField("AAA");
XX->DataSize;//确得到3个字节,XX->Value也是"ABC"

是VCL的问题吗,有什么办法得到完整的字段数据?
...全文
166 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
My_Love 2009-08-18
  • 打赏
  • 举报
回复
这个=为什么不是简单赋值,而要调用WideString的构造函数呢?
My_Love 2009-08-18
  • 打赏
  • 举报
回复
WideString(Buffer^) := bStrVal;
My_Love 2009-08-18
  • 打赏
  • 举报
回复
问题已经定位:
function TCustomADODataSet.GetFieldData(Field: TField; Buffer: Pointer;
NativeFormat: Boolean): Boolean;
var
RecBuf: PChar;
Data: OleVariant;

procedure CurrToBuffer(const C: Currency);
begin
if NativeFormat then
DataConvert(Field, @C, Buffer, True) else
Currency(Buffer^) := C;
end;

procedure VarToBuffer;
begin
with tagVariant(Data) do
case Field.DataType of
ftGuid, ftFixedChar, ftString:
begin
PChar(Buffer)[Field.Size] := #0;
WideCharToMultiByte(0, 0, bStrVal, SysStringLen(bStrVal)+1,
Buffer, Field.Size, nil, nil);
end;
ftWideString:
WideString(Buffer^) := bStrVal;
ftSmallint:
if vt = VT_UI1 then
SmallInt(Buffer^) := Byte(cVal) else
SmallInt(Buffer^) := iVal;
ftWord:
if vt = VT_UI1 then
Word(Buffer^) := bVal else
Word(Buffer^) := uiVal;

红色行调用的是WStrFromPWChar会造成截断,而用WStrFromPWCharLen则不会!
lihuimin622 2009-08-18
  • 打赏
  • 举报
回复
怎么写进去的就怎么读出来。你原来肯定不是按字符串写的吧

试试ADOTable1->FieldByName("AAA")->AsVariant
ccrun.com 2009-08-18
  • 打赏
  • 举报
回复
char遇到0x0就会结束,用byte类型的缓冲.
EagleFew 2009-08-18
  • 打赏
  • 举报
回复
以Blob 字段读取出来, 这样是否可行?
teatool 2009-08-18
  • 打赏
  • 举报
回复
用int都可以啦。
int xx[50];

只要是数组就行,而且长度要自己知道。
MYMGrub 2009-08-17
  • 打赏
  • 举报
回复
http://topic.csdn.net/t/20030702/10/1980961.html
这个也许对楼主有点用吧...好运...
truelove7283159 2009-08-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 songhtao 的回复:]
不是vcl的问题,字符串是以\0结尾的,后面的数据自然读不出。
你用TBytes AsBytes;这个类型可以取到\0后面的数据
[/Quote]

lz这个问题只能当做内存块来处理. 字符数组.
里面有多少个\0都没有关系.
如果当字符串肯定是是\0就结束了. 所有那些当字符串处理或者用\0来判断的函数对你这个类型都不好使.
xjq2003 2009-08-17
  • 打赏
  • 举报
回复
c++builder 中
char aaa[16];
String ss;
ss="ABC"+Char(0)+Char(0)+"LM"+Char(0)+"=";
strcpy(aaa,ss.c_str());

SQL Server

是'ABC'+‘0’+‘0’+'LM'+‘0’+'='
我不懂电脑 2009-08-17
  • 打赏
  • 举报
回复
不是vcl的问题,字符串是以\0结尾的,后面的数据自然读不出。
你用TBytes AsBytes;这个类型可以取到\0后面的数据
My_Love 2009-08-17
  • 打赏
  • 举报
回复
AnsiString和WideString不要求以'\0'结尾.
My_Love 2009-08-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 songhtao 的回复:]
不是vcl的问题,字符串是以\0结尾的,后面的数据自然读不出。
你用TBytes AsBytes;这个类型可以取到\0后面的数据
[/Quote]
是VCL的问题 ,OleVariant的问题!

1,178

社区成员

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

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