ربط دلفي-بأوراكل (odbc)
#1
سلام الله عليكم

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


الملفات المرفقة
.rar   Oracle-Delphi(ODBC).rar (الحجم : 170.15 ك ب / التحميلات : 458)
الرد
#2
وعليكم السلام ورحمة الله
أهنئك على هذا الطرح المتميز Smile
... لماذا اخترت odbc عوض ole db ado مباشرة ؟
ماذا يحتاج كل منهما عند نقل البرنامج إلى جهاز آخر؟
ولماذا؟
الرد
#3
kachwahed كتب :
... لماذا اخترت odbc عوض ole db ado مباشرة ؟

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

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

طريقة ODBC

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

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

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

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

(ممكن أن يشتغل بجعل برنامجك ذكي فيبحث عن قاعدة البيانات المراد الإشتغال عليها) لكن هذا خارج عن نطاقيSmile
الرد
#4
إقتباس :قاعدة البيانات التي أشتغل عليها ليست على جهازي الشخصي و إلا لكنت أستعملت ado مباشرة
بلى، يمكن ذلك بكتابة عنوان IP مباشرة حيث يكتب اسم الخادم في العنصر Data Source

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

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

تمرين Smile: أكتب تطبيق يقوم بـ:
1- التحقق من تثيبت Oracle على جهاز الزبون
2- الاتصال بق.ب. Oracle مع تزويد المستخدم بأهم الخيارات الضرورية
مكتبة لتساعدك على ذلك:
PHP كود :
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
بالتوفيق.
الرد
#5
kachwahed كتب :
تمرين Smile: أكتب تطبيق يقوم بـ:

لي عودة إن شاء الله ولكن إمحني بعض الوقت
الرد
#6
السلام عليكم جميعا
طرح رائع جدا ومفيد لو يتفضل احدكما اوكلاكما بالتفصيل في تقنية odbc او ado
لاني قراة مرة ان ado تقنية فاشة وان ado غير متوافق حتى مع نفسه (يقصد بهذا نسخه)
والله اعلم هذا ما قراته فقط
لأستهلنّ الصعب أو أدرك المنى    فما انقادت الآمال إلاّ لصابر
الرد
#7
إقتباس :بالتفصيل في تقنية odbc او ado
ترقبوه عن قريب... العدد الخامس من مجلة المنتدى.
الرد
#8
kachwahed كتب :
بلى، يمكن ذلك بكتابة عنوان IP مباشرة حيث يكتب اسم الخادم في العنصر Data Source

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

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

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

أي Port تقصد ؟ هل هو الموجود في TNSname لدى ملف Oracle ؟
أدبني الدهر فأراني نقص عقلي وإذا ما ازددت علما زادني علما بجهلي
الرد
#9
إقتباس :(Data Source)هل هي التي تكون في Propreties لدى المكون ADODataSet ؟
كلا، أقصد Data Source في صفحة الاتصال ADO
أقصد الـ Port الذي في إعدادات Oracle.
اللهم احقن دماء المسلمين، لا تنسوهم بالدعاء...
الرد
#10
السلام عليكم
من باب الفائدة والذي يحب يمكن الربط بين دلفي وأوراكل بشكل سريع وسهل وإجراء كل ما يلزم باستخدام مكونات
( Oracle Data Access components (ODAC
حيث يمكن العودة إلى موقع Devart للحصول على تفاصيل أكثر
الرد


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم