ورود

View Full Version : سوال: ADO connection دايناميك ؟



majidmir
چهارشنبه 26 خرداد 1389, 13:22 عصر
سلام
چطوري بايد بعد از كامپايل برنامه تنظيمات ADO connection رو تنظيم كرد براي مثال موقعي كه من از SQL SERVER استفاده ميكنم نام سرور و نام بانك رو چطوري بايد به برنامه كه كامپايل شده بدم و برنامه اجرا بشه ؟ فقط تا اين حد ميدونم كه بايد از فايل استفاده بشه ولي چطوري ؟‌

Saeid59_m
چهارشنبه 26 خرداد 1389, 17:31 عصر
این که خیلی ساده است .
من توی برنامه هام این اطلاعات رو توی فایل نمی گذارم . بلکه همون اول برنامه اگه ارتباط با SERVER برقرار نشد نام سرور و یوزر و پسورد رو میگیرم و توی ConnectionString کامپوننت ADO Connection می گذارم


Try
MyData.ADOConnection1.Close;
Sw1:='Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=FullData;Data Source='+SERVER_NAME;
MyData.ADOConnection1.ConnectionString:=Sw1;
MyData.ADOConnection1.Open;
Except
HaveE:=true;
end;

majidmir
چهارشنبه 26 خرداد 1389, 21:07 عصر
سلام
این کد رو گیر اوردم ولی مشکلم اینه که من از Use Windows NT ...... استفاده مکنم نه از یوزر و پسورد ؟ باید توی این کد کدوم قسمت ها رو تغییر بدم ؟ در ضمن اگه میشه یه توضیحی رو هم در مورد این کد بدید :چشمک:

procedure TForm1.FormCreate(Sender: TObject);
var
strConnection:String;
Ini1:TIniFile;
strServer,strUserName,strPassword:String;
begin
Ini1:=TIniFile.Create(ExtractFilePath(Application. ExeName)+'settings.ini');

// Ini1.WriteString('DatabaseSettings','Server','.\WI NCC');

strServer:=Ini1.ReadString('DatabaseSettings','Ser ver','');
strUserName:=Ini1.ReadString('DatabaseSettings','U serName','sa');
strPassword:=Ini1.ReadString('DatabaseSettings','P assword','');
Ini1.Free;

strConnection:='Provider=SQLOLEDB.1;Password='+str Password+';Persist Security Info=True;User ID='+strUserName+';Initial Catalog=PhoneBook;Data Source='+strServer;

ADOConnection1.ConnectionString:=strConnection;

try
ADOConnection1.Connected:=True;
except
ShowMessage('ÊäÙíãÇÊ ÇÊÕÇá ÇÔÊÈÇå ÇÓÊ');
Application.Terminate;
end;

ADOTable1.Active:=True;
end;

majidmir
پنج شنبه 14 مرداد 1389, 13:07 عصر
کسی نبود ما رو راهنمایی کنه ؟

Felony
پنج شنبه 14 مرداد 1389, 14:04 عصر
میتونید در اولین اجرا پنجره Connection رو به کاربر نمایش بدید و بعد اطلاعات وارد شده توسط کاربر رو برای استفاده برنامه در اجراهای بعدی داخل رجیستری یا یک فایل ذخیره کنید :
ADOConnection1.ConnectionString:= PromptDataSource(Self.Handle, '');

bmanfy
پنج شنبه 14 مرداد 1389, 14:40 عصر
همانطور كه دوستمون در كد بالا گفتن :
ADODB رو در بخش Uses اضافه كن .
بعدش هم از كد زير براي گرفتن connectionString استفاده كن .


Var CS:String;
Begin
CS:=PromptDataSource(Self.Handle, '');
End;


با كد بالا همون پنجره ساخت كانكشن اجرا خواهد شد .
خوب حالا كانكشن داخل متغيير CS قرار گرفته . و هر كاري دوست داري با اون انجام بده.
كه در اين مرحله شما درون يك فايل متني دخيرش ميكني و هميشه در ابتداي برنامه كانكشن رو از فايل ميخوني .


var TF:TextFile;
begin
if cs<> '' then
begin
AssignFile(TF, extractFilePath(Application.ExeName)+'config.txt') ;
Rewrite(TF);
Writeln(tf, cs);
CloseFile(TF);
end;
end;



