PDA

View Full Version : compact بانک access



namazi
پنج شنبه 03 اردیبهشت 1383, 20:26 عصر
با سلام
آیا با استفاده از کدهای دلفی می توان بانک اطلاعاتی Microsoft Access رو Compact کرد و اگر میشه چطوری ؟ متشکرم .

vcldeveloper
جمعه 04 اردیبهشت 1383, 01:43 صبح
function TForm1.DatabaseCompact(const sdbName: WideString): boolean;
// This function compacts an Access 2000 database
// it is called from Backup window
var
JE : TJetEngine; //Jet Engine
sdbTemp : WideString; //TEMP database
sdbTempConn : WideString; //Connection string
const
SProvider = 'Provider=Microsoft.Jet.OLEDB.4.0;'+
'Data Source=';
begin
Result:=False;
//Here we make temp file's name
//JE.CompactDatabase() does not let you to have same names...
//...as source and destination parameter, so we neet a temp file
sdbTemp := ExtractFileDir(sdbName) +
'TEMP' +
ExtractFileName(sdbName);
sdbTempConn := SProvider + sdbtemp;
//if destination file is exists, JE.compactDatabase raises an exception
//so we need to check if the file exists, if it does we have to delete it
if FileExists(sdbTemp) then
DeleteFile(sdbTemp);
//Here we make an instance of JetEngine
JE:= TJetEngine.Create(Application);
try
try
Application.ProcessMessages;
//Here is the command which compacts our database
JE.CompactDatabase(SProvider + sdbName, sdbTempConn);
//Here we replace compact database(Temp database) with current one
DeleteFile(sdbName);
RenameFile(sdbTemp, sdbName);
except
MessageDlg('خطایی در هنگام فشرده سازی بانک اطلاعاتی رخ داده است',mtError,[mbOK],0);
end;
finally
//At last here we set JetEngine instance free
JE.FreeOnRelease;
Result :=True;
end;
end;


با استفاده از کد بالا می تونی این کار رو بکنی اما قبلش باید قبلش Jet and Replication Object(JRO) رو نصب کنی:
باید ابتدا type liberary زیر رو تو دلفی import کنی "Microsoft Jet and Replication Objects 2.x Library (Version 2.x)"
برای اینکار اول از منوی project گزینه Import type liberary رو انتخاب کن. بعد همین type liberary بالا رو از لیست پیدا کن و نصب کن.
بعد از نصب باید دو تا کامپوننت جدید در Tab ActiveX داشته باشی که یکیشون TJetEngine هست. اونو بزار تو فرم برنامت و بعد از کد بالا استفاده کن.

دو نکته:
1- باید با برنامت فایل MSJRO.dll رو هم بدی به مشتری. تو هردت که سرچ کنی پیداش میکنی
2- این روش با دلفی 6 کار نمی کنه :متفکر:

موفق باشی

namazi
جمعه 04 اردیبهشت 1383, 21:48 عصر
آقای کشاورز خیلی ممنون از پاسختون من دو تا کامپوننت رو نصب کردم ولی من الان یک سوال دارم که پرسیدنش خیلی جسارت می خواد ولی خوب به دو دلیل این سوال رو می کنم اول اینکه پرسیدن عیب نیست ندونستن عیبه و دومی اینکه شما خیلی باحالین :
از اونجایی که I am a very amatuor programer فلذا :
من یک فرم دارم بنام form1 و یک Tdatabase دارم به نام MYdada و یک TJetengine دارم به نام jetengine1 و یک کلید به نام Button1 . کد لازم رو اگه میشه با نامگذاری مستند اشیاء بدید .
خواهش میکنم تیکه میکه نیان بعضی ها که آب هندوانه و قص علی هذا چون واقعا کلی باهاش سرو کله زدم ولی باز هم الان این کد برام مفهوم نیست . :oops:

namazi
جمعه 04 اردیبهشت 1383, 21:49 عصر
ضمنا آیا این کد با بانک Access 97‌هم کار میکنه یا خیر ؟‌ ضمن اینکه من از دلفی 5 استفاده میکنم :roll:

vcldeveloper
شنبه 05 اردیبهشت 1383, 01:10 صبح
آقای نمازی عزیز
به خدا من خودم هم آماتورم. اگه به سوالاتی که من قبلا پست کردم نگاه بندازید خودتون متوجه می شید (:D)

اما درباره کد بالا باید بگم که شما لازم نیست کار خاصی باهاش انجام بدید. فقط کد رو تو برنامتون کپی کنید و سپس هر وقت خواستید ازش استفاده کنید این دستور رو بکار ببرید:
[code]
if DatabaseCompact(database filename)then
do someting

ببینید شما فقط باید نام و آدرس فایل اکسس رو به این تابع بدید. بقیه کارها رو خودش انجام میده. احتیاجی هم به کامپوننت TDatabase نداره
اگه تابع مقداره true رو برگردونه یعنی عملیات با موفقیت انجام شده. وگرنه یه پیغام خطا به شما میده و مقدار False رو بر می گردونه

