المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : ربط دلفي-بأوراكل (odbc)


louay
29-05-2011, 01:40 PM
سلام الله عليكم

درس حول كيفية ربط دلفي بأوراكل بإستخدام odbc.

kachwahed
29-05-2011, 03:16 PM
وعليكم السلام ورحمة الله
أهنئك على هذا الطرح المتميز :)
... لماذا اخترت odbc عوض ole db ado مباشرة ؟
ماذا يحتاج كل منهما عند نقل البرنامج إلى جهاز آخر؟
ولماذا؟

louay
29-05-2011, 04:07 PM
... لماذا اخترت odbc عوض ole db ado مباشرة ؟


أخترت ODBC لأن قاعدة البيانات التي أشتغل عليها ليست على جهازي الشخصي و إلا لكنت أستعملت ado مباشرة


ماذا يحتاج كل منهما عند نقل البرنامج إلى جهاز آخر؟
ولماذا؟


طريقة ODBC

يعمل البرنامج مع إضافات مثل:

تنصيب العميل أوراكل
إضافة مصدر قاعدة البيانات على (Sources de données (ODBC)
تعديل على ملف tnsnames.ora

طريقة Ado مباشرة

لا يعمل إلا في الجهاز الذي عملت فيه التطوير

(ممكن أن يشتغل بجعل برنامجك ذكي فيبحث عن قاعدة البيانات المراد الإشتغال عليها) لكن هذا خارج عن نطاقي:)

kachwahed
29-05-2011, 05:44 PM
قاعدة البيانات التي أشتغل عليها ليست على جهازي الشخصي و إلا لكنت أستعملت ado مباشرة
بلى، يمكن ذلك بكتابة عنوان IP مباشرة حيث يكتب اسم الخادم في العنصر Data Source

فعندما لا تكتب شيء في Data Source فأنت في Localhost أو 127.0.0.1 وهو ما يعرف بـ IP Loopback Address في IPv4 (بالفرنسي: Adresse de bouclage) ولأجل ذلك فإن برنامجك:
لا يعمل إلا في الجهاز الذي عملت فيه التطوير

يبقى التنبيه على Port إذ ينبغي تحديده يدويا مع محرك Oracle باستخدام الصيغة IP:Port

تمرين :): أكتب تطبيق يقوم بـ:
1- التحقق من تثيبت Oracle على جهاز الزبون
2- الاتصال بق.ب. Oracle مع تزويد المستخدم بأهم الخيارات الضرورية
مكتبة لتساعدك على ذلك:
unit FiagOracle;

interface

uses Classes;

function QrySQL(AConnStr, AQrySQL: string): TStrings;

function GetOracleInstallPath: string;
function GetTnsNames: TStrings;
function GetPackageNames(AConnStr, AOwner: string): TStrings;
function GetProcNamesOracle(AConnStr, AOwner, APkgName: string):
TStrings;
function GetPackageSrc(AConnStr, AOwner, APkgName: string): TStrings;


implementation

uses FiagSystem, SysUtils, Registry, StrUtils, Variants, Windows, ADODB;

{ Function: Get Oracle Path }

function GetOracleInstallPath: string;
const
RootKey = HKEY_LOCAL_MACHINE;
RegPath = '\SOFTWARE\ORACLE\ALL_HOMES\ID0';
KeyName = 'PATH';
begin
Result := GetRegistryString(RootKey, RegPath, KeyName);
end;

{ Function: Get Oracle TNS Names }

function GetTnsNames: TStrings;
const
TnsNamesORA = '\network\ADMIN\TNSNAMES.ORA';
var
FileContent: TStringList;
ALine, ATmp: string;
AChar: Char;
I, J, iCount, ALen, AStack: Integer;
begin
Result := TStringList.Create;
FileContent := TStringList.Create;
try
FileContent.LoadFromFile(GetOracleInstallPath + TnsNamesORA);
except
on E: Exception do
begin
Exit;
end;
end;
AStack := 0;
ATmp := '';
iCount := FileContent.Count - 1;
for I := 0 to iCount do
begin
ALine := Trim(FileContent[I]);
ALen := Length(ALine);
if (ALen > 0) and ('#' <> ALine[1]) then
begin
for J := 1 to ALen do
begin
AChar := ALine[J];
if AChar = '(' then
Inc(AStack)
else if AChar = ')' then
Dec(AStack)
else
begin
if (AStack = 0) {and (AChar<>' ')} then
ATmp := ATmp + AChar;
end;
end;
end;
end;
FileContent.Free;

