ورود

View Full Version : سوال: انتقال یک جدول از یک بانک به بانک دیگه



sara66
یک شنبه 03 مرداد 1389, 13:24 عصر
سلام تو دلفی انتقال یک جدول از بانک اکسس به یک بانک اکسس دیگه امکانش هست ؟
یا یک جدول را به یک دیتابیس جدید انتقال داد یعنی یک دیتابیس جدید ساخت و جدول را از اون دیتابیس به این انتقال داد ؟

sara66
دوشنبه 04 مرداد 1389, 10:16 صبح
نمیشه ؟؟؟؟؟؟؟ باید رکورد به رکرود بخونم و تو اون یکی ذخیره کنم ؟؟؟؟!!!!!!!!!!!!!!!

vcldeveloper
دوشنبه 04 مرداد 1389, 14:15 عصر
ربطی به دلفی نداره؛ یا Access خودش امکانی اختصاصی برای این کار بهتون ارائه میکنه، یا اینکه مثل هر منبع داده دیگه ایی، داده هایش را می خوایند و در یک منبع داده دیگه ثبت می کنید.

دلفی زبان برنامه نویسی شما ست، نه نرم افزار مدیریت بانک اطلاعاتی شما.

Saeed_m_Farid
دوشنبه 04 مرداد 1389, 16:00 عصر
دلفی زبان برنامه نویسی شما ست، نه نرم افزار مدیریت بانک اطلاعاتی شما.
علی آقا اینقدر سخت نگیرید، با اجازه تون :
شما کافیه یه SELECT INTO بنویسید که داده ها رو از جدول اصلی تون بخونه و با عبارت IN مسیر بانک اطلاعات دومی رو بهش بدین، مثلاً اگه فرض کنیم بانک مبدا C:\SourceDB.mdb و بانک مقصد C:\DestinationDB.mdb باشند و هیچ کدومشون هم پسورد نداشته باشن، میشه یه چیزی مثل کد زیر :
with TADOQuery.Create(nil) do try
ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source='
+ 'C:\SourceDB.mdb'
+ ';Persist Security Info=False';
SQL.Text := 'SELECT [Table1].* INTO [Table1] IN '
+ QuotedStr('C:\DestinationDB.mdb')
+ ' FROM [Table1]';
ExecSQL;
finally
Free;
end;

البته همه اینها به شرطی هست که جدول تو بانک مقصد موجود نباشه.