موفق باشید :flower:

namazi
شنبه 05 اردیبهشت 1383, 06:08 صبح
آقای کشاورز من کد رو توی برنامه کپی کردم و لی..... از اونجا که .......از اونجا که . . . . که .. . . . آقا دلو زدیم به دریا . . . از اونجا که من تا حالا تابع تعریف نکردم برای همین وقتی موقع کامپایل کردن پیغام Undeclared identifier DatabaseCompact رو میده نمی دونم چی کارش باید کرد .

namazi
شنبه 05 اردیبهشت 1383, 09:57 صبح
حرفه ای های محترم بابا یکی جواب تاپیک این تازه وارد به دنیای دلفی رو بده .

vcldeveloper
شنبه 05 اردیبهشت 1383, 12:46 عصر
آیا شما اون تابع رو در قسمت private یا Public فرمتون تعریف کردید؟
در ضمن اگه اسمه فرمتون Form1 نیست قسمت عنوان تابع رو تغییر بدید :


function TِyourFormName.DatabaseCompact(const sdbName: WideString): boolean;

namazi
شنبه 05 اردیبهشت 1383, 20:01 عصر
جناب آقای کشاورز سلام و ممنون از پاسختون
من اسم فرم رو از اول تعریف تابع برداشتم و تونستم از اون استفاده کنم فقط به دو تا مشکل برخوردم اول اینکه این تابع ظاهرا اسم Alias های تعریف شده در ODBC رو قبول نمیکنه و دوم اینکه اگر بانک من رمز داشته باشه این تابع جواب نمیده .
در مورد اشکال اول با توجه به اینکه مشخص نیست کاربر برنامه رو توی چه مسیری نصب میکنه و Alias مربوطه , از بانک اطلاعاتی کپی شده در چه مسیری استفاده خواهد کرد آیا میشه مسیر بانک اطلاعاتی Alias مربوطه رو بدست آورد ؟
متشکرم :flower:

vcldeveloper
یک شنبه 06 اردیبهشت 1383, 00:46 صبح
پسورد رو می تونید توی connection string ذخیره کنید. در این تابع متغیر sdbTempConn وظیفه نگه داری connection string رو بر عهده داره. شما می تونید عبارت


"username=something;"

و عبارت


"password=yuorpassword;"


رو به انتهای این متغییر اضافه کنید.
درباره نحوه کارکدن این تابع با ODBC اطلاعی ندارم. اما اگه شما بتونید مسیر Alias رو در زمان اجرا بدست بیارید می تونید اون مسیر و نام فایل بانک اطلاعاتی را به عنوان یک پارامتر به این تابع ارسال کنید.

namazi
یک شنبه 06 اردیبهشت 1383, 19:14 عصر
یه اشکال کوچیک:
و اون اینکه این تابع فقط با بانکهای Access2000 کار میکنه و اگر به اون یک بانک با فرمت Access97 بدید این تابع فرمت اونو میبره به فرمت 2000 . من میخوام از Access97 استفاده کنم آیا راه حلی وجود داره یا نه .
مرسی .

vcldeveloper
یک شنبه 06 اردیبهشت 1383, 22:50 عصر
متاسفانه من راه دیگه ای بلد نیستم!!! :(

namazi
دوشنبه 07 اردیبهشت 1383, 08:37 صبح
علی جان مرسی تا همین جاشم راهنمائیت خیلی عالی بود :flower:
آقا کسی دیگه نمیدونه بانک ACCESS 97 رو چطوری میشه Compact کرد ؟

namazi
سه شنبه 08 اردیبهشت 1383, 09:47 صبح
آقا یعنی هیچکس راه حلی نداره ؟ :roll:

namazi
چهارشنبه 16 اردیبهشت 1383, 19:53 عصر
بعد از یک هفته موندن دستای این تاپیک توی حنا بالاخره به اینجا رسیدم :
با access97 جواب میده :


procedure TForm1.Button1Click(Sender: TObject);
var
dao : olevariant;

begin
dao := createoleobject('dao.dbengine.35');

if FileExists('maly_tmp.mdb') then
DeleteFile('maly_tmp.mdb');


dao.compactdatabase('maly.mdb' , 'maly_tmp.mdb');


if FileExists('maly_tmp.mdb') then
begin
DeleteFile('maly.mdb');
RenameFile('maly_tmp.mdb' , 'maly.mdb');
ShowMessage('فشرده سازی با موفقیت به اتمام رسید');
end
else
ShowMessage('کار فشرده سازی بانک اطلاعاتی بدرستی انجام نگرفت');


end;



ولی به یه مشکل خوردم و اون اینه که بانک من passwword داره و این کد خطای not a valid password رو میده آیا کسی راه حلی داره
ممنونم .