فقط من يه سوال دارم از دوستان :
اينكه ما امنيت اين فايل رو به چه شكل تضمين كنيم . يعني غير قابل دسرس باشه و كسي نتونه از اون استفاده كنه .
معمولا اطلاعات تبديل به كد ميكنيد ؟ يا از روش خاص و مطمئن تري استفاده ميكنيد ؟

Felony
پنج شنبه 14 مرداد 1389, 17:52 عصر
فقط من يه سوال دارم از دوستان :
اينكه ما امنيت اين فايل رو به چه شكل تضمين كنيم . يعني غير قابل دسرس باشه و كسي نتونه از اون استفاده كنه .
معمولا اطلاعات تبديل به كد ميكنيد ؟ يا از روش خاص و مطمئن تري استفاده ميكنيد ؟
اطلاعات رو تبدیل به کد میکنیم و در رجیستری یا انتهای فایل exe خود برنامه مینویسیم .

bmanfy
پنج شنبه 14 مرداد 1389, 23:29 عصر
ممنون .
رجيستري خب بلدم .
اما اينكه گفتي در انتهاي فايل برنامه چه طوري ؟
يعني اينكه اندازه فايل برنامه رو ميدونيم . بعد در انتها اضافه ميكنيم . . دوباره از همونجا بخونيم ؟
به همين شكل ؟ فايل خراب نميشه ؟

Felony
جمعه 15 مرداد 1389, 06:10 صبح
ممنون .
رجيستري خب بلدم .
اما اينكه گفتي در انتهاي فايل برنامه چه طوري ؟
يعني اينكه اندازه فايل برنامه رو ميدونيم . بعد در انتها اضافه ميكنيم . . دوباره از همونجا بخونيم ؟
به همين شكل ؟ فايل خراب نميشه ؟

با فایل اجرایی خود برنامه نمیتونید این کار رو بکنید چون در حال اجرا هست ، میتونید در انتهای یکی از DLL های برنامه یا اگر برنامتون فایل exe دیگه ای داره و در حال اجرا نیست از اون استفاده کنید .

Mahmood_M
جمعه 15 مرداد 1389, 11:47 صبح
راه دیگه ای هم برای تنظیم کردن ConnectionString هست ، می تونید برای گرفتن تنظیمات از کاربر به جای نمایش دادن پنجره ی ConnectionString یک پنجره ی دلخواه بسازید و با StringReplace مقادیر دلخواه رو در ConnectionString که یک مقدار رشته ای هست قرار بدید ، به عنوان مثال کد زیر مسیر فایل بانک اطلاعاتی رو از کاربر می گیره و در قسمت "Data Source" قرار میده :
ADOConnection.ConnectionString := StringReplace(ADOConnection.ConnectionString, 'Data Source=', 'Data Source='+Edit1.Text, []);
ADOConnection.Connected := True;
برای سایر مقادیر ConnectionString هم می تونید همین کار رو انجام بدید ، فقط باید یک بار یک ConnectionString کامل شده رو ببینید و بدونید که هر قسمت از اون برای چه تنظیماتی هست ...

برای ذخیره ی تنظیمات هم علاوه بر راه های گفته شده میشه هر قسمتی که از کاربر گرفته میشه رو در یک فایل INI ذخیره کرد و در شروع برنامه ConnectionString رو کامل کرد ، راه دیگه هم اینه که اطلاعات هر قسمت رو به صورت Record در یک فایل ذخیره کنیم ( یک فایل DAT )

موفق باشید ...

bmanfy
جمعه 15 مرداد 1389, 12:52 عصر
برای ذخیره ی تنظیمات هم علاوه بر راه های گفته شده میشه هر قسمتی که از کاربر گرفته میشه رو در یک فایل INI ذخیره کرد و در شروع برنامه ConnectionString رو کامل کرد ، راه دیگه هم اینه که اطلاعات هر قسمت رو به صورت Record در یک فایل ذخیره کنیم ( یک فایل DAT )


فايل ini مگه يك فايل متني نيست ؟ و به راحتي قابل نمايش نيست ؟
Dat رو هم هر كسي بخواد فكر كنم بتونه به راحتي بخونه .
نميشه تبديل كرد به يك فايل DLL ؟

Felony
جمعه 15 مرداد 1389, 14:13 عصر
نميشه تبديل كرد به يك فايل DLL ؟
یعنی چی تبدیلش کرد به DLL ؟
شما با ساختار DLL ها آشنایی دارید ؟ منطورتون از تبدیل به DLL که تغییر ظاهری پسوند نیست ... ؟!
چه در ini و جه در dat و چه در DLL باید رشتتون کد بشه .