sara66
دوشنبه 04 مرداد 1389, 16:42 عصر
آقای کشاورز شما متوجه منظور من نشدید این کار که گفتم با کد نویسیه
آقای Saeed_m_Farid (http://barnamenevis.org/forum/member.php?u=41415) مرســــــــــــــــــــــ ـــــــــــــــــــــــــ ــــــــــــی
فکر نمیکردم بشه اونم با دستور اس کیو ال به این راحتی
فقط یک سوال نمیشه بانک مقصد را درست کرد ؟ C:\DestinationDB.mdb وجود نداشته باشه و با کد نویسی درست بشه و بعد تیبل ایمپورت بشه ؟ اگه میشه آیا باید روی کامپیوتر کسی که با نرم افزار کار می کنه اکسس نصب باشه ؟

vcldeveloper
دوشنبه 04 مرداد 1389, 18:17 عصر
علی آقا اینقدر سخت نگیرید، با اجازه تون :
همونطوری که گفتم، این مورد به دلفی مربوط نمیشه، کدی هم که شما به صورت SELECT INTO، با اون Syntax خاص نوشتید، ارتباطی به دلفی نداره، و قابلیتی هست که MS Access ارائه میکنه. دلفی صرفا دستور SQL نوشته شده را از طریق درایور مربوطه به بانک اطلاعاتی ارسال میکنه، حالا اینکه بانک اطلاعاتی مربوطه چه دستوراتی رو با چه Syntaxایی پشتیبانی میکنه، به اون بانک خاص مربوط میشه، و به دلفی ربطی نداره. ایشون باید برای اینجور قابلیت های خاص Access به منابع Access رجوع کنند.

khazaie01
سه شنبه 05 مرداد 1389, 14:25 عصر
سلام دوستان
با اجازه :



uses
ComObj;

...

function CreateAccessDatabase(FileName: string): string;
var
cat: OLEVariant;
begin
Result := '';
try
cat := CreateOleObject('ADOX.Catalog');
cat.Create('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + FileName + ';');
cat := NULL;
except
on e: Exception do Result := e.message;
end;

...

end;

Saeed_m_Farid
سه شنبه 05 مرداد 1389, 14:47 عصر
همونطوری که گفتم، این مورد به دلفی مربوط نمیشه، کدی هم که شما به صورت SELECT INTO، با اون Syntax خاص نوشتید، ارتباطی به دلفی نداره، و قابلیتی هست که MS Access ارائه میکنه.
مگه من خلاف این رو گفتم؟ من خواهش کردم سخت نگیرید و اجازه بدین جواب سوال ایشون رو بدم والا مطمئناً سینتکس مربوط به دلفی نیست ولی احساس کردم میشه تو بخش بانک های اطلاعاتی در Delphi یکی همچین سوالی رو مطرح کنه، ممنون از اینکه حوصله به خرج میدین ...


فقط یک سوال نمیشه بانک مقصد را درست کرد ؟ C:\DestinationDB.mdb وجود نداشته باشه و با کد نویسی درست بشه و بعد تیبل ایمپورت بشه ؟ اگه میشه آیا باید روی کامپیوتر کسی که با نرم افزار کار می کنه اکسس نصب باشه ؟
چرا میشه، لازم هم نیست اکسس نصب باشه، بصورت پیش فرض Microsoft.Jet.OLEDB رو ویندوز هست؛ برای ایجاد بانک (نمیدونم کدش قبلاً تو فروم بوده یا نه!) یه راهش اینه که شما از TADOXCatalog استفاده کنید، نمیخوام زیاد طولانی کنم توضیحاتش رو که این کلاس چی هست، من یه زمان لازمم شد و پکیج اش رو درست کردم و واستون ضمیمه می کنم؛ شما پکیج رو نصب کنید (دابل کلیک روی ADOX_PKG.dpk) و بعد کد زیر فکر کنم جواب بده (اینجا دلفی ندارم امتحان کنم)؛ این کد یه دیتابیس درست میکنه و برای نمونه یه جدول Setting هم تو این بانک درست کردم، بازم اگه مشکلی بود بگید :
// uses ADOX_TLB, ADODB
function CreateDBResource: Boolean;
var
dbName,
ConnString : string;
adoConn : TADOConnection;
adoXCtlgTrm: TADOXCatalog;
adoCmd : TADOCommand;
curDir : String;
begin
dbName := GetCurrentDir+'\DestinationDB.mdb';
Result := false;
try
if not FileExists(dbName) then begin
ConnString :=
'Provider=Microsoft.Jet.OLEDB.4.0' +
';Data Source=' + dbName +
';Jet OLEDB:Engine Type=4';
adoXCtlgTrm := TADOXCatalog.Create(nil);
if Assigned( adoXCtlgTrm ) then
try
adoXCtlgTrm.Create1(ConnString);
Result := true;
finally
FreeAndNil( adoXCtlgTrm );
end;
adoConn := TADOConnection.Create(nil);
adoConn.ConnectionString := ConnString;
adoConn.LoginPrompt := False;
adoCmd := TADOCommand.Create(nil);
adoCmd.Connection := adoConn;
if not IsTableExist('SETTING') then begin
adoCmd.CommandText := ' CREATE TABLE SETTING(hTitle Varchar(32) Not Null,' +
' hValue Varchar(64))';
adoCmd.Execute;
end;
end;
except on ex:Exception do begin
ShowMessage('Exception on CreateDBResource: '+ex.Message);
Result := False;
end;
end;
FreeAndNil(adoConn);
FreeAndNil(adoXCtlgTrm);
FreeAndNil(adoCmd);
end;

Saeed_m_Farid
سه شنبه 05 مرداد 1389, 14:53 عصر
@khazaie01 : من موقع زدن ارسال، پست شما رو ندیدم؛ واسه این کد لازم نیست هیچ پکیجی نصب کرد؟ خودتون امتحان کردین که همین دوخط بدون هیچ پیش نیازی کار میکنه؟
جالب بود، مرسی.

khazaie01
سه شنبه 05 مرداد 1389, 17:27 عصر
@khazaie01 : من موقع زدن ارسال، پست شما رو ندیدم؛ واسه این کد لازم نیست هیچ پکیجی نصب کرد؟ خودتون امتحان کردین که همین دوخط بدون هیچ پیش نیازی کار میکنه؟
جالب بود، مرسی.
یادم رفت بگم ، ComObj را به Uses اضافه کنید.
بله کار می کنه و دارم استفاده می کنم.

vcldeveloper
سه شنبه 05 مرداد 1389, 18:51 عصر
واسه این کد لازم نیست هیچ پکیجی نصب کرد؟
فرقش در Early-binding و Late-Binding هست. شما رفتید Type Library مربوطه رو Import کردید. این باعث میشه که کد شما از Early-Binding استفاده کنه، و در زمان کد نویسی هم Code Completion دارید. کد آقای khazaie01 (http://www.barnamenevis.org/forum/member.php?u=63416) از Late-Binding استفاده میکنه، و در زمان کامپایل هیچی مشخص نیست. شما به جای cat.Create هر چی بنویسید، کامپایلر ازتون ایراد نمیگره، چون نوع داده مربوط به cat و اینکه از چه متدهایی پشتیبانی میکنه در زمان اجرا مشخص میشه. از نظر Performance و کاهش احتمال خطا، Early-Binding بهتر هست، ولی انعطاف پذیری Late-Binding بیشتر هست.

در ضمن، در کدتون هیچ وقت از GetCurrentDir به اون شکل استفاده نکنید، چون هیچ تضمینی وجود نداره که Current Dir حتما مسیر فایل EXE شما باشه! برای ارجاع به مسیر فایل EXE از یکی از دو روش زیر استفاده کنید:

ExtractFilePath(Application.ExeName);

یا


ExtractFilePath(ParamStr(0));