ALen := Length(ATmp);
if ATmp[ALen] = '=' then
SetLength(ATmp, ALen - 1);

with (Result as TStringList) do
begin
Delimiter := '=';
DelimitedText := ATmp;
Sort;
end;
end;

function QrySQL(AConnStr, AQrySQL: string): TStrings;
begin
Result := nil;
with TADOQuery.Create(nil) do
begin
ConnectionString := AConnStr;
SQL.Add(AQrySQL);
try
Open;
Result := TStringList.Create;
First;
while not Eof do
begin
Result.Add(Fields[0].AsString);
Next;
end;
except
on E: Exception do
begin
// MessageDlg(SMsgSQLQueryError+E.Message,mtError,[mbOK],0);
end;
end;
Free;
end;
end;

function GetPackageNames(AConnStr, AOwner: string): TStrings;
const
SQryPkgNames = 'SELECT OBJECT_NAME FROM ALL_OBJECTS WHERE OWNER=''%s''' +
' AND OBJECT_TYPE=''PACKAGE'' ORDER BY OBJECT_NAME';
begin
Result := QrySQL(AConnStr, Format(SQryPkgNames, [UpperCase(AOwner)]));
end;

function GetProcNamesOracle(AConnStr, AOwner, APkgName:
string): TStrings;
const
SQryProcNames = 'SELECT PROCEDURE_NAME FROM ALL_PROCEDURES WHERE OWNER=''%s'''
+
'AND OBJECT_NAME=''%s'' ORDER BY PROCEDURE_NAME';
begin
Result := QrySQL(AConnStr,
Format(SQryProcNames, [UpperCase(AOwner), UpperCase(APkgName)]));
end;

function GetPackageSrc(AConnStr, AOwner, APkgName: string):
TStrings;
const
SQryPkgSrc = 'SELECT TRIM(TEXT) FROM ALL_SOURCE WHERE TYPE=''PACKAGE''' +
' AND OWNER=''%s'' AND NAME=''%s'' ORDER BY LINE';
begin
Result := QrySQL(AConnStr,
Format(SQryPkgSrc, [UpperCase(AOwner), UpperCase(APkgName)]));
end;

end.
وجدتها في google code
http://fiagutils.googlecode.com/svn/trunk/Source/FiagOracle.pas
بالتوفيق.

louay
29-05-2011, 09:11 PM
تمرين :): أكتب تطبيق يقوم بـ:

لي عودة إن شاء الله ولكن إمحني بعض الوقت

mobile
31-05-2011, 10:22 PM
السلام عليكم جميعا
طرح رائع جدا ومفيد لو يتفضل احدكما اوكلاكما بالتفصيل في تقنية odbc او ado
لاني قراة مرة ان ado تقنية فاشة وان ado غير متوافق حتى مع نفسه (يقصد بهذا نسخه)
والله اعلم هذا ما قراته فقط

kachwahed
31-05-2011, 11:05 PM
بالتفصيل في تقنية odbc او ado
ترقبوه عن قريب... العدد الخامس من مجلة المنتدى.

louay
09-03-2012, 04:58 PM
بلى، يمكن ذلك بكتابة عنوان IP مباشرة حيث يكتب اسم الخادم في العنصر Data Source

فعندما لا تكتب شيء في Data Source فأنت في Localhost أو 127.0.0.1 وهو ما يعرف بـ IP Loopback Address في IPv4 (بالفرنسي: Adresse de bouclage)


(Data Source)هل هي التي تكون في Propreties لدى المكون ADODataSet ؟


يبقى التنبيه على Port إذ ينبغي تحديده يدويا مع محرك Oracle باستخدام الصيغة IP:Port


أي Port تقصد ؟ هل هو الموجود في TNSname لدى ملف Oracle ؟

kachwahed
03-04-2012, 09:22 AM
(Data Source)هل هي التي تكون في Propreties لدى المكون ADODataSet ؟
كلا، أقصد Data Source في صفحة الاتصال ADO
أقصد الـ Port الذي في إعدادات Oracle.

هاوي دلفي
04-04-2012, 06:49 PM
السلام عليكم
من باب الفائدة والذي يحب يمكن الربط بين دلفي وأوراكل بشكل سريع وسهل وإجراء كل ما يلزم باستخدام مكونات
( Oracle Data Access components (ODAC
حيث يمكن العودة إلى موقع Devart للحصول على تفاصيل أكثر