نوشته شده توسط
علی کشاورز
همچین دستوری در دلفی وجود نداره. اصلا دلفی دستوری برای کار با بانک اطلاعاتی نداره، بلکه یک سری تابع و کلاس برای کار با بانک داره.
توابع هم دو حالت دارند، یا از بانک مستقیما کوئری می گیرند، یا اینکه دیتاست رو پیمایش می کنند، که در صورت پیمایش، میشه همون حلقه، فقط فرق اش اینه که شما حلقه رو نمی بینید، و فکر می کنید کد شما بدون حلقه کار کرده!
بدون حلقه هم میشه این کار را انجام داد، اما همانگونه که آفای کشاورز فرمودند نه در سطح دلفی که در سطح SQL. یعنی یک کوئری استفاده کنیم که داده های فیلد مورد نظر رو به صورت مدنظر برگردونه. برای این کار از کد زیر برای کوئری استفاده می کنیم.
SELECT CONVERT(nvarchar(max), field_name) + CHAR(13) + CHAR(10) AS [text()]
FROM table_name WHERE (1 = 1) for xml path('')
قسمت WHERE رو هم درج کردم که بدونید باید کجا بگذاریدش
این دستور در واقع برای تولید یک فایل xml از روی داده ها بکار می رود. برای نمونه هنگامی که می خواهید داده های جدولی را در پی یک درخواست xmlrpc یا soap برگردانید برای اینکه درد و خونریزی نداشته باشد باید از این روش بهره گیرید. کنون ما با کمی دستکاری، کاری کرده ایم که مولفه های xml حذف شوند و نتیجه شبیه یک متن ساده در آید.
از آنجا مقدار برگشتی این دستور در ADO از نوع ADOStream می باشد برای دریافت محتوای آن در دلفی نیز از متد زیر بهره بگیرید:
function SQLtoXML(Conn: TADOConnection; SQLCmd: string): string;
const
adExecuteStream = 1024;
var
Command: _Command;
Stream: OleVariant;
RecordsAffected: OleVariant;
Parameters: OleVariant;
begin
Command := CreateOleObject('ADODB.Command') as _Command;
Command.Set_ActiveConnection(Conn.ConnectionObject );
Command.CommandType := ADOInt.adCmdText;
Command.CommandText := SQLCmd;
Stream := CreateOleObject('ADODB.Stream');
Stream.Open;
Command.Properties['Output Stream'].Value := Stream;
Parameters := EmptyParam;
Command.Execute(RecordsAffected, Parameters, adExecuteStream);
Stream.Position := 0;
Result := Stream.ReadText;
end;