# برنامه نویسی با محصولات مایکروسافت > برنامه نویسی مبتنی بر Microsoft .Net Framework > دسترسی به داده ها (ADO.Net و LINQ و ...) >  Database Helper، شروع یک پروژه ی Open Source در برنامه نویس!

## hdv212

با سلام
خبری جالب به عزیزانی که برنامه نویسی دیتابیس میکنند :
با تلاش و کوشش فراوان، و با هماهنگی ای که اینجانب(حامد وزیری) با آقای کرامتی (DelphiAssistant) به عمل آوردیم تصمیم بر این گرفتیم که ابزار Sp Generator ایشان را با ابزار Code Generator حقیر با هم ادغام کنیم.
همینطور با کوشش فراوان، سعی کردم که قابلیتی جالب را به این نرم افزار جدید اضافه نمایم که بتواند کلیه ی SP های یک دیتابیس را استخراج کرده و کد دات نت آن را تولید کند، در نهایت تمام این قابلیتها در یک ابزار، مجتمع شد و در اختیار شما عزیزان قرار گرفته خواهد شد، همچنین قصد ما بر این شد که این ابزار را به صورت Open Source منتشر کنیم، تا هم دوستان از شیوه ی کدنویسی مطلع شوند و هم در صورت امکان، کاربران بتوانند ایده های خود را روی این ابزار پیاده سازی نمایند و در آخر،در همین تاپیک قرار دهند و در احتیار سایر برنامه نویسان بگذارند، امیدواریم که این ابزار مورد توجه شما دوستان قرار بگیرد و بتوانیم با این کار، هرچند کوچک، گامی در جهت افزایش آگاهی و بهره وری شما برنامه نویسان ایران زمین برداشته باشیم، من، هم به نوبه ی خودم و هم از طرف آقای کرامتی (DelphiAssistant) پیشاپیش از حسن نظر شما تشکر میکنم و امیدوارم هرگونه کم و کاستی در این مجموعه دیدید، به بزرگی خودتون ببخشید.
توضیحات رو در یک فایل word در خود فایل قرار دادم، در مورد Sp Gen  و Code Generator میتوانید به تاپیکهای مربوطه مراجعه کنید، اما برای قابلیت Stored Procedures Code Generator میتوانید از مثالی که در همین فایل قرار داده شده است استفاده کنید.
منتظر نظرات و انتقادات و همچنین ایده های شما عزیزان هستیم.
موفق باشید.
-------------------------------------
مهدی کرامتی - حامد وزیری




نسخه ی 1.5 آماده ی دریافت میباشد، لطفا برای اطلاعات بیشتر و همچنین دریافت آن به این لینک مراجعه کنید.


نسخه ی 2.0 آماده ی دریافت شد، برای اطلاعات بیشتر لطفا به این لینک مراجعه کنید.

----------


## Alireza_Salehi

یک باگ کوچولو (مهم نیست ولی رفع بشه بهتره):
در صورتی که نام دیتاسورس حاوی کاراکترهای غیر مجاز در نام گذاری متغییر ها باشد برنامه Exception تولید می کند. (این کاراکترها در SQL Server مجاز است) و در کد ها نام namespace ها با کاراکترهای غیر مجاز تولید می شوند.

مثلا نام دیتابیس این بوده: 
C:\DATABASE.MDF

