۱۳۸۸ اردیبهشت ۹, چهارشنبه

نوعی دیگر در نصب دیتابیس همراه با Setup برنامه

سلام
گاهی پیش میاد که لازمه دیتابیس هم همراه با برنامه نصب بشه.یکی از راههای ممکن استفاده از مقاله خانم بیتا هست.اون روش به اندازه کافی کارآمد هست اما من اینجا یه روشی رو میگم که شما خوده دیتابیس رو Attach میکنین.شاید لازم بوده مقادیر اولیه ای رو داخل دیتابیس قرار بدین در این روش دیگه لازم نیست اسکریپت اضافه کردن این مقادیر اولیه رو بنویسین بلکه سر و کار ما با خوده فایل دیتا بیس هست.
نکته کلیدی در این پروژه استفاده از SQL Server Management Objects (SMO) هست . SMO راهی است برای مدیریت اشیای SQL Server .برای این مدیریت اصلا لازم نیست از دستورات SQL استفاده بشه بلکه دات نت همه کارها رو برای ما میکنه. ما میتونیم دیتابیس ایجاد کنیم. درونش جدول و یا Store Procedure ایجاد کنیم و ...
خوب برای رسیدن به هدف پروژمون یه پروژه ساده بسازین که یه گرید داشته باشه و اونم یه یکی از جداول دیتابیس مورد نظر شما وصل باشه. برنامتون رو یه دور تست کنین و مطوئن بشین که همه چیز به درستی کار میکنه .
خوب برای یک Custom Install یک کلاس Installer به پروژتون اضافه کنین. خوب ما فرض میکنیم که اون دیتابیس در پوشه ای به نام DB کنار برنامه اصلی هست (اگر فیلم آموزشی خانم بیتا رو ببینین میبینین که میشه یه پارامتر تعریف کرد برای مسیر دیتابیس و دیتابیس رو تو اون مسیر ریخت من این مورد رو به عهده خودتون میذارم) . کاری که انجام میدیم اینه که با استفاده از Reflection مسیر فایل اجرایی رو بدست میاریم و فایلهای دیتابیس رو که درون فلدر DB کنار پروژه هست رو با استفاده از SMO به نمونه نصب شده SQL Server اتچ میکنه. نکته ای که هست من کار اتچ کردن دیتابیس رو درون رویداد Install نوشتم چون میخواستم مطمئن بشم فایلهای دیتابیس که درون پروژه ست آپ هست ( در ادامه توضیح میدم) حتما در جای مناسب کپی شدن. برای اطلاع از جزئیات Install به MSDN مراجعه کنین. برای UnInstall کردن برنامه هم دیتابیس رو Detach میکنیم.. کدها به اندازه کافی معلوم هستن .

[RunInstaller(true)]


public partial class Installer1 : Installer


{


string path;



public Installer1()


{


InitializeComponent();


}



private void AttachDB()


{


try


{


SqlConnection cn = new SqlConnection("Data Source=.;Initial Catalog=InstallDB;Integrated Security=True");


Assembly asm = Assembly.GetExecutingAssembly();


path = System.IO.Path.GetDirectoryName(asm.GetName().CodeBase);


path = path.Substring(6) + "\\DB\\";


Server SqlServer = new Server();


//System.Windows.Forms.MessageBox.Show(path);


string DatabaseName = "InstallDB";



ServerConnection SqlServerConnection = SqlServer.ConnectionContext;



if (SqlServer.Databases[DatabaseName] == null)


{




Database NewDatabase = new Database(SqlServer, DatabaseName);



FileGroup DatabaseFileGroup = new FileGroup(NewDatabase, "PRIMARY");


NewDatabase.FileGroups.Add(DatabaseFileGroup);



DataFile DatabaseDataFile = new DataFile(DatabaseFileGroup, DatabaseName);


DatabaseFileGroup.Files.Add(DatabaseDataFile);



DatabaseDataFile.FileName = path + "InstallDB.mdf";



LogFile DatabaseLogFile = new LogFile(NewDatabase, DatabaseName + "_log");


NewDatabase.LogFiles.Add(DatabaseLogFile);



DatabaseLogFile.FileName = path + "InstallDB_log.ldf";




NewDatabase.Create(true);


}


else


System.Windows.Forms.MessageBox.Show("این دیتابیس وجود دارد");


}


catch (Exception ex)


{


System.Windows.Forms.MessageBox.Show(ex.InnerException.InnerException.ToString());


}


}



public override void Install(System.Collections.IDictionary stateSaver)


{



base.Install(stateSaver);



//System.IO.File.Create(@"c:\t.txt");


AttachDB();


}



public override void Uninstall(System.Collections.IDictionary savedState)


{


base.Uninstall(savedState);


Server SqlServer = new Server();


string DatabaseName = "InstallDB";


if (SqlServer.Databases[DatabaseName] != null)


{


SqlServer.DetachDatabase(DatabaseName, true);


}



//Assembly asm = Assembly.GetExecutingAssembly();


//path = System.IO.Path.GetDirectoryName(asm.GetName().CodeBase);


//path = path.Substring(6) + "\\DB\\";


//System.IO.File.Delete(path + DatabaseName + ".mdf");


//System.IO.File.Delete(path + DatabaseName + "_log.ldf");


}


}