bmanfy
جمعه 15 مرداد 1389, 23:43 عصر
یعنی چی تبدیلش کرد به DLL ؟

منظورم مثل همون فايل هاي Dll معموليه كه ميسازيم و يك سري از توابع رو درون اونها قرار ميديم . بتونيم رشته ارتباطي رو هم درون يك فايل با اين شكل قرار بديم . و البته خب به صورت پويا باشه .
اخه يك دفعه يه كسي همچين چيزي گفت . گفتم شايد راهي داشته باشه .


شما با ساختار DLL ها آشنایی دارید ؟ منطورتون از تبدیل به DLL که تغییر ظاهری پسوند نیست ... ؟!

:خجالت: البته من فعلا براي اينكه ظاهر كار حفظ بشه رشته رو تبديل به كد ميكنم و پسوند فايل رو تغيير ميدم .

homayoun_sa
سه شنبه 19 مرداد 1389, 14:43 عصر
سلام
این کد رو گیر اوردم ولی مشکلم اینه که من از Use Windows NT ...... استفاده مکنم نه از یوزر و پسورد ؟ باید توی این کد کدوم قسمت ها رو تغییر بدم ؟ در ضمن اگه میشه یه توضیحی رو هم در مورد این کد بدید :چشمک:
;
end;[/code]


نمی دونم شما عزیزان از چه نسخه ای از دلفی استفاده می کنید ولی در دلفی 7
یک کامپونت هست که نام همون سیستم رو می ده به این نام IdIPWatch
که می تونید اون را جایگزین نام سرور در فایل connection کنید (البته اگر از احراز هویت ویندوز استفاده می کنید در SQL) , ضمنا من از بحث اینطور متوجه شدم که می خواهید connection string را مخفی نگهداری کنید, چه ایرادی داره نام سرور , توع دسترسی , دیتابیس های مورد نظرتون به از فایل txt بخونید و هر وقت لازم شد بدون ارتباط با نرم افزار میزبان اون را تغییر بدید

majidmir
چهارشنبه 20 مرداد 1389, 12:27 عصر
سلام
من این کد رو توی پست شماره 3 گذاشتم ولی کسی توجهی نکرد یه بار دیگه میزارم امیدوارم که توجه کنید و فقط روی این کد کار کنید

procedure TForm1.FormCreate(Sender: TObject);
var
strConnection:String;
Ini1:TIniFile;
strServer,strUserName,strPassword:String;
begin
Ini1:=TIniFile.Create(ExtractFilePath(Application. ExeName)+'settings.ini');

// Ini1.WriteString('DatabaseSettings','Server','.\WI NCC');

strServer:=Ini1.ReadString('DatabaseSettings','Ser ver','');
strUserName:=Ini1.ReadString('DatabaseSettings','U serName','sa');
strPassword:=Ini1.ReadString('DatabaseSettings','P assword','');
Ini1.Free;

strConnection:='Provider=SQLOLEDB.1;Password='+str Password+';Persist Security Info=True;User ID='+strUserName+';Initial Catalog=PhoneBook;Data Source='+strServer;

ADOConnection1.ConnectionString:=strConnection;

try
ADOConnection1.Connected:=True;
except
ShowMessage('ÊäÙíãÇÊ ÇÊÕÇá ÇÔÊÈÇå ÇÓÊ');
Application.Terminate;
end;

ADOTable1.Active:=True;
end;

خوب حالا دوستان این چند تا موضوع رو واسه من مشخص کنید !
اگه من از حالت خود ویندوز استفاده کنم (اعتبار سنجی منظورمه)باید این کد رو تغییر بدم ؟ چطور و کجاش رو ؟
اگه بخوام به صورت شبکه ای ازش استفاده کنم چی؟ منظورم اینه که بانکم رو بزارم توی سیستم شماره 1 و برنامم توی سیستم شماره 2 و شماره 3 ؟ اونوقت باید تنظیمات این کد چی بشه ؟ لطف کنید ساده ترین و کاربردی ترین روش رو بگید

