ورود

View Full Version : سوال: نحوه اطلاع از وجود ياعدم يك تيبل



shpegah
دوشنبه 21 تیر 1389, 10:49 صبح
سلام دوستان
من ميخواهم در يك ديتابيس اكسس از يك برنامه اي كه بادلفي 7 نوشته شده از وجود يك تيبل اطلاع پيدا كنم از كد زير استفاده كردم ولي گاهي وجودتيبل رادرست نشان نميدهد

; ADOConnection1.Connected:=True

;((IDTmp :=FindTableID(FindDatabaseID('C:Sub.mdb'),'TblFiFo '+inttostr(ShCurrentYear-1

; if IsNullID(IDTmp) then N15.Enabled:=False else N15.Enabled:=True
; if N15.Enabled=True then N16.Enabled:=False else N16.Enabled:=True

در ضمن ديتبيس پروتكت شده است.
آيا تابع ديگري سراغ داريد؟ در sqlserver چطور؟
پيشاپيش ممنونم.

Felony
دوشنبه 21 تیر 1389, 11:08 صبح
براتون یک تابع نوشتم :

function TableExists(Connection: TADOConnection; TableName: String): Boolean;
var
StrList: TStringList;
i: Integer;
begin
StrList:= TStringList.Create;
try
Connection.GetTableNames(StrList);
for i:= 0 to StrList.Count - 1 do
if StrList.Strings[i] = TableName then
begin
Result:= True;
Exit;
end;
finally
StrList.Free;
end;
end;

مثلا :
if TableExists(ADOConnection1,'TBL_Book') then
ShowMessage('Exists')
else
ShowMessage('Not exists');

MOJTABAATEFEH
دوشنبه 21 تیر 1389, 11:26 صبح
براتون یک تابع نوشتم :

function TableExists(Connection: TADOConnection; TableName: String): Boolean;
var
StrList: TStringList;
i: Integer;
begin
StrList:= TStringList.Create;
try
Connection.GetTableNames(StrList);
for i:= 0 to StrList.Count - 1 do
if StrList.Strings[i] = TableName then
begin
Result:= True;
Exit;
end;
finally
StrList.Free;
end;
end;

مثلا :
if TableExists(ADOConnection1,'TBL_Book') then
ShowMessage('Exists')
else
ShowMessage('Not exists');

دستورات شما درست است فقط من که تست کردم یه اشکال کوچیک داشت با اجازه شما می نویسم
بعد از خط زیر

StrList:= TStringList.Create;
باید دستور زیر اضافه بشه
strlist.Add('TableName');
موفق باشید

vcldeveloper
دوشنبه 21 تیر 1389, 13:50 عصر
باید دستور زیر اضافه بشهاضافه بشه که چی بشه؟!


براتون یک تابع نوشتمتابع تون به اندازه کافی بهینه نیست:
نیازی نیست خودتون روی عناصر لیست پیمایش کنید، باید از متد IndexOf استفاده می کردید، که خودش متناسب با وضعیت لیست (مرتب بودن آن، یا حساس بودن به حروف بزرگ و کوچک)، از روش مناسب برای جستجو در لیست استفاده میکنه. کدی هم که می نویسید، خلاصه تر و گویا تر هست.

در ضمن، سعی کنید در ابتدای توابع خودتان، چک های لازم برای ادامه اجرای تابع را انجام بدید.

کدی که می تونستید بنویسید، به این شکل میشد:


function TableExists(Connection: TADOConnection; const TableName: String): Boolean;
var
StrList: TStringList;
begin
Result := False;
{Pre-conditions}
Assert(Assigned(Connection),'Connection object is not defined!');
if not Connection.Connected then
Exit;

{Checking if table exists}
StrList:= TStringList.Create;
try
Connection.GetTableNames(StrList);
Result := (StrList.IndexOf(TableName) >= 0);
finally
StrList.Free;
end;
end;

MOJTABAATEFEH
سه شنبه 22 تیر 1389, 18:54 عصر
اضافه بشه که چی بشه؟!

تابع تون به اندازه کافی بهینه نیست:
نیازی نیست خودتون روی عناصر لیست پیمایش کنید، باید از متد IndexOf استفاده می کردید، که خودش متناسب با وضعیت لیست (مرتب بودن آن، یا حساس بودن به حروف بزرگ و کوچک)، از روش مناسب برای جستجو در لیست استفاده میکنه. کدی هم که می نویسید، خلاصه تر و گویا تر هست.

در ضمن، سعی کنید در ابتدای توابع خودتان، چک های لازم برای ادامه اجرای تابع را انجام بدید.

کدی که می تونستید بنویسید، به این شکل میشد:


function TableExists(Connection: TADOConnection; const TableName: String): Boolean;
var
StrList: TStringList;
begin
Result := False;
{Pre-conditions}
Assert(Assigned(Connection),'Connection object is not defined!');
if not Connection.Connected then
Exit;

{Checking if table exists}
StrList:= TStringList.Create;
try
Connection.GetTableNames(StrList);
Result := (StrList.IndexOf(TableName) >= 0);
finally
StrList.Free;
end;
end;

من فقط بحث آقای تاجیک رو تکمیل کردم همین!

Felony
سه شنبه 22 تیر 1389, 21:48 عصر
من فقط بحث آقای تاجیک رو تکمیل کردم همین!
بحث این هست که این کد اصلا نیازی نیست ! ، برای چی باید این کد اضافه بشه ؟!

khoshblagh
شنبه 30 مرداد 1389, 09:24 صبح
براتون یک تابع نوشتم :

function TableExists(Connection: TADOConnection; TableName: String): Boolean;
var
StrList: TStringList;
i: Integer;
begin
StrList:= TStringList.Create;
try
Connection.GetTableNames(StrList);
for i:= 0 to StrList.Count - 1 do
if StrList.Strings[i] = TableName then
begin
Result:= True;
Exit;
end;
finally
StrList.Free;
end;
end;

مثلا :
if TableExists(ADOConnection1,'TBL_Book') then
ShowMessage('Exists')
else
ShowMessage('Not exists');
با سلام خدمت شما
جناب تاجیک من از این کد استفاده نمودم ولی متاسفانه با وجود بودن جدول مربوطه در بانک اکسس اعلام عدم وجود جدول مینماید. لطفا در صورت امکان راهنمایی بفرمائید. متشکرم

Delphi7_love
شنبه 30 مرداد 1389, 11:07 صبح
احتمالا ADOConnection1 شما Connect نیست قبل از

if TableExists(ADOConnection1,'TBL_Book') then
ShowMessage('Exists')
else
ShowMessage('Not exists');دستور زیر رو بنویسید
ADOConnection1.Connected:=true;

حمیدرضاصادقیان
شنبه 30 مرداد 1389, 11:47 صبح
با سلام خدمت شما
جناب تاجیک من از این کد استفاده نمودم ولی متاسفانه با وجود بودن جدول مربوطه در بانک اکسس اعلام عدم وجود جدول مینماید. لطفا در صورت امکان راهنمایی بفرمائید. متشکرم
سلام.شما از کد آقای کشاورز استفاده کنید .

khoshblagh
شنبه 30 مرداد 1389, 12:48 عصر
احتمالا ADOConnection1 شما Connect نیست قبل از

if TableExists(ADOConnection1,'TBL_Book') then
ShowMessage('Exists')
else
ShowMessage('Not exists');دستور زیر رو بنویسید
ADOConnection1.Connected:=true;
ارتباط کانکشن برقرار میباشد. احتمالا مشکل جای دیگری است.متشکرم

khoshblagh
شنبه 30 مرداد 1389, 12:51 عصر
سلام.شما از کد آقای کشاورز استفاده کنید .
با تشکر
کد جناب کشاورز جواب درست میدهد که جای تشکر دارد. منتهی من به دنبال یافتن اشکال کد جناب تاجیک در رابطه با کاربرد آن توسط برنامه خودم میباشم.

Felony
شنبه 30 مرداد 1389, 14:33 عصر
من تست کردم مشکلی نداشت ، شما کد رو دیباگ کن ببین شاید تو اون حلقه که روی جدول ها کنکاش میکنه مشکلی باشه ، در کل تنها مشکل کد اولی همون حلقه هست که برای بهینه شدن بهتره از indexOf که علی آقا گفت استفاده بشه .