See the end of this message for details on invoking 
just-in-time (JIT) debugging instead of this dialog box.
************** Exception Text **************
System.Data.SqlClient.SqlException: Incorrect syntax near 'C:'.
   at System.Data.SqlClient.SqlConnection.OnError(SqlExc  eption exception, Boolean breakConnection)
   at System.Data.SqlClient.SqlInternalConnection.OnErro  r(SqlException exception, Boolean breakConnection)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndW  arning(TdsParserStateObject stateObj)
   at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
   at System.Data.SqlClient.SqlDataReader.ConsumeMetaDat  a()
   at System.Data.SqlClient.SqlDataReader.get_MetaData()
   at System.Data.SqlClient.SqlCommand.FinishExecuteRead  er(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
   at System.Data.SqlClient.SqlCommand.RunExecuteReaderT  ds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(  CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(  CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
   at System.Data.SqlClient.SqlCommand.ExecuteReader(Com  mandBehavior behavior, String method)
   at System.Data.SqlClient.SqlCommand.ExecuteDbDataRead  er(CommandBehavior behavior)
   at System.Data.Common.DbCommand.System.Data.IDbComman  d.ExecuteReader(CommandBehavior behavior)
   at System.Data.Common.DbDataAdapter.FillInternal(Data  Set dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
   at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
   at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, String srcTable)
   at NovinMedia.Data.DbObject.RunQuery(String Query, String tableName) in F:\Database Helper 1.0.0\MergeSpCodeGen\Classes\DbObject.cs:line 192
   at DatabaseHelper.frmMain.GenerateSqlSpAndClassCodeAn  dGetSps() in F:\Database Helper 1.0.0\MergeSpCodeGen\frmMain.cs:line 733
   at DatabaseHelper.frmMain.btnGenerateCode_Click(Objec  t sender, EventArgs e) in F:\Database Helper 1.0.0\MergeSpCodeGen\frmMain.cs:line 154
   at System.Windows.Forms.Control.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnMouseUp(MouseEventAr  gs mevent)
   at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ButtonBase.WndProc(Message& m)
   at System.Windows.Forms.Button.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.O  nMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.W  ndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

----------


## hdv212

> در صورتی که نام دیتاسورس حاوی کاراکترهای غیر مجاز در نام گذاری متغییر ها باشد برنامه Exception تولید می کند. (این کاراکترها در SQL Server مجاز است) و در کد ها نام namespace ها با کاراکترهای غیر مجاز تولید می شوند.


arsp_2004 جان ممنون از حسن توجهت، بعد از این همه سعی و تلاش، دلمون به این خوش بود که بچه ها بیان یه نظری بدن!
شما پیشقدم شدی، دستت درست.
اما در مورد باگ، منظورت اینه که در نام دیتابیس از کاراکترهای غیر مجاز در دات نت استفاده کردی ؟
مثلا فضای خالی یا $ یا ... ؟
اوووووووه، فکر شما دیتابیس شما Sql Express باشه، یا دیتابیس رو به Sql Serverات Attatch کرده باشی، درسته ؟

----------


## hdv212

دوستان، مقاله ای در مورد همین ابزار در سایت CodeProject قرار دادم، لطفا به این لینک برید و به آن Rate بدید تا در مسابقه ای که همین سایت در مورد Code Generation ترتیب داده، Rate مناسب رو به دست بیارم.
متشکرم

----------


## combo_ci

سلام دوست عزيز
اولا يه تشكر مخصوص از زحمات شما و دوستانتون دارم

راستش يكي از بچه هاي شركت چند وقت پيش يك پروژه تو مايه هاي پروژه شما نوشته بود....البته نه به تكميلي پروژه شما...
اونجا من يه پيشنهاد دادم به ايشون كه با اجازتون اينجا هم ميگم

كلاسهايي كه اين برنامه توليد ميكنه خيلي كار با db رو راحت ميكنه...اما  يه مشكل كه احتمالا شما هم بهش برخورد كردين اينه كه db  يك برنامه از ايتداي ساختنش  تا نسخه فاينال شايد 20 بار عوض بشه (حداقل يكي دو فيلد به جدول ها اضافه شه)

خوب اين يعني بعد از هر تغيير شما بايد يك بار كلاس مربوط به اوون table رو ايجاد كنه......

حالا شما اگه بتوني به برنامت اين خاصيت رو اضافه كني كه يه كلاس كلي درست بشه كه ديگه با هر تغيير db احتياج به توليد كلاس نداشته باشه....
اينم يه نمونه ساده از اين كلاس.....البته من اين كلاس رو خيلي تكميل كردم و با اووون كلاس ديگه حتا يه sp به برنامم اضافه نميكنم

اگر ايده اي داشتي بگو تا كلاس اصلي رو بزارم تا اگه خوب بود به برنامت اضافه كني
موفق باشي

----------


## hdv212

combo_ci جان ممنون از حسن توجهت
کلاس شما رو دیدم، بسیار کار تمیز و قشنگیه، تقریبا چنین لایه ای رو گزینه ی Generate Stored Procedures .. انجام میده، البته یه تفاوت عمده ای که داره اینه که اون لیست کل Stored Procedure ها رو در میاره و اینکه برای شما کدهای مربوط به عملیات CRUD هم در نظر گرفته شده.
البته من هم قبل از اینکه حتی این نسخه رو Publish کنم، دنبال کاملتر کردن لایه ی Data Access منتها هنوز وقت نکردم که این کار رو انجام بدم، اولین محدودیتی که در لایه ی DataAccess من به نظرم اومد، عدم وجود متدی بود که بتونه Transaction رو انجام بده، البته کلاس شما بسیار ایده های خوبی به من داد، چشم، سر اولین فرصت سعی میکنم، کد لایه ی Data Access رو بهینه کنم.
به نظر شما به غیر از عملیات CRUD که شما در کلاست قرار دادی،(من این عملیات رو بر عهده ی Stored Procedure ها گذاشتم)، چه آیتمهای دیگه ای باید اضافه بشه تا این کلاس، مفید تر بشه ؟
همانطور که گفتم، به نظر من اولین آیتم، ایجاد متدی برای Transaction است.
راستی یه پیشنهاد در مورد کلاس خودتون :
در متد Insert، خطوط 176 تا 178 :
if (dr.Table.Columns[i].Caption.ToLower() == "id")
	continue;
cmd.Parameters.AddWithValue("@" + dr.Table.Columns[i].Caption, dr[i]);
شما نام ستون مورد نظرت رو که احتمالا برای Identity بودن بررسی میشه، به id محدود کردی، به نظرم اگه به این صورت اصلاح بشه، بهتره :
if (dr.Table.Columns[i].AutoIncrement)
	continue;
cmd.Parameters.AddWithValue("@" + dr.Table.Columns[i].Caption, dr[i]);
موفق باشید.

----------


## vcldeveloper

> با تلاش و کوشش فراوان، و با هماهنگی ای که اینجانب(حامد وزیری) با آقای کرامتی (DelphiAssistant) به عمل آوردیم تصمیم بر این گرفتیم که ابزار Sp Generator ایشان را با ابزار Code Generator حقیر با هم ادغام کنیم.


با جناب کرامتی صحبت کنید که یا سورس کد مربوطه را به SourceForge منتقل کنند، یا یک نسخه از Subversion بر روی سرور فعلی نصب کنند تا بتونید برای این نرم افزار یک سیستم Version Control داشته باشید و بحث های خود را در این تاپیک انجام بدید. در شرایط فعلی اگر قرار باشه هر کسی برای خودش سورس را تغییر بده، یا حتی فقط شما و آقای کرامتی (بدون استفاده از یک نرم افزار Version Control) بخواید سورس را تغییر بدید، در دراز مدت به بی نظمی دچار میشید و نگهداری سورس کد براتون فوق العاده سخت میشه!

----------


## combo_ci

اينم ver 2 دوست عزيز.....
با اين كلاس ديگه احتياج به وجود sp در database نيست....

از خصوصيت هي متد insert اينه كه تشخيص ميده فيلد identity هست يا نيست...اگه نبود max(srl( از اووون table رو بدست مياره و يكي بهش اضافه ميكنه

توي ورژن قبلي اين توابع insert و update احتياج به sp داشتن اما اين كلاس خودش همه كار ها رو ميكنه......

به اوون موضوعي كه توي پست قبليم گفتم توجه كنبن.....با اضافه كردن اين كلاس به برنامه اگه 500 بار هم db عوض بشه كلاس databae هيچ تغييري نداره اما توي كار شما به تغيير يك جدول بايد sp هاي اوون جدول و كلاس db رو عوض كرد !!!!

----------


## hdv212

> اينم ver 2 دوست عزيز.....
> با اين كلاس ديگه احتياج به وجود sp در database نيست....


combo_ci جان ممنون از توجهت، این کلاس هم مثل کلاس قبلی جامع و زیبا و کامل بود.
اما استفاده ی من از Sp به خاطر Performance بالای آن در دیتابیس میباشد.
چرا Stored Procedureها دارای Performance بیشتری نسبت به Plain Text Commandها هستند ؟
پاسخ :
به خاطر اینکه، قبل از اجرای هر فرمان، Sql Server دستور یا دستورات مورد نظر را از لحاظ شیوه ی اجرا آنالیز میکند، به این عملیات Execution Plan گفته میشود، سپس دستور مورد نظر را طبق Execution Plan به دست آورده اجرا میکند، اما Sql Server برای اینکه در مراجعات بعدی برای اجرای همان دستورات، دیگر نیازی به آنالیز و استخراج Execution PLan نداشته باشد، لیکن اون رو درحافظه نگهداری و به اصطلاح Cache میکند، حالا در مورد Plain Command Textها، فرض کنید در یک برنامه ی تحت شبکه، گزارشات زیادی از یک جدول با پارامتر های مختلف توسط کاربران گرفته میشود، با توجه به اینکه دستورات در همه ی موارد یکی است و فقط پارامترهای جستجو تغییر میکند، اما Sql Server این موضوع رو تشخیص نمیدهد و با هربار درخواست اجرای دستورات مشابه، با توجه با پارامترهای مختلف، آنها را جداگانه آنالیز و Execution PLan آنها را در حافظه Cache میکند، پس از مدتی حافظه مملو از Cacheهای بی مورد و زیادی میشود که باعث پایین آمدن Performance در اجرای دستورات در سرور میشود، اما در Stored Procedure، قضیه کاملا فرق میکنه، در این نوع اجرا، Sp مورد نظر فقط یک بار آنالیز و در حافظه cache میشود، و در مراجعات بعدی، با توجه به تغییر پارامتر های ورودی، Execution Plan تغییر نخواهد کرد، لذا در تعداد Queryهای زیاد و سنگین، Sp دارای Performance غیر قابل مقایسه نسبت به Plain Textهاست.
این فقط یکی از مزیت های Sp بود. 

در مورد اینکه اگر دیتابیس عوض بشه، کلاسها هم باید عوض بشه، حرفتون درسته، ولی این کار رو برنامه براتون انجام میده، تنها با یک کلیک دوباره همه ی کلاسهای جدید تولید میشن!

----------


## combo_ci

اميدوارم كلاس بدرد دوستان بخوره ....اگه كسي از sp نوستن و تغييرات در ver هاي بعدي نرم افزار خسته شده ميتونه از اين كلاس استفاده كنه

----------


## reza_62

اگر بخواهیم در توسعه این پروژه همکاری کنیم چه جوری باید اقدام کنیم 
با تشکر

----------


## رضا عربلو

ضمن تبریک و خسته نباشید. 
پروژه شما را دیدم. یکی از مواردی که به نظرم رسید این می باشد که برنامه فوق فیلدهای AllowNull را پوشش نمی دهد.

----------


## hdv212

> اگر بخواهیم در توسعه این پروژه همکاری کنیم چه جوری باید اقدام کنیم 
> با تشکر


با سلام به شما دوست گرامی، سورس این پروژه رو ضمیمه کردم، میتونی بازش کنی و توسعه ش بدی، اگر به مشکلی برخوردی بگو تا راهنماییت کنم، یا اگر نظر خاصی داره، پیغام خصوصی بده.



> ضمن تبریک و خسته نباشید. 
> پروژه شما را دیدم. یکی از مواردی که به نظرم رسید این می باشد که برنامه فوق فیلدهای AllowNull را پوشش نمی دهد.


سلام، مرسی از شما، چشم در اولین فرصت روش کار میکنم.

----------


## reza_62

منظور من همکاری گروهی روی پروژه بود .
با تشکر

----------


## hdv212

> منظور من همکاری گروهی روی پروژه بود .
> با تشکر


اشتیاق شما و بعضی از دوستان، باعث شادی و دلگرمی من میشه، امیدوارم تعداد این دوستان بیشتر بشه، اما برای توسعه:
شما علاوه بر تسلط کافی به دات نت، بایستی به Ado.Net خصوصا Sql Server تسلط کافی داشته باشید، همینطور آشنایی با System.CodeDom برای Generate کردن کد در runTime، پیشنهاد میکنم برای آشنایی با CodeDom به مستندات مایکروسافت مراجعه کنید.
در ضمن اگه میشه در مورد نحوه ی همکاریتون بیشتر توضیح بدید، آیا نظر خاصی دارید ؟ قابلیت مفیدی مد نظرتون هست که میخواهید به برنامه اضافه کنید ؟

----------


## reza_62

آیا شما roadmap ای برای این پروژه دارید یا نه ؟ 
اگر ندارید من پیشنهاد می کنم یک چیزی مثل subsonic یا بهتر از آن را بتوانیم با پروژه شما دربیاریم !!!
یک نکته خوب در مورد کد شما ساده بودن همراه با توضیحات خوب مربوط به هر قسمت از کد می باشد که من در کمتر پروژه اپن سورسی حتی subsonic دیده ام

----------


## hdv212

> آیا شما roadmap ای برای این پروژه دارید یا نه ؟


منظورتون اینه که آیا هدف خاصی دارم ؟



> اگر ندارید من پیشنهاد می کنم یک چیزی مثل subsonic یا بهتر از آن را بتوانیم با پروژه شما دربیاریم !!!


من خودم SubSonic رو نصب کردم، مستنداتش میگه خیلی به درد بخوره، ئلی من خودم هنوز موفق نشدم باهاش کار کنم، از بس که توضیحاتش ناقص بود(شایدم من کم دقتی کردم)



> یک نکته خوب در مورد کد شما ساده بودن همراه با توضیحات خوب مربوط به هر قسمت از کد می باشد که من در کمتر پروژه اپن سورسی حتی subsonic دیده ام


دوست عزیز لطف داری شما، مشخصه که سورس نرم افزار رو با دقت داری دنبال میکنی، عالیه.
خب این ابزار با توجه به FeedBackهایی میرسه، نیاز به تغییرات و اصلاحاتی داره، مثلا کد مربوط به تولید کد Sql برای آقای کرامتی، بایستی متد Insert رو بهینه بکنیم که آخرین رکوردی رو که  وارد میشه برگردونه.
یا Load کردن آبجکت های دیتابیس برای دیتابیس های بزرگ زیاد جالب نیست، باید بهینه بشه (SqlDmo انتخاب خوبی برای این کار نبود، لااقل به این شکل نه)
مشکلاتی که برای نامهای غیر استاندارد داره باید حل بشه، و خیلی چیزای دیگه.
متاسفانه من هنوز به دلیل مشغله ی کاری وقت نکردم این کار رو بکنم، ولی در اولین فرصت حتما یه دست به سر و روی این ابزار خواهم کشید و در این راه دست همه ی دوستان رو به گرمی میفشارم.
موفق باشید.

----------


## reza_62

در مورد roadmap منظورم این بود که چه ایتم های را برای ورژنهای بعدی این ابزار در نظر داری که اگر خواستی من و بقیه دوستان روی آن کار کنیم البته یه مقدار توضیح دادی ولی اگر کامل مشخص کنی برای ورژن بعدی ابزار چه چیزهایی لازم است تا ما روی آن کار کنیم
با تشکر

----------


## hdv212

برای شروع میتونی بر روی استورد پروسیجر Insert کار کنی، و کدش رو تغییر بدی، که به جای برگرداندن identity آخرین رکورد Insert شده، اونم به صورت Int (که اشتباهه، چون ممکنه PK جدولی از نوع Int نباشه)، آخرین رکورد Insert شده رو برگردونه،آفرین، برو جلو ببینیم چکار میکنی.

----------


## release2008

من وقتی فایل را extract کردم و می خواستم برم  داخل پوشه پیغام زیر ظاهر می شه؟ به نظرتون از چی می تونه باشه؟

----------


## hdv212

یا آنتی ویروس شما مشکل داره، و یا اینکه سیستم شما آلوده به این کرم های اینترنتی شده که مرتب پیغام میدن سیستم شما دارای تروجان یا ویروس است و ...

----------


## hdv212

ورژن 1.5 ابزار Database Helper آماده شد.
با توجه به مشکلاتی که خودم در حین کار بهش برخورد میکردم، تصمیم گرفتم که تا سر حد امکان اونها رو حل کنم.
یکی از این مشکلات عمده، کد T-Sql مربوط به StoredProcedure ای بود که برای Insert ساخته میشد، توی این کد پس از Insert، آخرین Identidy اضافه شده رو (یعنی pk رکورد insert شده رو) به Caller بر میگردوند که این فقط در صورتی درست کار میکرد که PrimaryKey جدول ما یک فیلد int باشه و برای جداولی که pk های غیر از int دارند به درد نمیخورد، به خاطر همین، کد T-Sql ای که برای این عمل تولید میشد رو اصلاح کردم و با استفاده از یک تکنیک ساده، pk رکورد insert شده رو (چه int و identity باشه و چه کاراکتری و یا uniqueidentifier) به Caller برمیگردونه، این از اضلاحیه ی اول.

اصلاحیه ی دوم هم که بی ربط به قسمت اول نیست، کدهای دات نتی بود که برای متد Insert توی جدول ساخته میشد، چون بعضی اوقات نیاز هست که  از Transaction استفاده کنیم، لذا میبایست pk رکورد insert شده رو در اختیار داشته باشیم تا بتونیم در جداول دیگه استفاده کنیم، به خاطر همین یک پارامتر که معرف فیلد pk رکورد مورد نظر هست رو بهش اضافه کردم که :
1. نوع پارامتر مورد مورد نظر با نوع فیلد pk همسنگش در Sql Server یکی هست.
2. این پارامتر به عنوان پارامتر خروجی در نظر گرفته میشه که pk رکورد insert شده رو در اختیار کد دات نت شما قرار میده و داخل متغیر مورد نظر میریزه (حتما با کلمه ی کلیدی out توی سی شارپ آشنایی دارید، اگر هم ندارید در نمونه برنامه ی زیر، نحوه ی استفاده از آن رو میتونید ببینید)
که از این طریق میتونید از pk رکورد insert شده در transaction ها استفاده کنید و یا هرکاری که نیاز باشه باهاش انجام بدید.

البته من تا اونجایی که تونستم مشکلاتش رو مرتفع کردم ولی دوستان هم ازش استفاده کنن و توی همین تاپیک نتیجه رو بگن، نظر هم یادتون نره.

نسخه ی جدید + نمونه برنامه رو میتونید از پایین همین بخش دریافت کنید.
امیدوارم که مورد توجهتون قرار بگیره.

----------


## hdv212

نسخه ی 2.0 از ابزار Database Helper آماده شد.
با توجه به FeedBack هایی که دوستان در سایت برنامه نویس و همینطور CodeProject بهم میدادن، تصمیم بر این گرفتم که تغییرات اساسی ای رو در ساختار برنامه ایجاد کنم، تغییرات در نسخه ی 2.0 به شرح زیر میباشد:

1. استفاده از Smo یا Sql Server Management Objects  برای اتصال به Sql Server 2005 به جای Dmo یا Distributed Management Objects که برای Sql Server 2000 بود.
2. تغییرات اساسی در نحوی Load کردن آبجکت های مورد نیاز از دیتابیس (شامل StoredProcedureها، Tableها و ...)، که سرعت بازیابی اطلاعات از سرور تقریبا 10 برابر بیشتر از نسخه های قبلی شده!
3. *اضافه کردن قابلیت توسعه ی نرم افزار به وسیله ی Third Party ها :*
با استفاده از این قابلیت اگر دوستان، ایده ای به نظرشون رسید، میتونن خودشون امکانات این ابزار رو با استفاده از SDK ای که برای این ابزار در نظر گرفتم، قابلیتهای مورد نظرشون رو به این ابزار اضافه کنن،پس از این، قابلیت مورد نظر از طریق *منوی PlugIns>YourPlugInName* در دسترس خواهد بود، روند کار به صورت زیر میباشد :

_1. پروژه ای از نوع Class Library ایجاد کنید.
2. اسمبلی DatabaseHelperSDK.dll رو به لیست References اضافه کنید.
3. کلاس مورد نظرتون رو از اینترفیس IPlugIn مشتق کنید (این اینترفیس در فضای نام DatabaseHelperSDK موجود میباشد).
4. سه متد زیر رو Implement کنید :_
*InitializeComponent* : متد اصلی که وظیفه ی بارگذاری و Initialize کردن PlugIn شما رو به عهده خواهد داشت،
این متد، یک ToolStripMenuItem با نامی که شما مشخص میکتید رو خواهد ساخت و به منوی PlugIns اضافه خواهد کرد.
*Author* : اطلاعاتی راجع به نویسنده ی این PlugIn
*Description* : توضیحاتی در مورد PlugIn
_5. سپس یک روریداد Click برای آبجکت ToolStripMenuItem تون ایجاد و عملی رو که اون PlugIn انجام میده رو در داخل اون رویداد بنویسید.
6. پروژه تون رو کامپایل کنید و سپس اسمبلی مورد نظر رو در برنامه Database Helper، داخل دایرکتوری PlugIns کپی کنید و سپس برنامه ی Database Helper رو اجرا کنید، حالا وقتی روی منوی PlugIns کلیک میکنید باید PlugIn خودتون رو در لیست SubMenu ها ببینید._

پروژه ی Database Helper v 2.0 به همراه نمونه PlugIn ای که نحوه ی توسعه دادن Database Helper رو نشون میده از طریق لینکهای زیر قابل دریافت میباشد.
خوشحال میشم، این برنامه رو تست و نتیجه رو در همین تاپیک مطرح کنید تا به بحث و تبادل نظر بپردازیم، همینطور دوستانی که قصد همکاری رو داشتن، دیگه به راحتی میتونن این کار رو انجام بدن (این قابلیت رو به خاطر شما ایجاد کردم).
منتظر نظرات، انتقادات و پیشنهادات شما هستم.
یا علی.
---------------------
حامد وزیری

----------


## mahdi_negahi

سلام 
پیشنهاد میکنم ، متد هایی برای  در نرم اSELECT تعبیه شود که خروجی آن DATASET باشد ، بنده یک Generator در زمانی به نسبت دور نوشتم ، در موقع استفاده به این متد احتیاج فروان پیدا کردم

----------


## hdv212

> سلام 
> پیشنهاد میکنم ، متد هایی برای در نرم اSELECT تعبیه شود که خروجی آن DATASET باشد ، بنده یک Generator در زمانی به نسبت دور نوشتم ، در موقع استفاده به این متد احتیاج فروان پیدا کردم


مرسی مهدی جان، ولی تمام کدهای دات نتی که برای Stored Procdureها نوشته میشه DataTable برمیگردونه، این نیازتو برآورده نمیکنه ؟

----------


## bachebahal_1363

سلام دوست من 
از کمک هایی که به من کردین واقعا ممنونم
فرصت تشکر کردن  در اون پست رو نداشتم اما اینجا ازت تشکر می کنم
من از برنامه بسیار پر کاربر شما کمال تشکر رو دارم 
از سورسش که در اختیار کاربران هم قرار دادین تشکر می کنم چون واقعا کمک خیلی زیادی به تجربه کردن یک پروژه که ObjectOriented باشه لذت می برن . 
فقط در استفاده از برنامه شما و آقای کرامتی به یک مشکل برخورد کردم
من به SqlServer2008  سویچ کردم خوب هم به جهت امکانات بسیار زیادی که در این ورژن هست مخصوصا PersianCollation . 
زمانی که می خوام از برنامه شما استفاده کنم برای Generate کردن ، در هنگام Connect کردن Error زیر رو می ده . به نظر شما می شه چه کاری برای این موضوع کرد ؟

----------


## hdv212

> سلام دوست من 
> از کمک هایی که به من کردین واقعا ممنونم
> فرصت تشکر کردن در اون پست رو نداشتم اما اینجا ازت تشکر می کنم
> من از برنامه بسیار پر کاربر شما کمال تشکر رو دارم 
> از سورسش که در اختیار کاربران هم قرار دادین تشکر می کنم چون واقعا کمک خیلی زیادی به تجربه کردن یک پروژه که ObjectOriented باشه لذت می برن . 
> فقط در استفاده از برنامه شما و آقای کرامتی به یک مشکل برخورد کردم
> من به SqlServer2008 سویچ کردم خوب هم به جهت امکانات بسیار زیادی که در این ورژن هست مخصوصا PersianCollation . 
> زمانی که می خوام از برنامه شما استفاده کنم برای Generate کردن ، در هنگام Connect کردن Error زیر رو می ده . به نظر شما می شه چه کاری برای این موضوع کرد ؟


با تشکر از لطف شما دوست گرامی
این مشکل به دلیل این اتفاق میفته که DbHelper از طریق Sql Native Client 2005 به Sql Server 2008 وصل میشه، Collation فارسی در Sql Server 2008 پشتیبانی میشه ولی در Sql Native Client 2005 پشتیبانی نمیشه، من توی اینترنت دنبال این موضوع گشتم و این لینک رو پیدا کردم، که در بالای همان صفحه اشاره به این لینک داشت که دارای HotFix مورد نظر برای رفع این مشکل میباشد، متاسفانه من چون خودم هنوز Sql Server 2008 رو نصب نکردم، نمیتونم بگم که مشکل حل میشه یا نه، شما لطف کنید لینک رو چک و HotFix مربوطه رو دانلود و نصب کنید و نتیجه رو هم در همین تاپیک اعلام کنید.
با تشکر.

----------


## bachebahal_1363

> با تشکر از لطف شما دوست گرامی
> این مشکل به دلیل این اتفاق میفته که DbHelper از طریق Sql Native Client 2005 به Sql Server 2008 وصل میشه، Collation فارسی در Sql Server 2008 پشتیبانی میشه ولی در Sql Native Client 2005 پشتیبانی نمیشه، من توی اینترنت دنبال این موضوع گشتم و این لینک رو پیدا کردم، که در بالای همان صفحه اشاره به این لینک داشت که دارای HotFix مورد نظر برای رفع این مشکل میباشد، متاسفانه من چون خودم هنوز Sql Server 2008 رو نصب نکردم، نمیتونم بگم که مشکل حل میشه یا نه، شما لطف کنید لینک رو چک و HotFix مربوطه رو دانلود و نصب کنید و نتیجه رو هم در همین تاپیک اعلام کنید.
> با تشکر.


با سلام خدمت دوستان
بنده دو Hotfix ی که Microsoft داده بود رو دانلود و نصب کردم و مشکلم حل شد .
فقط مشکل حجم بسیار زیاد یکی  Hotfix ها بود که یکی 3 مگابایت و دیگری 137 مگابایت بود .

----------


## bachebahal_1363

سلام hdv212 عزیز 
در رابطه با برنامه شما من هم یک برنامه جهت Backup و Restore از دیتابیس نوشتم که به مشکل مشابهی برخورد کرده اما اون برنامه چون با SQLDMO نوشته شده مشکلش با دانلود و نصب HotFix بالا رفع نشده آدرس دانلود برنامه رو در زیر میزارم اگر امکان داره یه نگاهی بهش بنداز و Errorی که برنامه من در رابطه با SQlSERVER2008 می ده هم در پائین می زارم . 
ممنون می شم اگر در این مورد هم کمک کنید .
لینک دانلود مستقیم

----------


## hdv212

> در رابطه با برنامه شما من هم یک برنامه جهت Backup و Restore از دیتابیس نوشتم که به مشکل مشابهی برخورد کرده اما اون برنامه چون با SQLDMO نوشته شده مشکلش با دانلود و نصب HotFix بالا رفع نشده آدرس دانلود برنامه رو در زیر میزارم اگر امکان داره یه نگاهی بهش بنداز و Errorی که برنامه من در رابطه با SQlSERVER2008 می ده هم در پائین می زارم . 
> ممنون می شم اگر در این مورد هم کمک کنید .


سلام دوست عزیز، سعی کنید از Smo استفاده کنید(همانطور که من استفاده کردم)، Smo ویرایش جدیدی از همون Dmo هست(منتها برای 2005)، روشهای کارش تقریبا همونه، امتحان کن ببین درست میشه.

----------


## hosseinab

سلام خسته نباشيد
من برنامه تون رو اجرا كردم وقتي مي خوام شاخه sp يا table هر ديتابيسي رو با كنم پيغام 
An exception batch occurred while executing a Transact-SQL statement or batch
ميده اين رو با چند روش وصل شدن تست كردم

----------


## ebnsina

> اميدوارم كلاس بدرد دوستان بخوره ....اگه كسي از sp نوستن و تغييرات در ver هاي بعدي نرم افزار خسته شده ميتونه از اين كلاس استفاده كنه


 
دوست عزيز ، من هم با متدي مشابه شما از چند سال قبل به اين طرف كار ميكنم.
اليته تا دوسال پيش با اين روش در دلفي كار ميكنم و بعد از اون با C#‎


اما مطلبي كه شما اشاره كرديد در واقع تقابل بين دو ديدگاه در توليد لايه هاي Interface و Logic (يا همون Bussiness Rules ) هست :  :شیطان: 

1- ديدگاه اول مربوط به توسعه به اينصورته كه Data Wrapper Class در لايه Interface و Logic ها هم در لايه Data قرار مي گيرند كه دوستان در اين تاپيك اين روش رو دنبال مي كنند.

2- ديدگاه دوم (كه منتقداني در همين سايت داره) بصورت Data Smart Class در لايه Interface است و بخش زيادي از Logic در همين لايه قرار مي گيره. البته در موارد تهيه گزارش باز هم رجوع به Logic ها و يا Store Procedure ها در لايه Data مورد استفاده است كه همچنان سرعت پردازش و گزارش دهي را بالا نگه مي داره. در واقع بخشي از Logic در  لايه Interface  و بخشي به لايه Data تقسيم ميشه.

حالت دوم (يعني حالتي كه من و شما استفاده مي كنيم)  به دلايلي برتره (البته با اين دلايل) :
1- توسعه و برنامه نويسي با اون خيلي سريعتره !!
2- با هر تغييري نيازي به دوباره سازي كلاسها با ابزارهاي اتوماتيك نيست.
3- در صورتي كه در روش اول براي كلاس خاصي مقداري سورس پرداختي نوشته شده باشه و بعد بدون اينكه برنامه نويس يادش باشه اون كلاس را دوباره بسازه ، سورس هاي پرداختي مي پره !!
و .... 

اميدوارم كه با كمك شما بشه در يك فرصت مناسب ايده خودمون رو بعنوان يك تاپيك مستقل مطرح كنيم و بسط بديم. (به كرم مولا اميرالمومنين)

البته از انتقادات و پيشنهادات دوستان خوشحال ميشيم !!  :عصبانی:

----------


## حامد مصافی

این عالیه که تصمیم به توزیع برنامه به صورت اوپن سورس گرفتید، اما بهتر است برای توزیع مجدد یا دیکامپایل پروژه لایسنسی انتخاب کنید. برای مثال GPL انتخاب خوبیست و اما برای مشارکت سایرین بهتر است پروژه را در یک سایت میزبانی اوپن سورس مثل Sourceforge.org ثبت کنید تا علاقمندان به طور رسمی به پروژه بپیوندند.

----------


## Mahdi-563

سلام دوست عزيز
يه پيشنهاد ميشه نسخه‌اي هم براي وب از اين كلاس درست كرد من در نسخ 1 سعي كردم ولي نشد اما تنها تغيير لازم براي مديريت خطاس كه من اين كارو دستي كردم
throw new HttpException(ex.Message);

----------


## meh_sol2002

سلام combo_ci برنامه سما رو من نتونستم دانلود کنم
لطف میکنید دوباره بذارید

----------


## sedehi

> اميدوارم كلاس بدرد دوستان بخوره ....اگه كسي از sp نوستن و تغييرات در ver هاي بعدي نرم افزار خسته شده ميتونه از اين كلاس استفاده كنه


combo_ci عزيز ظاهرا شما کلاس مربوطه را از تاپيک حذف کرده ايد اگر ممکنه مجددا آن را قرار دهيد ممنون ميشيم .  :ناراحت:

----------


## sedehi

آقاي وزيري عزيز
با سلام 
بايد بگويم که کار بسيار زيبا و جالبي کرده ايد و انصافا جاي تشکر و تقدير فراوان دارد .
من دو پيشنهاد دارم  يکي اينکه امکان Encription را در برنامه تعبيه کنيد و دوم اينکه امکان سلکت کردن جداول را  در برنامه فراهم نمائيد چرا که ممکن است User نخواهد ار تمام جداول موجود در ديتا بيس استفاده کند .
موفق باشيد .  :تشویق:

----------


## farnooshhp

دوست عزیز خسته نباشید. برنامه تان عالی بود. یه سوال و یه پیشنهاد داشتم. 
سوال اینکه ورژن 2.0.0 آیا با sql server 2000 کار میکنه یا نه؟ اگر نه بهتره امکانش رو بذارید.
و پیشنهاد اینکه برنامه SP Gen آقای کرامتی که من باهاش کار کردم محیطش user friendly تر هستش و کدهاش تو محیطی شبیه سی شارپ هست که چشم انداز قشنگتری داره و کار باهاش راحت تره. اگر امکانش هست این قضیه رو هم پیگیری کنید. باز هم ممنون از برنامه خوب و پر کاربردتون

----------


## farnooshhp

چی شد؟ جواب منو نمیدید؟

----------


## hdv212

> چی شد؟ جواب منو نمیدید؟


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

----------


## shojaei_moh

سلام 
شما نوشته اید اگر دات نت نمی دانید وارد نشوید آیا بهتر نیست چند تا پروژه ساده که نرمال سازی شده بگذارین تا ماها که تازه کار هستیم استفاده کنیم من توی این سایت خیلی گشتم ولی متاسفانه اون چیزی رو که می خواستم پیدا نکردم .

----------


## HAMRAHSOFT.IR

آقا نمي شه يك كاري كرد كه بانك اكسس كار كنه كد توليد

----------


## Hesamzadeh

سلام
نسخه 3 این برنامه بسیار عالی رو با تغییرات زیر دانلود کنید:
1- پشتیبانی از owned schema
2- افزودن منوی تنظیمات
3- ذخیره مسیر فایل های خروجی
4- تصحیح چند ایراد کوچک در ساخت SP
Database Helper 3.0.0  Release.zip
Database Helper 3.0.0 source code.zip

----------


## HAMRAHSOFT.IR

> سلام
> نسخه 3 این برنامه بسیار عالی رو با تغییرات زیر دانلود کنید:
> 1- پشتیبانی از owned schema
> 2- افزودن منوی تنظیمات
> 3- ذخیره مسیر فایل های خروجی
> 4- تصحیح چند ایراد کوچک در ساخت SP
> Database Helper 3.0.0  Release.zip
> Database Helper 3.0.0 source code.zip


سلام 
با sql2008کارنمیکنه

----------


## Hesamzadeh

میتونید بگید چه ایرادی داره چون من sql2008 R2 دارم تستش میکنم

----------


## HAMRAHSOFT.IR

من هرچی سعی میکنم نمیشه به دیتا بیس کانکت بشه

----------


## Hesamzadeh

آیا خطا میده یا فقط دیتابیس ها رو نشون نمیده؟
در ضمن روی سیستمی که دارید از این برنامه استفاده میکنید هم باید sql نصب باشه (به علت استفاده از کتابخانه های sql).

----------


## HAMRAHSOFT.IR

دوست خوب ویندوز 7  استفاده مکنم  بد درقدیمی ها کد ذا داخل برنامه نشون میداد اما خلا باید داخل فایل ذخیر کرد؟

----------


## omidh2007

من نسخه 3 رو تست کردم روی SQL Server 2008 R2 جواب هم داد . 
هم برای تولید فایل cs. و هم برای فایل sql. که حاوی sp ه.

----------


## HAMRAHSOFT.IR

دوست خوب دوباره تست کردم این خطا و سرعت خیلی کند 

اگه بشه کد ساخت شده داخل پنچره رئ برو دید بهتر

----------


## Alfa_Debager

سلام به همه 
من ورژن نهاییتونا تست کردم روی sql 2012
مشکلی نداشت فقط یه ایراد بزرگ دیدم که امیدوارم حلش کنید 
مشکل اینه که من تو دیتابیس از schema استفاده کردم که این فقط  dbo را نشون میده 
بازم از زحماتتون متشکرم

----------


## Alfa_Debager

با سلام مجدد یه مشکل دیگه تو sql 2012 
خروجی sp ها به شکل زیر هستش لطفا علت را شناسایی کنید 
ممنون میشم بگید عاملش چیه و چکار باید کرد
ممنون 
مثال خروجی
-- ==================================================  ========================================
-- Entity Name:	dbo.1_tbl_Table_SelectAll
-- Create date:	06/08/2013 03:37:23 ب.ظ
-- Description:	This stored procedure is intended for selecting all rows from dbo.1_tbl_Table table
-- ==================================================  ========================================
Create Procedure dbo.1_tbl_Table_SelectAll
As
Begin
	Select 

	From dbo.1_tbl_Table
End

GO

----------