khoshblagh
سه شنبه 27 مهر 1389, 07:36 صبح
راه دیگه ای هم برای تنظیم کردن ConnectionString هست ، می تونید برای گرفتن تنظیمات از کاربر به جای نمایش دادن پنجره ی ConnectionString یک پنجره ی دلخواه بسازید و با StringReplace مقادیر دلخواه رو در ConnectionString که یک مقدار رشته ای هست قرار بدید ، به عنوان مثال کد زیر مسیر فایل بانک اطلاعاتی رو از کاربر می گیره و در قسمت "Data Source" قرار میده :
ADOConnection.ConnectionString := StringReplace(ADOConnection.ConnectionString, 'Data Source=', 'Data Source='+Edit1.Text, []);
ADOConnection.Connected := True;
برای سایر مقادیر ConnectionString هم می تونید همین کار رو انجام بدید ، فقط باید یک بار یک ConnectionString کامل شده رو ببینید و بدونید که هر قسمت از اون برای چه تنظیماتی هست ...

برای ذخیره ی تنظیمات هم علاوه بر راه های گفته شده میشه هر قسمتی که از کاربر گرفته میشه رو در یک فایل INI ذخیره کرد و در شروع برنامه ConnectionString رو کامل کرد ، راه دیگه هم اینه که اطلاعات هر قسمت رو به صورت Record در یک فایل ذخیره کنیم ( یک فایل DAT )

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



if dlgGiveFile.Execute then begin




if FileExists(dlgGiveFile.FileName) then begin

edtFileName.Text:=dlgGiveFile.FileName;
end
end;
conImportExcel.Close ;
conImportExcel.ConnectionString := StringReplace(conImportExcel.ConnectionString, 'Data Source=', 'Data Source='+edtFileName.Text, []);
conImportExcel.Connected := True;
conImportExcel.open;


ولی در عمل باعث میشود که هم نام فایل و مسیر جدید و هم نام فایل قبلی هر دو در مسیر قرار بگیرند.و در نتیجه خطای مسیر نامعتبر نمایش داده میشود.خواهشمندم از دوستان علت آن و همچنین روش اصلاح آنرا اعلام نماید.متشکرم

alinikaein
سه شنبه 27 مهر 1389, 07:58 صبح
سلام دوست عزيز؛

شما يك فايل متني با Notepad ويندوز ايجاد كنيد و اون را با پسوند udl ذخيره كنيد. حالا بر روي فايلي كه ساختيد كليك كنيد. مي‌بينيد كه خود ويندوز به صورت اتوماتيك پنجره‌ي مربوط به تنظيم كانكشن را نشون مي‌ده.

داخل برنامه هم كافيه در هنگامي كه فرم ديتابيس شما ساخته مي‌شه، از كد زير استفاده كنيد:

ADOConnection1.ConnectionString := 'FILE NAME=MyFile.udl';

يا علي... موفق باشيد...

khoshblagh
سه شنبه 27 مهر 1389, 08:55 صبح
سلام دوست عزيز؛

شما يك فايل متني با Notepad ويندوز ايجاد كنيد و اون را با پسوند udl ذخيره كنيد. حالا بر روي فايلي كه ساختيد كليك كنيد. مي‌بينيد كه خود ويندوز به صورت اتوماتيك پنجره‌ي مربوط به تنظيم كانكشن را نشون مي‌ده.

داخل برنامه هم كافيه در هنگامي كه فرم ديتابيس شما ساخته مي‌شه، از كد زير استفاده كنيد:

ADOConnection1.ConnectionString := 'FILE NAME=MyFile.udl';

يا علي... موفق باشيد...
با تشکر از پاسختان
این روش برای کاربران برنامه که اطلاعات محدودی دارند مناسب نیست . متشکرم

alinikaein
سه شنبه 27 مهر 1389, 10:15 صبح
با تشکر از پاسختان
این روش برای کاربران برنامه که اطلاعات محدودی دارند مناسب نیست . متشکرم

آهان، خوب هدف شما چيه؟ مي‌شه دقيق‌تر بگيد چي مي‌خوايد تا شايد راه حل مناسب‌تري به شما بگيم؟

يا علي... موفق باشيد...

khoshblagh
سه شنبه 27 مهر 1389, 12:28 عصر
آهان، خوب هدف شما چيه؟ مي‌شه دقيق‌تر بگيد چي مي‌خوايد تا شايد راه حل مناسب‌تري به شما بگيم؟

