PDA

View Full Version : سوال: خطا در TypeCasting در dbExpress



BORHAN TEC
چهارشنبه 01 شهریور 1391, 18:23 عصر
سلام :قلب:
در Delphi XE کلاسهای زیر را تعریف کرده ام:
type
TUser = class(TObject)
FDBXConnection: TDBXConnection;
public
procedure SetDBXConnection(aDBXConnection: TDBXConnection); // @
...
function GetUserNameById(aId: Integer): string;
...
constructor Create; overload; // @
constructor Create(aDBXConnection: TDBXConnection); overload; // @
end;

TBaseSQL = class
private
class var dbxReader: TDBXReader;
class var dbxCommand: TDBXCommand;
public
class function GetOneDataBySQL(aSQL: string; aDBXConnection: TDBXConnection;
var aFounded: Boolean): TDBXValue;
end;
و در قسمت پیاده سازی کلاس TUser:
function TUser.GetUserNameById(aId: Integer): string;
var
SQL: string;
Founded: Boolean;
ResValue: String;
stream: TStream;
bytes: TBytes;
begin
SQL := 'SELECT EMAIL FROM "USER" WHERE ID = ''' + IntToStr(aId)+'''';
stream := nil;

TBaseSQL.GetOneDataBySQL(SQL, FDBXConnection, Founded);

if Founded = True then
begin
ResValue := TBaseSQL.GetOneDataBySQL(SQL, FDBXConnection, Founded).GetString;
end
else
Result := '';

end;

constructor TUser.Create;
begin
inherited;

end;

constructor TUser.Create(aDBXConnection: TDBXConnection);
begin
SetDBXConnection(aDBXConnection);
end;

procedure TUser.SetDBXConnection(aDBXConnection: TDBXConnection);
begin
FDBXConnection := aDBXConnection;
end;

و در قسمت پیاده سازی کلاس TBaseSQL:
class function TBaseSQL.GetOneDataBySQL(aSQL: string;
aDBXConnection: TDBXConnection; var aFounded: Boolean): TDBXValue;

begin
dbxCommand := aDBXConnection.CreateCommand;

dbxCommand.Text := aSQL;
dbxCommand.Prepare;
dbxReader := dbxCommand.ExecuteQuery();

if dbxReader.Next then
begin
aFounded := True;
Result := dbxReader.Value[0];
end
else
begin
aFounded := False;
end;
end;
حال موقعی که از کدی مثل کد زیر استفاده می کنم:
var
User: TUser;
begin

User := TUser.Create(FBCONNECTION.DBXConnection);
try
Caption := User.GetUserNameById(1);
finally
User.Free;
end;
با خطای زیر روبرو می شوم:

TDBXTypes.ZSTRING value type cannot be accessed as TDBXTypes.WideString value type.

توضیحات اضافی:
جدول User شامل دو فیلد ID و EMAIL است.
ID: از نوع Integer است.


EMAIL : از نوع VarChar(100) است.
CharSet از نوع UTF8
Collate از نوع UNICODE_CI

پایگاه داده مورد استفاده : FireBird (البته برای تست از هر DBMS دیگری هم می توان استفاده کرد).

لطفاً اگر برای رفع این مشکل پیشنهاد و یا راهکاری دارید ما را بی بهره نگذارید. :قلب:

با تشکر فراوان...

BORHAN TEC
چهارشنبه 01 شهریور 1391, 20:07 عصر
خودم مشکل رو حل کردم:
توجه داشته باشید که کد زیر به درستی کار می کند:
ResValue := TBaseSQL.GetOneDataBySQL(SQL, FDBXConnection, Founded).GetAnsiString;
ولی اگر بخواهیم داده ها را به شکل یونیکد بازگشت دهیم باید چند کار را انجام دهیم.
1- اگر در ساخت جداول پایگاه داده نوع CharSet روی UTF-8 ست شده باشد در dbExpress باید خاصیت ServerCharSet مربوط به کانکشن را روی utf8 ست کنیم (یعنی بدون علامت - )
2- در مرحله بعد باید از یک TClientDataSet هم کمک بگیریم و نوع خروجی را نیز به TFiled تغییر دهیم. چیزی شبیه به زیر:
class function TBaseSQL.GetOneDataBySQL(aSQL: string;
aDBXConnection: TDBXConnection; var aFounded: Boolean): TField;
begin
dbxCommand := aDBXConnection.CreateCommand;

dbxCommand.Text := aSQL;
dbxCommand.Prepare;
dbxReader := dbxCommand.ExecuteQuery();
cds := TDBXDataSetReader.ToClientDataSet(nil, dbxReader, False);
cds.First;

if cds.RecordCount >= 1 then
begin
aFounded := True;
Result := cds.Fields[0];
end
else
begin
aFounded := False;
end;
end;

کدی که در پست قبل بود را نیز به شکل زیر تغییر می دهیم:
function TUser.GetUserNameById(aId: Integer): string;
var
SQL: string;
Founded: Boolean;
ResValue: String;
cds: TClientDataSet;

begin
SQL := 'SELECT EMAIL FROM "USER" WHERE ID = ''' + IntToStr(aId) + '''';

TBaseSQL.GetOneDataBySQL(SQL, FDBXConnection, Founded);

if Founded = True then
begin
Result := TBaseSQL.GetOneDataBySQL(SQL, FDBXConnection, Founded).AsString;
end
else
Result := '';

end;
با انجام این کارها مشکل به طور کامل حل خواهد شد.:لبخند:

این هم منبعی که با استفاده از آن توانستم مشکل را حل کنم:
https://forums.embarcadero.com/thread.jspa?threadID=63412

موفق باشید...