یه پروژه جدید از نوع Setup Project به سولوشن اضافه کنین .من داخل ویوی File System یک پوشه به اسم DB قرار ایجاد کردم فایلهای دیتابیس (mdf و ldf ) رو به داخل اون منتقل کرد خاصیت AlwaysCreate رو به true و DeafultLocation رو به [TARGETDIR]\DB تغییر دادم. بعد از تنظیمات مربوطه که پروژه قبلی رو ست آپ کنه به ویوی Custom Action برین و برای رویدادهای Commit و UnInstall رو (همونطوری که نمونش در فیلم آموزش خانم بیتا هست) به پروژه ای که کلاس Installer داره نسبت بدین تا در موقع اتفاق افتادن ایونتهای مورد نظر کده مورد نظر اجرا بشه . من یه تیکه کد کامنت شده نوشتم که دیتابیس رو بعد از UnInstall پاک میکنه شما هر کاری دوست دارین میتونین بکنین اعم از اینکه به پوشه ای دیگه ای منتقلشون کنین امیوارم که مفید باشه.

InstallDBWithSetup.rar

۱۳۸۸ اردیبهشت ۶, یکشنبه

DotRas

سلام
داشتم روی RAS سرچ میکردم به یه فریم ورک اپن سورس برخوردم خیلی چیزه جالبی بود اسمش DotRas هست .این پروژه داخل CodePlex هست و میتونین اطلاعات مربوطه رو از اونجا پیدا کنین. اما کارهایی که این این فریم ورک میکنه :
· تشخیص بده که آیا ارتباط برقرار هست یا نه
· تعدا بایتهای فرستاده شده و گرفته شده
· لیست کردن تمام کانکشنها اعم از دایال آپ ، VPN و ...
· برگردوندن شماره تلفن ، یورنیم ، پسورد ، شماره کشور و کلا هر چیزی که داخل پنجره Properties کانکشن وجود داره
· اتصال به دو صورت همزمان (synchronous) و عیر همزمان (asynchronous)
· نشان دادن وضعیت حین شماره گیری
· نشان دادن نوع و نام Device ای که از طریق اون وصل شدین
· و ...
فقط تنها نکته ای که هست برای باز کردن با ویژوال استودیو باید یه برنامه به اسم Microsoft.StyleCop رو قبلش نصب کنبن. بعد میتونین سورس برنامه رو که البته خیلی پیچیده هست ببینین
دانلود:
این هم لینک یه فیلم آموزشی : http://www.youtube.com/watch?v=ii7L3uXIAXM
موفق باشید

۱۳۸۸ اردیبهشت ۴, جمعه

بازم اومدی...

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

۱۳۸۸ فروردین ۱۹, چهارشنبه

RegisterHotKey و Hook (قسمت دوم)

سلامبا استفاده از رفرنس Processing Global Mouse and Keyboard Hooks in C# و یکمی تغییر برای امکان تشخیص کلید وسطی ماوس میتونید تمام کلیدهای فشرده شده و همچنین کلیدهای ماوس رو مانیتور کنین. با دیدن کد میتونین مقادیر مربوط به هر یک از دکمه های ماوس رو ببینین .این روش Hook نام داره .موفق باشید

۱۳۸۸ فروردین ۱۷, دوشنبه

RegisterHotKey و Hook (قسمت اول)

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

RegisterHotKey.pdf

UsingRegisterHotKey.rar

۱۳۸۸ فروردین ۱۲, چهارشنبه

ViewStateCompressor

از اینجا میتونین یه آموزش سریع برای فشرده کرد ViewState رو بگیرین.

YUI Compressor

از این آدرس میتونین یه آموزش سریع از YUI Compressor پیدا کنین.

YUI Compressor