يا علي... موفق باشيد...
در حقیقت کاربر باید بتواند با انتخاب یک فایل اکسل اطلاعات درون آن را به داخل یک جدول اکسس انتقال دهد. از آنجایکه نام فایل اکسل ثابت نیست پس باید از طریق opendialog فایل مورد نظر را انتخاب و سپس نسبت به انتقال اطلاعات آن فایل اقدام نماید. مشکل این است که اسم فایل ثابت نیست پس باید نام در یک متغیر به کانکشن پاس شود.متشکرم

Mahmood_M
یک شنبه 02 آبان 1389, 20:51 عصر
در حقیقت کاربر باید بتواند با انتخاب یک فایل اکسل اطلاعات درون آن را به داخل یک جدول اکسس انتقال دهد. از آنجایکه نام فایل اکسل ثابت نیست پس باید از طریق opendialog فایل مورد نظر را انتخاب و سپس نسبت به انتقال اطلاعات آن فایل اقدام نماید. مشکل این است که اسم فایل ثابت نیست پس باید نام در یک متغیر به کانکشن پاس شود.متشکرم
مگر راه حل برای این مشکلتون ارائه نشد ؟!

iman_Delphi
یک شنبه 02 آبان 1389, 21:53 عصر
بهترين راه اينه كه همون موقع يك فايل udl بسازي و براي كاربر باز كني تا كاربر خودش تنظيمات اتصال رو انجام بده
و به نظر من پرسيدن اسم سرور و مسير و غيره خيلي محكم نيست

khoshblagh
دوشنبه 03 آبان 1389, 06:58 صبح
مگر راه حل برای این مشکلتون ارائه نشد ؟!
با سلام خدمت شما
همانطور که در پست شماره 16 عرض کردم :

ولی در عمل باعث میشود که هم نام فایل و مسیر جدید و هم نام فایل قبلی هر دو در مسیر قرار بگیرند.و در نتیجه خطای مسیر نامعتبر نمایش داده میشود.خواهشمندم از دوستان علت آن و همچنین روش اصلاح آنرا اعلام نماید.متشکرم

Mahmood_M
دوشنبه 03 آبان 1389, 10:26 صبح
با سلام خدمت شما
همانطور که در پست شماره 16 عرض کردم :
ولی در عمل باعث میشود که هم نام فایل و مسیر جدید و هم نام فایل قبلی هر دو در مسیر قرار بگیرند.و در نتیجه خطای مسیر نامعتبر نمایش داده میشود.خواهشمندم از دوستان علت آن و همچنین روش اصلاح آنرا اعلام نماید.متشکرم
ولی توی عکسی که قرار دادید مشکل از آدرس فایل هست ، نه اینکه آدرسها با هم ترکیب میشن ، شما توی مسیر برنامتون پوشه ای با نام " demo.xls " دارید ؟! اگه دارید نامش رو به " demo " یا ... تغییر بدید ، در غیر اینصورت مسیرتون معتبر نیست ، demo.xls به عنوان فایل درنظر گرفته میشه ...

khoshblagh
دوشنبه 03 آبان 1389, 12:48 عصر
ولی توی عکسی که قرار دادید مشکل از آدرس فایل هست ، نه اینکه آدرسها با هم ترکیب میشن ، شما توی مسیر برنامتون پوشه ای با نام " demo.xls " دارید ؟! اگه دارید نامش رو به " demo " یا ... تغییر بدید ، در غیر اینصورت مسیرتون معتبر نیست ، demo.xls به عنوان فایل درنظر گرفته میشه ...
با سلام خدمت شما
در حقیقت اگر به عکس مورد نظر نگاه کنید نام دو فایل اکسل مشاهده میشود که من فایل دوم را در موقع تعریف اولیه adoConnection برای ست نمودن آن بکار برده ام ولی فایل اولی را از طریق open dialog به نمونه کدی که شما در پستهای قبلی پیشنهاد داده بودید ست نمودم . این باعث میشود که هر دو فایل با هم به عنوان سورس نمایش داده و خطای فوق ایجاد شود. در حقیقت باید کد مربوطه را طوری اصلاح کرد که وقتی از طریق open dialog فایلی انتخاب شد نام آن فایل جایگزین فایل اولیه گردد.متشکرم

khoshblagh
سه شنبه 04 آبان 1389, 06:53 صبح
با سلام خدمت دوستان
مشکل حل شد. علت مربوط به بخش اول StringReplace بود که میبایست اسم فایل اولیه به آن اضافه میشد. متشکرم.


StringReplace(conImportExcel.ConnectionString, 'Data Source=', 'Data Source='+edtFileName.Text,