ورود

View Full Version : سوال: پیدا کردن نام دیتابیس از داخل Connectionstring



Kamyar.Kimiyabeigi
سه شنبه 24 خرداد 1390, 15:35 عصر
با سلام
من یک ADOQuery دارم که وصل کردنش به دیتابیس بعهده کاربر هست یعنی در Runtime فرم Data Link Properties را برای کاربر باز میکنم و خودش تصمیم میگره که با چه Provider ایی به چه دیتابیسی وصل بشه در واقع ممکنه که SQL یا Oracle یا Access و یا ... باشه. حالا من چطوری میتونم نام دیتابیس رو بدست بیارم؟

سعید صابری
سه شنبه 24 خرداد 1390, 21:21 عصر
اینو امتحان کن


dbname:=Connection.Database

Kamyar.Kimiyabeigi
چهارشنبه 25 خرداد 1390, 07:43 صبح
اینو امتحان کن


dbname:=Connection.Database


در Property مربوط به ADOQuery.Connection چیزی با عنوان Database وجود نداره

hossein_h62
چهارشنبه 25 خرداد 1390, 08:50 صبح
سلام
کافیه خروجی کوئری زیر را بگیری!

SELECT DB_NAME() AS DataBaseName


مثلا :
Adoquery1.SQL.Text:='SELECT DB_NAME() AS DataBaseName';
Adoquery1.Active:=true;
Edit1.Text:=Adoquery1.FieldByName('DataBaseName'). AsString;

Kamyar.Kimiyabeigi
چهارشنبه 25 خرداد 1390, 10:11 صبح
سلام
کافیه خروجی کوئری زیر را بگیری!

SELECT DB_NAME() AS DataBaseName


مثلا :
Adoquery1.SQL.Text:='SELECT DB_NAME() AS DataBaseName';
Adoquery1.Active:=true;
Edit1.Text:=Adoquery1.FieldByName('DataBaseName'). AsString;

خوب این Query داخل همه DB ها جواب میده مثلا Oracle یا Access و ....

Felony
چهارشنبه 25 خرداد 1390, 11:21 صبح
خیر تو Access کار نمیکنه ، نام دیتابیس در اکسس همون نام فایل هست ، میتونید Query بالا رو در یک بلوک Try except اجرا کنید و اگر Query بالا جواب نداد نام فایل بانک رو از ConnectionString استخراج کنید .

Kamyar.Kimiyabeigi
چهارشنبه 25 خرداد 1390, 13:23 عصر
خیر تو Access کار نمیکنه ، نام دیتابیس در اکسس همون نام فایل هست ، میتونید Query بالا رو در یک بلوک Try except اجرا کنید و اگر Query بالا جواب نداد نام فایل بانک رو از ConnectionString استخراج کنید .

این روش هم جواب نمیده دوست عزیز چون با توضیحات شما فقط SQL Server & Access پشتیبانی میشه و مابقیه DB ها مثل Oracle با این روش جواب نمیده من فکر میکنم باید یک جوری از داخل ADOQuery.Connection اسم دیتابیس را بیرون کشید

vcldeveloper
چهارشنبه 25 خرداد 1390, 13:59 عصر
ببینید، تمام دیتابیس های معروف برای تعیین نام Database در ConnectionString از یکی از عبارت های زیر استفاده می کنند:

Database
DataSource
Data Source

بعضی دیتابیس های کمتر شناخته شده از عبارت هایی مثل:

UDB
Catalog
Initial Catalog
Database Name

استفاده می کنند.

پس اگر شما این 7 حالت مختلف رو در ConnectionString ساخته شده بررسی کنید، تقریبا در همه موارد باید بتونید بدون مشکل به نام دیتابیس دست پیدا کنید. من این رو بر اساس بررسی بیش از 30 ConnectionString مختلف برای اتصال به بانک های مختلف گفتم.

برای بررسی مقدار مربوطه هم می تونید یا از تابع ساده Pos استفاده کنید، یا از RegEx به صورت زیر:


uses PerlRegEx;

function GetDatabaseName(const ConnectionString: string): string;
const
Expression = '((database(\sname)?)|(data\s?source)|UDB|catalog) \s?=\s?(.+?);';
var
RegEx : TPerlRegEx;
begin
RegEx := TPerlRegEx.Create;
try
RegEx.Options := RegEx.Options + [preCaseLess];
RegEx.RegEx := PCREString(Expression);
RegEx.Subject := PCREString(ConnectionString);
if RegEx.Match then
repeat
/// it is possible in some connectionstrings to have datasource field
/// refer to server name, and catalog or database field to refer to the
/// database name.
/// So, to avoid returning server name in such cases; if datasource field
/// is found, we continue the search to make sure other fields do not
/// exist. If any other match is found, we do not need to search further.
Result := string(RegEx.Groups[RegEx.GroupCount]);
if not (SameText(string(RegEx.Groups[1]),'datasource') or
SameText(string(RegEx.Groups[1]),'data source')) then
Break;
until not RegEx.MatchAgain;
finally
RegEx.Free;
end;
end;

مثال:


var
ConnectionString: string;
begin
ConnectionString := 'Provider=NZOLEDB;Password=myPassword;User ID=myUsername;Data Source=myServerAddress;Initial Catalog=myDataBase;Persist Security Info=True;Port=PortNumber;Logging Level=0 or 1;Log Path=Path to log;Optimize for ASCII=True / False;';
ShowMessage(GetDatabaseName(ConnectionString));
end;

البته ممکنه نیاز به کمی تغییر داشته باشه چون بعضی از ConnectionString ها از دو یا چند عبارت فوق با معانی مختلف استفاده می کنند، مثلا در بعضی از آنها از Data Source به عنوان آدرس سرور استفاده میشه، و از Database یا Catalog به عنوان نام دیتابیس.

vcldeveloper
چهارشنبه 25 خرداد 1390, 15:16 عصر
سورس کد بالا رو تغییر دادم تا اولا از کتابخانه TPerlRegExpr استفاده کنه، و ثانیا در صورتی که در یک ConnectionString هم از فیلد Data Source و هم فیلدهایی مثل Database یا Catalog استفاده شده بود؛ مثل همین مثالی که در بالا گذاشتم، سورس کد اشتباها نام سرور را به عنوان نام دیتابیس برگشت نده.

در ضمن، برای استفاده از Regular Expressions، اگر از دلفی XE استفاده می کنید، به جای یونیت PerlRegExpr، یونیت RegularExpressionsCore را به uses اضافه کنید. البته می تونید به جای این یونیت، از یونیت RegularExpressions هم استفاده کنید، که کارکرد بهتر و ساده تری داره؛ اما در اون صورت، کد شما فقط در دلفی XE و نسخه های بالاتر کار میکنه.

اگر از نسخه های قدیمی تر از XE استفاده می کنید، PerlRegExpr رو می تونید از لینک زیر دانلود کنید :

http://www.regular-expressions.info/delphi.html