PDA

View Full Version : خواندن dbf در 2005 c#



ali2000_1358
دوشنبه 19 فروردین 1387, 16:25 عصر
من می خوام با 2005 c# به فایلهای dbf مربوط به foxpro وصل شوم و به رکوردهای آن دسترسی پیدا کنم ممکنه من رو راهنمائی کنید .اصلا همچین امکانی وجود دراد یا نه

علیرضا مداح
دوشنبه 19 فروردین 1387, 18:15 عصر
سلام ،
باید از اشیاء فضای نام System.Data.Odbc استفاده نمایید.

KavoshGar_ir
دوشنبه 19 فروردین 1387, 18:36 عصر
من می خوام با 2005 c# به فایلهای dbf مربوط به foxpro وصل شوم و به رکوردهای آن دسترسی پیدا کنم ممکنه من رو راهنمائی کنید .اصلا همچین امکانی وجود دراد یا نه
از sql server هم می توانید استفاده کنید به عبارتی خواندن فایل را توسط یک stored procedure به sql server بسپارید و بعد از مقادیری که خوانده در برنامه تان استفاده کنید.

MKalami
دوشنبه 19 فروردین 1387, 21:50 عصر
باید از اشیاء فضای نام System.Data.Odbc استفاده نمایید

با کلاسهای موجود در این فضای نام میتونی از فایل text,paradox,faxpro گرفته تا بانکهای اطلاعاتی sqlserver,oracle رو بخونی و تغییر بدی.

night_walker
سه شنبه 20 فروردین 1387, 09:37 صبح
شما می توانید از ODBC استفاده کنید ولی با فارسی به مشکل می خورید. برای حل این مشکل هم اگر جستجو کنید راه حل را پیدا می کنید. در تاپیک های فاکس پرو جستجو کنید.

ali2000_1358
سه شنبه 20 فروردین 1387, 11:29 صبح
دستتون درد نکنه من از odbc استفاده کردم و به بانک وصل شدم . در odbcAdapter در پیش نمایش اطلاعات رو نشان می دهد ولی وقتی می خواهم اطلاعات رو fill کنیم و در گرید مشاهده کنیم پیغام خطای زیرو می دهد

ERROR [HY000] [Microsoft][ODBC dBase Driver] Unexpected error from external database driver (15877).

ali2000_1358
شنبه 24 فروردین 1387, 08:07 صبح
دوستان کسی نمی دونه علت این پیغام خطا چی هست .
کسی در این مورد یک مثال ندارد به من بده

gdevnb
شنبه 24 فروردین 1387, 08:25 صبح
لطف کن و کد مربوط به این قسمتو بزار.

Milad Mohseny
شنبه 24 فروردین 1387, 09:16 صبح
چطوری میشه Tooltip Balloon رو کاملاً Right to Left کرد؟؟

mostafa.vahab
شنبه 24 فروردین 1387, 13:43 عصر
به این یه نگاهی بکن
شاید به دردت بخوره

gdevnb
شنبه 24 فروردین 1387, 14:41 عصر
به این یه نگاهی بکن
شاید به دردت بخوره
کد خوبی بود مرسی.
ولی مشکل RTL رو حل نکرد.

armiya
شنبه 24 فروردین 1387, 20:50 عصر
سلا م : من می خوام یه گزارشی رو مثل مثال زیر چاپ کنم با این تفاوت که اطلا عات گزارش از طر ف کار بر وارد می شه
مثال :
نام نام خانوادگی نام پدر شماره شناسنامه
در تاریخ فارغ تحصیل شد
در این مثال جای خالی می خوام پر کنم اگه کسی اطلا عاتی درباره این داره یه تو ضییحخ بده چه کار باید بکنم ایا این کار با crstal report امکان دار ه یا نه ممنون:لبخندساده:
---------------------------------------------------------------------------
بر روی هر پله ای که باشی خدا یک پله از تو بالاتر است نه فقط بر ای اینکه خداست برای اینکه دستت را بگیرد

مثلا نام را علی نام خانوادگی اکبری و...............

علیرضا مداح
شنبه 24 فروردین 1387, 21:04 عصر
سلام ،
در صورتیکه اطلاعات گزارش از دیتابیس گرفته نمیشود و در همان زمان از کاربر گرفته میشود میتوانید چند TextObject در گزارش قرار داده و از طریق کالکشن ReportClass.ReportDefinition.ReportObjects به شی ء مورد نظر دسترسی داشته باشید ، ولی اگر گزارش شما به همین سادگی است پیشنهاد میکنم از PrintPreviewControl و PrintDocument استفاده نمایید.

Milad Mohseny
یک شنبه 25 فروردین 1387, 11:48 صبح
ممنون از برنامه ولی کاری که من گفتم یه چیزه دیگه بود.

ali2000_1358
دوشنبه 26 فروردین 1387, 10:10 صبح
آقا دستت درد نکنه . ببخشید که sourceدیر گذاشتم :خجالت:ممنون میشم یک نگاه بندازی:خجالت:

احمد غلامی
سه شنبه 27 فروردین 1387, 12:34 عصر
من یه جستجو انجام میدم و نتیجه اشو در یه dataGridview نشون میدم حالا از طریق کد نویسی میام و یکی از رکورد های مشاهده شده رو از دیتا بیسم حذف میکنم مشکلم اینکه می خوام به محض حذف یه رکورد ، رکورد مد نظر از dataGridview هم حذف بشه که این کارو نمیتونم انجام بدم من dataGridview رو update و refresh هم کردم ولی باز جواب نداد. البته کد حذفم هیچ ربطی به dataGridview نداره و از بانک حذف میکنه یعنی کاربر کد رکورد مشاهده شده در dataGridviw رو دریک textbox وارد میکنه و دکمه حذف رو میزنه . ممنون میشم راهنماییم کنید

hassan razavi
سه شنبه 27 فروردین 1387, 13:24 عصر
DataTable متصل به DataGride را مجددا Fill کنید

ali2000_1358
چهارشنبه 28 فروردین 1387, 08:46 صبح
دوستان اگر ممکنه لطف کنید یک نگاهی به این source ما بندازید

rostamedastan
چهارشنبه 28 فروردین 1387, 22:44 عصر
بسم الله الرحمن الرحیم
سلام علیکم
من می خواهم برنامه ایکه با c# به صورت windows Application نوشته ام و از بانک اطلاعاتی Sql Server استفاده می کنم را در شبکه قرار دهم تا مثلا 7 یا 8 نفر از آن استفاده کنند اما از همزمانی کاربران در استفاده از جداول می ترسم مثلاً اگر کاربری اطلاعات دانشجوی شماره 10 را بازیابی کرد و بعضی از فیلدهای آن را تغییر داد ولی هنوز کلید ذخیره تغییرات را نزده و کاربر دیگری در این لحظه اطلاعات همان دانشجو را بازیابی کند و در همین لحظه کاربر اول اطلاعات را ذخیره می کند اما مشکل اینجا است که کاربر دوم هنوز همان اطلاعات قبلی را می بیند پس در اینصورت در صورت تغییرات یا حذف مشکل پیش می آید راه حل چیست ؟
1-چطور می توان کاری کرد که اگر کاربر اول اطلاعات دانشجوی شماره 10 را بازیابی کرد دیگر کسی نتواند این اطلاعات را بازیابی کند تا او تغییرات را انجام دهد ؟ البته در صورت اینکار باید چطور به سیستم بفهمانیم که قفل رکورد را باز کند ؟
2-در حالی که در برنامه از فناوری ADO.NET استفاده می کنیم و ADO.NET بی اتصال به بانک است چگونه می توان به سیستم بفهمانیم که کار ما با فلان رکورد هنوز تمام نشده است ؟
3-من جست و جو کردم و در مورد قفلها یکی از اعضا گفته بود که در جلوی جدولی که می خواهی قفل کنی از کلمه (TABLOCKX) استفاده کن ولی متوجه شدم که این نوع قفل گزاری مربوط به لحظات میلی ثانیه می شود که دو کاربر تقریباً همزمان با هم رکوردی را می خواهند تغییر دهند.
4- اصلاً آیا ایت مشکلی که من مطرح کردم تبیعی است و کاریش نمیشه کرد ؟
5- من خودم پیشنهاد می کنم که در ابتدای هر تغییر یا حذفی یک SELECT قرار دهیم تا اگر اطلاعات داخل جدول همان است که کاربر دوم در فرم می بیند پس سیستم عملیات ذخیره را انجام دهد در غیر اینصورت با اعلام پیغامی مبنی بر اینکه اطلاعات تغییر کرده اطلاعات جدید را نمایش دهد و تغییرات کاربر دوم را اعمال نکند آیا این روش خوبی است ؟

Pioneers
چهارشنبه 28 فروردین 1387, 23:28 عصر
از Transaction استفاده کنید. هم در C# و هم در Sql Server موجود است. دارای قفلهای مختلفی است از جمله برای نوشتن، خواندن و ...

vcldeveloper
پنج شنبه 29 فروردین 1387, 02:07 صبح
بطور کلی دو نوع قفل گزاری وجود داره، Optimistic و Pessimistic. در روش Optimistic آخرین ویرایشی که روی یک رکورد انجام شده، در بانک ذخیره میشه؛ یعنی اگر دو کاربر هم زمان با هم یک رکورد را ویرایش کنند، تغییرات کاربری که دیرتر اقدام به ذخیره کردن کرده، در بانک ثبت میشه. در روش Pessimistic، اگر رکوردی توسط کاربری ویرایش بشه، رکورد قفل میشه. اگر کاربری دومی بخواد رکورد را ویرایش کنه، پیغام خطا دریافت میکنه و مجبور میشه که رکورد را Refresh کنه تا تغییرات کاربر اول ظاهر بشند. البته این امکان هم وجود داره که تعیین کنید برای اعمال ویرایش چه نوع فیلدهای از رکورد باید چک بشند. اگر All باشه، یعنی در زمان ثبت تغییرات اگر حتی یکی از فیلد های رکورد مربوطه توسط کاربر دیگه ایی تغییر کرده باشه، عملیات با شکست مواجه میشه. اگر Key Fields باشه، در صورتی که یکی از فیلدهای کلید قبل از ثبت رکورد تغییر کرده باشه، عملیات شکست میخوره. یک حالت دیگه هم هست که میگه اگر مقادیر فیلدهایی که توسط کاربر تغییر کردند، توسط کاربر دیگه ایی تغییر کرده باشند، عملیات شکست بخوره، مثلا کاربر فیلد نام رو می خواد تغییر بده، کاربر دیگه ایی در همون زمان فیلد تاریخ تولد همون رکورد رو ویرایش میکنه. در این حالت عملیات با شکست مواجه نمیشه، اما اگر هر دو کاربر فیلد نام را ویرایش کنند، کاربری که دیرتر نسبت به ثبت تغییرات اقدام کرده، با خطا مواجه میشه.
همچنین، SQL Server 2005 سرویس Notification هم ارائه میکنه که به سرور این امکان رو میده که در صورت پیش آمدن شرایط خاصی، کلاینت ها را مطلع کنه، مثلا اگر رکوردی تغییر کرد، به کلاینت ها اطلاع بده تا داده های خود را Refresh کنند.

اینایی که گفتم، غیر از Notification Service، حتی با ADO و SQL Server 2000 هم قابل انجام هستند، البته من چون آشنایی خاصی با #C ندارم، نمی دونم توی #C چطور پیاده سازی شدند.

علیرضا مداح
پنج شنبه 29 فروردین 1387, 14:40 عصر
سلام ،
یک روش هم به کارگیری Timestamp میباشد :
http://www.codeproject.com/KB/aspnet/concurrentupdates.aspx

armiya
پنج شنبه 29 فروردین 1387, 21:27 عصر
سلا م مممنون از را هنما یی تون ولی می خوام که اطلا عات تو یه دیتا بیس ذخیره بشه و در هنگامی که ذخیره شده کاربر بتونه متن مورد نظر رو تو مو قعیت های خودش قرار بدهو گزارش رو به طرف بده من با crystal report کمی کار کردم ولی متا سفانه نشد اگه ممکنه یه مثال در بارش واسم بزارین ممنون می شم
-----------------------------------------------------------------------
رنگین کمان پاداش کسانی است که تا اخرین قطره زیر باران می مانند

bachebahal_1363
پنج شنبه 29 فروردین 1387, 22:06 عصر
سلام خدمت دوستان
سوال من این هست که برای مثال من یک فرم parent دارم و یک فرم Child و در فرم Parent یک سری menu حال می خواهم توسط فرم Child که به عنوان فرم LogIn برنامه من هست اگر نام کاربری و رمز عبور رو به درستی تایپ کرد و کلید ورود را فشار داد یک سری منو ها فعال شود در غیر این صورت منو ها به صورت غیر فعال باقی بماند
اگر کسی می تواند کمک کنه
در Vb.Net به راحتی با دستور زیر می توان این کار را انجام داد چون با ساخت یک آبجکت فرم Parent تمامی کنترل های موجود در فرم Parent قابل استفاده در فرم Child بود و هر تغییری به راحتی صورت می گرفت .

Dim frm as new Form1
frm.menubar1.visible=false

rostamedastan
پنج شنبه 29 فروردین 1387, 22:12 عصر
با تشکر از تمام دوستان اما آقای کشاورز این دونوع قفلی که گفتید Optimistic و Pessimistic آیا این برای زمانی هست که کاربر دقیقا در یک زمان تقریبا مساوی و با اختلاف میلی ثانیه می خواهند رکورد را تغییر دهند ؟
من منظورم این است که اگر کاربر اول رکوردی را بازیابی کرد و کاربر دوم مثلا 10 ثانیه بعد همان رکورد را بازیابی کرد و چون ADO.net پس از بازیابی و اجرای query اتصال را قطع می کند حالا اگر اولی کلید ذخیره تغییرات را بزند پس دومی هنوز اطلاعات قبلی را که بازیابی کرده می بیند پس او نیز تغییراتی را می دهد غافل از اینکه رکورد قبلاً تغییر کرده پس چکار کنیم که این شرایط پیش نیاید؟
در مورد Transaction هم توضیحی بدهید که چه کار می کنند؟
آقای مداح می شود در مورد روش Timestamp هم توضیح بدهید؟

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

tthenry14plus
جمعه 30 فروردین 1387, 03:23 صبح
از DataSet استفاده کن.
Project --> Add New Item --> DataSet
فیلدهای مورد نظرتو اونجا بساز و در هنگام ورود اونها به DataSet ارسال کن.

مثلا جدولی با نام MyDB در DataSet1 ایجاد کرده ای و
n فیلد متنی برای آن ساخته ای:


DataSet1 ds = new DataSet1();
CrystalReport1 cr = new CrystalReport1();
DataSet1.MyDBRow ir = ds.MyImage.NewMyDBRow();

ir[0] = "متن ورودی";
ir[1] = "متن ورودی";
.
.
.

ir[n] = "متن ورودی";

ds.MyImage.Rows.Add(ir);
cr.SetDataSource(ds);
this.crystalReportViewer1.ReportSource = cr;


یادت باشه در هنگام ساخت CrystalReport از مسیری که در عکس ضمیمه مشخصه بری و کانکشن کریستال ریپورتتو
به دیتاست مربوط کنی :

vcldeveloper
جمعه 30 فروردین 1387, 03:42 صبح
این دونوع قفلی که گفتید Optimistic و Pessimistic آیا این برای زمانی هست که کاربر دقیقا در یک زمان تقریبا مساوی و با اختلاف میلی ثانیه می خواهند رکورد را تغییر دهند ؟
خیر، هر زمان که داده ایی از سرور درخواست می کنید، سرور یک RecordSet برای کلاینت ارسال میکنه؛ یعنی جدولی محتوی یک یا چند رکورد. کاربر میتونه این رکوردها رو تغییر بده، ولی وقتی که می خواد تغییرات رو در بانک اطلاعاتی (سرور) ثبت کنه، اگر رکورد مربوطه در سمت سرور با رکوردی که کلاینت ابتدا از سرور گرفته بود، فرق داشته باشه، یعنی فرد دیگه ایی در این فاصله اون رکورد رو تغییر داده. حالا در این شرایط، اگر نوع قفل Optimistic باشه، تغییرات کاربر روی تغییرات کاربر قبلی نوشته میشه. اگر Pessimistic باشه، خطایی مبنی بر اینکه رکورد مورد نظر تغییر کرده، یا رکورد مورد نظر پیدا نمیشه (بستگی به نوع فیلدهایی که باید چک بشند داره) ایجاد میشه و کاربر نمی تونه تغییراتش رو ثبت کنه و باید رکورد را Refresh کنه.
توی #C نمیدونم، ولی توی دلفی در همچین مواقعی می شد در صورت لزوم، بصورت خودکار پیامی به کاربر نشون داد که در آن مقادیر فعلی فیلدهای رکورد، و مقادیر جدیدی که توسط کاربر وارد شده بود، نمایش داده می شدند و کاربر می تونست خودش انتخاب کنه که آیا با توجه به مقادیر فعلی فیلدها، آیا هنوز باید ثبت تغییرات انجام بشه، یا نه.

rostamedastan
جمعه 30 فروردین 1387, 11:09 صبح
یعنی من در #C خودم به صورت دستی همانطور که در تاپیک بالا گفتم که یک فیلد مثلا با نام change عمل کنم یا کد وتابعی برای این کار وجود دادر؟
مثلا آیا در دلفی چنین تابعی وجود دارد؟

vcldeveloper
جمعه 30 فروردین 1387, 11:58 صبح
یعنی من در #C خودم به صورت دستی همانطور که در تاپیک بالا گفتم که یک فیلد مثلا با نام change عمل کنم یا کد وتابعی برای این کار وجود دادر؟

امکاناتی که برای Lock کردن گفتم، مربوط به ADO و SQL Server میشند و باید در ADO.Net هم موجود باشد. تمام اون کارهایی که گفتم توسط خود ADO و سرور بانک اطلاعاتی انجام میشه، نه اینکه شما خودتون توی برنامه تون از فیلدی برای این کارها استفاده کنید! شما فقط نوع قفل رو تعیین می کنید، مابقی کارها رو خودشون انجام میدن.


مثلا آیا در دلفی چنین تابعی وجود دارد؟
در دلفی کامپوننتی بنام ClientDataSet وجود داره که کار با اون شبیه اینه که بخواید با ADO.Net بصورت Disconnected کار کنید. این کامپوننت هر زمان که در ثبت رکوردی در بانک تداخلی پیش بیاد، Event ایی رو فعال میکنه که شما می تونید با توجه به اون، مقدار قبلی رکورد، مقدار فعلی رکورد در بانک، و مقداری رو که خودتون تغییر دادید و می خواستید ثبت کنید رو ببینید، و بر اساس این مقادیر تصمیم بگیرید که آیا تغییرات ثبت بشند یا نه، یا اینکه تصمیم گیری را بر عهده کاربر برنامه بزارید.

mehdi.mousavi
جمعه 30 فروردین 1387, 14:04 عصر
بسم الله الرحمن الرحیم
سلام علیکم
من می خواهم برنامه ایکه با c# به صورت windows Application نوشته ام و از بانک اطلاعاتی Sql Server استفاده می کنم را در شبکه قرار دهم تا مثلا 7 یا 8 نفر از آن استفاده کنند اما از همزمانی کاربران در استفاده از جداول می ترسم مثلاً اگر کاربری اطلاعات دانشجوی شماره 10 را بازیابی کرد و بعضی از فیلدهای آن را تغییر داد ولی هنوز کلید ذخیره تغییرات را نزده و کاربر دیگری در این لحظه اطلاعات همان دانشجو را بازیابی کند و در همین لحظه کاربر اول اطلاعات را ذخیره می کند اما مشکل اینجا است که کاربر دوم هنوز همان اطلاعات قبلی را می بیند پس در اینصورت در صورت تغییرات یا حذف مشکل پیش می آید راه حل چیست ؟
1-چطور می توان کاری کرد که اگر کاربر اول اطلاعات دانشجوی شماره 10 را بازیابی کرد دیگر کسی نتواند این اطلاعات را بازیابی کند تا او تغییرات را انجام دهد ؟ البته در صورت اینکار باید چطور به سیستم بفهمانیم که قفل رکورد را باز کند ؟
2-در حالی که در برنامه از فناوری ADO.NET استفاده می کنیم و ADO.NET بی اتصال به بانک است چگونه می توان به سیستم بفهمانیم که کار ما با فلان رکورد هنوز تمام نشده است ؟
3-من جست و جو کردم و در مورد قفلها یکی از اعضا گفته بود که در جلوی جدولی که می خواهی قفل کنی از کلمه (TABLOCKX) استفاده کن ولی متوجه شدم که این نوع قفل گزاری مربوط به لحظات میلی ثانیه می شود که دو کاربر تقریباً همزمان با هم رکوردی را می خواهند تغییر دهند.
4- اصلاً آیا ایت مشکلی که من مطرح کردم تبیعی است و کاریش نمیشه کرد ؟
5- من خودم پیشنهاد می کنم که در ابتدای هر تغییر یا حذفی یک SELECT قرار دهیم تا اگر اطلاعات داخل جدول همان است که کاربر دوم در فرم می بیند پس سیستم عملیات ذخیره را انجام دهد در غیر اینصورت با اعلام پیغامی مبنی بر اینکه اطلاعات تغییر کرده اطلاعات جدید را نمایش دهد و تغییرات کاربر دوم را اعمال نکند آیا این روش خوبی است ؟


در محیطهای چند کاربره، دو مدل برای بهنگام سازی اطلاعات در بانک وجود داره:

1. همزمانی Pessimistic (بدبینانه)
2. همزمانی Optimistic (خوش بینانه)

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

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

بسته به تعداد کاربران و نوع کاربرد نرم افزار، روش بدبینانه ممکنه باعث بشه تا کاربران مدت زمان زیادی معطل آزاد شدن قفل باشن و در موارد بیسیار زیادی حتی این مساله منجر به deadlock در سطح بانک بشه، چون ممکنه کاربران زیادی رکورد مورد نظرشون رو برای مدت زمان مدیدی در حالت lock نگه دارن. تو چنین حالتی چه اتفاقی می افته؟ Application کاربران به timeout میخوره و همه ناراضی هستن، بخصوص از کسانی که رکوردها رو برای مدت زمان زیادی lock نگه میدارن.

اما در روش خوش بینانه، نرم افزار باید خودش تغییرات احتمالی رکورد رو چک کنه تا از دو مرتبه نوشتن اطلاعات روی اطلاعات تغییر یافته کاربر دیگه خودداری کنه. در واقع چون هیچ تضمینی برای عدم تغییر رکورد توسط دیگر کاربران وجود نداره، احتمال از دست دادن اطلاعات بهنگام شده کاربران دیگه خیلی حقیقی بنظر میرسه. برای اینکه رکورد (های) مورد نظر Lock نشده.

مساله کلیدی برای حل این موضوع، شناخت نرم افزارتون و انتخاب راهکاری مناسب، متناسب با شرایط نرم افزارتون هست. بعنوان مثال احتمال تغییر رکورد در برخی از نرم افزارهای تحت وب توسط چند کاربر بطور همزمان بسیار بعید بنظر میرسه. در حالیکه در نرم افزارهای بانکی، درصد وقوع مساله بسیار بسیار زیاد هستش.

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

روشهای زیادی برای حل مشکل همزمانی خوش بینانه وجود داره. اولین روش این هستش که هیچ کاری نکنید! ممکنه این روش در ابتدا عجیب بنظر برسه، اما در واقعیت این هم یک راهکار هستش. کی از این راهکار باید استفاده بشه؟ وقتیکه نرم افزارتون تک کاربره هستش، یا احتمال وقوع همزمانی در اون بسیار بسیار پایین باشه و دو مرتبه نوشتن اطلاعات روی اطلاعاتی که توسط کاربر دیگه بهنگام شده، ناچیز بنظر برسه. در چنین شرایطی مطمئنا روش "هیچ کاری نکنید" بهترین روشه. به این روش Last-in-wins هم میگن، چون همواره اطلاعات توسط آخرین کاربری که اطلاعات رو بهنگام میکنه، در بانک ذخیره خواهد شد.

روش دوم، چک کردن کلیه فیلدها هنگام Update کردن رکورد هستش. شما رکورد رو Update نخواهید کرد، مگه اینکه مطمئن باشید کلیه فیلدهای اون رکورد همون مقادیری رو دارن که هنگام Query کردن رکورد داشتن! به این ترتیب مطمئن هستید که اون رکورد توسط دیگران تغییر نکرده و اونو میتونید با خیال راحت، تغییر بدید.

روش سوم، چک کردن فیلدهایی هستش که شما قصد بهنگام سازی اونها رو دارین. مثلا اگر یک رکورد حاوی 5 فیلد باشه، و شما فقط قصد بهنگام کردن فیلد شماره دو رو داشته باشین، دیگه نیازی نیست از عدم تغییر محتوای چهار فیلد دیگه بهنگام Update اطمینان حاصل کنید. این روش کارایی بهتری داره و این امکان رو فراهم میکنه تا احتمال وقوع همزمانی نیز کاهش پیدا کنه.

اما در روش چهارم، کافی هستش جدول مورد نظر شما حاوی فیلدی از نوع timestamp باشه. (در برخی از بانکها به این فیلد rowversion هم میگن). این فیلد بصورت خودکار توسط بانک بازای هر row تولید میشه، و هر وقت که فیلدی از اون رکورد تغییر کنه، فیلد timestamp بصورت خودکار Update میشه. به این ترتیب کافی هستش هنگام Update کردن row، فقط row هایی رو Update کنیم که مقدار timestamp اشون همون مقداری باشه که هنگام Query بوده. این روش معادل روش دوم هستش، اما از کارایی بسیار بهتری برخورداره.

اما چطور متوجه بشیم که یه همزمانی رخ داده؟ کافی هستش بعد از عمل Update، به مقدار RecordsAffected توجه کنیم. همونطوری که میدونید، بانکها مقداری تحت عنوان RecordsAffected بعد از اجرای سه عمل اصلی RUD، یعنی retrieve، update، و delete به کاربر بر میگردونن که تعداد رکوردهای تاثیر یافته از این سه عمل رو به کاربر بر میگردون. اگر این مقدار صفر باشه، یعنی رکورد مورد نظر پیدا نشده، در نتیجه، همزمانی رخ داده. یعنی یا اون رکورد توسط کاربر دیگه ای پاک شده، یا تغییر پیدا کرده.

bachebahal_1363
جمعه 30 فروردین 1387, 15:19 عصر
مثل اینکه کسی راه حلی توصیه نمی کنه

Pioneers
جمعه 30 فروردین 1387, 22:01 عصر
جالبه. اغلب با VB مقایسه میکنند و فکر میکنند این قابلیت اصلا در C# وجود نداره.
در فرمی که میخواین به کنترلهاش دسترسی داشته باشین این کد رو بنویسین:


public static Form FRM_Temp;
private void Main_Load(object sender, EventArgs e)
{
FRM_Temp = this;
}
حالا در فرمی که میخواین این فرم رو تغییر بدین و منوهاشو مخفی کنید چیزی شبیه به این بنویسید:

Frm_Main.FRM_Temp.Controls.Find("TXT_Test", true)[0].BackColor = Color.Yellow;
که FRM_Main نام فرم دارای منو است.

البته راههای دیگه ای هم داره ولی زیباترین راهش همینه!

rostamedastan
جمعه 30 فروردین 1387, 22:11 عصر
با تشکر از تمامی دوستان که مرا راهنمایی کردند.
الان من کلاً با مفهوم انواع قفل آشنا شدم که قبلاً بلد نبودم حالا چگونه به مقدار این فیلد timestamp دسترسی داشته باشیم آیا باید به این فیلد مقدار اولیه بدهیم؟ آیا برای حل مشکل همزمانی باید برای تمامی جداول که امکان ویرایش کردن و حذف رکورد در آن از سوی کاربر وجود دارد یک فیلد از این نوع تعریف کرد؟
برای حل مشکل delete هم می شود از این فیلد استفاده کرد؟

همنین چه نیاز به این داریم که متوجه شویم چه وقت همزمانی اتفاق افتاده اگر همانطور که گفتید همواره مقدار timestamp را چک می کنیم تا اگر همزمانی اتفاق افتاده بود آن را حل کنیم

حالا چگونه به این مقدار RecordsAffected دسترسی داشته باشیم ؟

mehdi.mousavi
شنبه 31 فروردین 1387, 00:37 صبح
با تشکر از تمامی دوستان که مرا راهنمایی کردند.
الان من کلاً با مفهوم انواع قفل آشنا شدم که قبلاً بلد نبودم حالا چگونه به مقدار این فیلد timestamp دسترسی داشته باشیم آیا باید به این فیلد مقدار اولیه بدهیم؟ آیا برای حل مشکل همزمانی باید برای تمامی جداول که امکان ویرایش کردن و حذف رکورد در آن از سوی کاربر وجود دارد یک فیلد از این نوع تعریف کرد؟ برای حل مشکل delete هم می شود از این فیلد استفاده کرد؟

همنین چه نیاز به این داریم که متوجه شویم چه وقت همزمانی اتفاق افتاده اگر همانطور که گفتید همواره مقدار timestamp را چک می کنیم تا اگر همزمانی اتفاق افتاده بود آن را حل کنیم حالا چگونه به این مقدار RecordsAffected دسترسی داشته باشیم ؟

سلام.
بسته به اینکه کدوم روش رو انتخاب می کنید، می تونید یه فیلد timestamp تو هر جدولی داشته باشید. این فیلد نیازی نیست که default value داشته باشه. هر وقت رکوردی به این جدول اضافه بشه، مقدار timestamp بطور خودکار بهنگام میشه. هر وقت فیلیدی از این رکورد تغییر کنه، بازهم SQL Server بطور خودکار این فیلد رو بهنگام میکنه. (فرض من بر این هستش که شما از SQL Server بعنوان RDBMS استفاده می کنید).

در مورد این سوال که آیا میشه از همین فیلد برای Delete کردن استفاده کرد، پاسخ بازهم مثبت هستش. به این مثال دقت کنید:



DELETE FROM CustomerAccount
WHERE
[AccountId] = @AccountId AND
[ChangeStamp] = @ChangeStamp
در این دستور، تقاضای حذف رکوردی با AccountId مورد نظر و ChangeStamp مربوطه می بینیم. اگر یکی از فیلدهای رکورد مورد نظر تغییر کرده باشه، در نتیجه دستور Delete موفق به پاک کردن رکورد نمیشه، چراکه ChangeStamp متفاوت از اون چیزی هستش که ما انتظار داریم. چون رکوردی پیدا نمیشه، RecordsAffected صفر خواهد بود و رکوردی حذف نخواهد شد. بعبارت دیگه در کد DALC، جایی که Command فوق الذکر رو اجرا میکنید، همچین شبه کدی خواهید داشت:



IDataReader reader = ExecuteReader(deleteCmd);
if (reader.RecordsAffected <= 0)
throw new Exception("Concurrency occured!");
همونطوری که میبینید، RecordsAffected یک Property روی IDataReader هستش، که تعداد رکوردهای تاثیر یافته از آخرین دستور RUD رو بهتون میده!

bachebahal_1363
شنبه 31 فروردین 1387, 08:23 صبح
جالبه. اغلب با VB مقایسه میکنند و فکر میکنند این قابلیت اصلا در C# وجود نداره.
در فرمی که میخواین به کنترلهاش دسترسی داشته باشین این کد رو بنویسین:


public static Form FRM_Temp;
private void Main_Load(object sender, EventArgs e)
{
FRM_Temp = this;
}
حالا در فرمی که میخواین این فرم رو تغییر بدین و منوهاشو مخفی کنید چیزی شبیه به این بنویسید:

Frm_Main.FRM_Temp.Controls.Find("TXT_Test", true)[0].BackColor = Color.Yellow;
که FRM_Main نام فرم دارای منو است.

البته راههای دیگه ای هم داره ولی زیباترین راهش همینه!

ابتدا بگم که اگر شما در Frm_main کد Public static Form Frm_Temp رو بنویسید
به علت اینکه از static استفاده کرده اید در فرم دوم قابل رویت نیست پس باید اون رو به صورت
public Form Frm_Temp;
تعریف کنید
اما در مورد کد نوشته در فرم دوم باید بگم که امتحانش کردم اما جوابی نداد
اگر به صورت یک فایل ضمیمه نمونه ای از یک پروژه رو برام بزارین ممنون می شم

sinpin
شنبه 31 فروردین 1387, 09:02 صبح
سلام خدمت دوستان
سوال من این هست که برای مثال من یک فرم parent دارم و یک فرم Child و در فرم Parent یک سری menu حال می خواهم توسط فرم Child که به عنوان فرم LogIn برنامه من هست اگر نام کاربری و رمز عبور رو به درستی تایپ کرد و کلید ورود را فشار داد یک سری منو ها فعال شود در غیر این صورت منو ها به صورت غیر فعال باقی بماند
اگر کسی می تواند کمک کنه
در Vb.Net به راحتی با دستور زیر می توان این کار را انجام داد چون با ساخت یک آبجکت فرم Parent تمامی کنترل های موجود در فرم Parent قابل استفاده در فرم Child بود و هر تغییری به راحتی صورت می گرفت .

Dim frm as new Form1
frm.menubar1.visible=false



مثل اینکه کسی راه حلی توصیه نمی کنه

برای مثال در فرم فرزند بنویسید :

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
(this.MdiParent as MDIParent1).menuStrip.Visible = false;
}
}البته باید خاصیت modifier منو را نیز در فرم والد public کنید یا اینکه از طریق ایجاد یک پراپرتی پابلیک دسترسی به اون منو را فراهم کنید.

(در مثال بالا Form1 فرزند MDIParent1 بود)

mohamaddarbandi
شنبه 31 فروردین 1387, 10:37 صبح
سلام دوستان!
چطور میشه در سی شارپ مثل قلم paint نقاشی کشید؟
موضوع از این قراره که این نقاشی قراره تحت شبکه برای کلاینت های دیگه ارسال بشه و اونا حدس بزنند نقاشی کننده چی کشیده. لازم نیست زیاد حرفه ای باشه. در حد شبیه سازی خودکار و کاغذ معمولی!

Mahdi.Kiani
شنبه 31 فروردین 1387, 11:10 صبح
سلام دوستان!
چطور میشه در سی شارپ مثل قلم paint نقاشی کشید؟
موضوع از این قراره که این نقاشی قراره تحت شبکه برای کلاینت های دیگه ارسال بشه و اونا حدس بزنند نقاشی کننده چی کشیده. لازم نیست زیاد حرفه ای باشه. در حد شبیه سازی خودکار و کاغذ معمولی!

اگر از ویژوال استودیو 2008 استفاده می کنید، که قضیه کاملا متفاوته.. ولی اگر از دات نت 2 استفاده می کنید، ابزار های زیادی برای نقاشی کردن وجود داره...
Pen
Brush
GradientBrush
و ...

در فضای نام System.Drawing و زیر مجموعه های آن مانند System.Drawing.Drawing2D می تونین این ابزارها را پیدا کنید. در سایت های سورس کد هم بگردین، کلی از این نمونه برنامه های خواهید یافت
موفق باشید

hassan razavi
شنبه 31 فروردین 1387, 11:12 صبح
شما باید با Socket Programing آشنا باشید. بعد مشخصات موس را باید برای Client مقابل ارسال کنید (همراه با اطلاعات دیگه مثل رنگ انتخاب شده و ضخامت خط و ...)
حالا در طرف مقابل اطلاعات بدست آمده را توسط کلاس Graphics و متدهای Draw... رسم کنید

Mahdi.Kiani
شنبه 31 فروردین 1387, 11:43 صبح
موضوع از این قراره که این نقاشی قراره تحت شبکه برای کلاینت های دیگه ارسال بشه و اونا حدس بزنند نقاشی کننده چی کشیده



آقای رضوی من فکر کنم ایشون می خوان عکس روی یک PC که احتمالا نقش سرور را ایفا می کنه ترسیم بشه، و سپس عکس برای کلاینت ها فرستاده بشه...

البته بایستی به مواردی هم که آقای رضوی گفتند، توجه داشته باشین.. منظورم socket و .. هست.. چون به هر حال بایستی فایل خودتون را بفرستین واسه کلاینت ها ..

mohamaddarbandi
شنبه 31 فروردین 1387, 12:10 عصر
اولا ممنون از همگی!
در جواب شما هم باید بگم قراره کسی که نقاشی میکشه اطلاعاتش real time یا با تاخیر کم برای همه فرستاده بشه. چون هر کس سریع تر حدس بزنه برنده هست و امتیاز برنده به زمان حدسش ارتباط داره. (حدس زودتر امتیاز بیشتر)ضمنا نوبت بازی میچرخه و ممکنه کسی که حدس میزنه سری بعد نقاش باشه. واضحتر بگم نوبت میچرخه!

Mahdi.Kiani
شنبه 31 فروردین 1387, 14:16 عصر
اولا ممنون از همگی!
در جواب شما هم باید بگم قراره کسی که نقاشی میکشه اطلاعاتش real time یا با تاخیر کم برای همه فرستاده بشه. چون هر کس سریع تر حدس بزنه برنده هست و امتیاز برنده به زمان حدسش ارتباط داره. (حدس زودتر امتیاز بیشتر)ضمنا نوبت بازی میچرخه و ممکنه کسی که حدس میزنه سری بعد نقاش باشه. واضحتر بگم نوبت میچرخه!

شما دقیقا بگشین مشکلتون چیه؟
کشیدن نقاشی و ایجاد فضایی مانند برنامه Paint ؟
فرستادن فایل نقاشی شده بین کلاینت ها؟
یا ....

_alish_
شنبه 31 فروردین 1387, 14:43 عصر
http://barnamenevis.org/forum/showthread.php?t=13904

combo_ci
شنبه 31 فروردین 1387, 19:22 عصر
سلام
میخواستم ببینم میشه توی کد فهمید که برنامم چه فرم هایی داره ؟ یعنی مثلا توی یک combo box اسم فرم های یک برنامه رو load کنم

رضا عربلو
شنبه 31 فروردین 1387, 20:23 عصر
یک همچین چیزی میشود.


System.Reflection.Assembly asmb = new System.Reflections.Assembly();
foreach(Sytem.Type t in asmb.GetTypes())
{
if (t is Form)
{
}
}

rostamedastan
شنبه 31 فروردین 1387, 20:55 عصر
آقا دستت درد نکنه خیلی علی بود فقط اگر لطف کنید کمی در مورد اینIDataReader کمی توضیح بدید که اینطور که من متوجه شدم با این کد می توان فهمید که تعداد رکوردهی تغییر یافته روی آخرین جدولی که روی آن عملیات انجام دادیم را به ما بر می گرداند. یعنی اگر تنها رکوردهای خاصی از جدول معین را با استفاده از فراخانی storedprocedure تنها برای دیدن بازیابی کنیم می شود باز هم از این دستور استفاده کرد تا بگوید RecordsAffected = 0 است یا تنها دستورات مربوط به delete , update را چک میکند ؟

همچنین من وقتی این دستورات را می نویسم از دستور IDataReader reader = ExecuteReader(deleteCmd); ایراد می گیرد و می گوید ExecuteReader وجود ندارد البته به جای deleteCmd نام شیء Command خودم را می نویسم

تعداد رکوردهای تاثیر یافته از آخرین دستور RUD رو بهتون میده! که گفتید منظور از RUD چیست ؟

IDataReader با SqlDataReader چه فرقی می کند؟ اگر SqlDataReader بهتر است از SqlDataReader استفاده کنم؟

combo_ci
شنبه 31 فروردین 1387, 21:09 عصر
کار نکرد :(

رضا عربلو
شنبه 31 فروردین 1387, 21:56 عصر
کد بالا را بدون VS نوشتم به همین خاطر اشتباه تایپی داشت. ولی کد پایین را با VS نوشتم و جواب داد


int i = 0;
System.Reflection.Assembly asmb = System.Reflection.Assembly.GetExecutingAssembly();
foreach (System.Type t in asmb.GetTypes())
{
if (t.BaseType.Equals(typeof(System.Windows.Forms.For m)))
{
i++;
}
}

mehdi.mousavi
شنبه 31 فروردین 1387, 23:13 عصر
آقا دستت درد نکنه خیلی علی بود فقط اگر لطف کنید کمی در مورد اینIDataReader کمی توضیح بدید که اینطور که من متوجه شدم با این کد می توان فهمید که تعداد رکوردهی تغییر یافته روی آخرین جدولی که روی آن عملیات انجام دادیم را به ما بر می گرداند. یعنی اگر تنها رکوردهای خاصی از جدول معین را با استفاده از فراخانی storedprocedure تنها برای دیدن بازیابی کنیم می شود باز هم از این دستور استفاده کرد تا بگوید RecordsAffected = 0 است یا تنها دستورات مربوط به delete , update را چک میکند ؟

همچنین من وقتی این دستورات را می نویسم از دستور IDataReader reader = ExecuteReader(deleteCmd); ایراد می گیرد و می گوید ExecuteReader وجود ندارد البته به جای deleteCmd نام شیء Command خودم را می نویسم

تعداد رکوردهای تاثیر یافته از آخرین دستور RUD رو بهتون میده! که گفتید منظور از RUD چیست ؟

IDataReader با SqlDataReader چه فرقی می کند؟ اگر SqlDataReader بهتر است از SqlDataReader استفاده کنم؟

سلام.
عرض کردم کلیه دستورات RUD، یعنی SELECT، UPDATE و DELETE از این قاعده پیروی میکنن. بعبارت دیگه بعد از اجرای هر یک از این دستورات شما می تونید به RecordsAffected مراجعه کنید و تعداد رکوردهای تاثیر یافته از آخرین دستور رو ببینید. البته نکات ظریفی در عمل به میان میاد، از جمله Cursor Side و ... که به مرور زمان به این مسائل پی خواهید برد.

ExecuteReader یکی از متودهای کلاس Command هستش. اگر دقت میکردید، در نوشته های خودم گفته بودم "شبه کد"... در نتیجه، شما ExecuteReader رو روی Command ای که ساختید میزنید...

منظور از RUD، حروف اول سه کلمه retrieve، update، و delete هستش. منظور از retrieve همون select هستش. بقیه اش هم که مشخصه.

کلاس SqlDataReader در واقع IDataReader رو implement کرده. چون من مطمئن نبودم که شما از چه Data Reader ای استفاده میکنید، واسه همین اون اینترفیس رو در "شبه کدم" نوشتم... بعنوان مثال، ما DbDataReader، SqlDataReader، OleDbDataReader، OdbcDataReader و OracleDataReader رو داریم که همگی کلاسهایی هستن که IDataReader رو implement کردن... برای اینکه نوشته من در مورد همه این کلاسها صحیح باشه، از IDataReader استفاده کردم تا شما هر کدوم از این کلاسها رو استفاده کنید، بازهم مشکلی پیش نیاد.

ali_mp64
شنبه 31 فروردین 1387, 23:52 عصر
سلام دوستان .
چه کدی می شه تو #c نوشت که زمانی که cool disk رو به کامپیوتر متصل می کنیم محتوای اونو روی یک آدرس از پیش تعیین شده کپی کنه .

rostamedastan
یک شنبه 01 اردیبهشت 1387, 00:27 صبح
آقا نکات خوبی را گفتید و استفاده کردم قبلاً به این نکات برخورده بودم ولی خوب متوجه نشده بودم شبه کد شما را هم نوشتم و به کد مورد نظر دراوردم و جواب داد خیلی ممنون.

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

mehdi.mousavi
یک شنبه 01 اردیبهشت 1387, 01:38 صبح
آقا نکات خوبی را گفتید و استفاده کردم قبلاً به این نکات برخورده بودم ولی خوب متوجه نشده بودم شبه کد شما را هم نوشتم و به کد مورد نظر دراوردم و جواب داد خیلی ممنون.

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

Data Type این فیلد در C# معادل Byte[] هستش. فقط بخاطر داشته باشید که هنگام مقایسه در کد (در صورت نیاز)، نمیتونید دو تا Byte Array رو با == Operator مقایسه کنید. شما در واقع باید Byte به Byte دو Byte Array رو با هم مقایسه کنید. (بازهم تکرار میکنم، فقط در صورت نیاز).

موفق باشید.

*unos*
یک شنبه 01 اردیبهشت 1387, 07:43 صبح
با سلام خدمت استادان
راهنمایی برای کار با نرم افزار netz packer می خواستم !
اگه همراه با مثال باشه ممنون میشم

hassan razavi
یک شنبه 01 اردیبهشت 1387, 07:48 صبح
ENVDTE را هم در همین تالار جستجو کنید

رافعی مهدی
یک شنبه 01 اردیبهشت 1387, 07:54 صبح
با سلام
همانطور که می دانیم حرکت دادن تصویر در Client Area را Pan و تغییر Scale آن را Zoom می گویند که البته برا ی Panning و Zooming روشهای متعددی نیز وجود دارد.
اما چگونه می توان یک مجموعه ی گرافیکی ترسیم شده روی Paint Canvas یا یک Panel را بدون چشمک زدن یا پرش تصویر Pan یا Zoom کرد؟

با تشکر

ali2000_1358
یک شنبه 01 اردیبهشت 1387, 10:53 صبح
دوستان اگر ممکنه لطف کنید یک نگاهی به این source ما بندازید

علیرضا مداح
یک شنبه 01 اردیبهشت 1387, 10:54 صبح
سلام ،
http://madebits.com/netz/
.NETZ help and usage examples (http://madebits.com/netz/help.php)
در ضمن خواندن مطالب جناب اینپرایز نیز خالی از لطف نیست :
http://barnamenevis.org/forum/showthread.php?t=20560

e-shahshahani
یک شنبه 01 اردیبهشت 1387, 11:19 صبح
من یه برنامه دارم مینویسم که توش نیاز هست یک کدی به زبان#C از یک فایل خوانده بشه و برنامه آن را اجرا کند. تا اینجا را توانستم.

CSharpCodeProvider codeProvider = new CSharpCodeProvider();

ICodeCompiler compiler = codeProvider.CreateCompiler();
CompilerParameters parameters = new CompilerParameters();
parameters.GenerateExecutable = false;
parameters.GenerateInMemory = true;
parameters.OutputAssembly = "CS-Script-Tmp-Junk";
parameters.MainClass = "CScript.Main";
parameters.IncludeDebugInformation = false;

foreach (Assembly asm in AppDomain.CurrentDomain.GetAssemblies())
{
parameters.ReferencedAssemblies.Add(asm.Location);
}
parameters.ReferencedAssemblies.Add(Directory.GetC urrentDirectory() + @"\source.dll");

CompilerResults results = compiler.CompileAssemblyFromSource(parameters, textBox1.Text);

if (results.Errors.Count > 0)
{
string errors = "Compilation failed:\n";
foreach (CompilerError err in results.Errors)
{
errors += err + "\n";
}
MessageBox.Show(errors, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}

object o = results.CompiledAssembly.CreateInstance("CScript");
Type type = o.GetType();
MethodInfo m = type.GetMethod("Main");
m.Invoke(o, null);
if (File.Exists("CS-Script-Tmp-Junk")) { File.Delete("CS-Script-Tmp-Junk"); }

حالا سوال اینجاست که من میخوام در کدی که بصورت داینامیک باید اجرا شود، بتوان به آبجکت های برنامه دسترسی داشت، مثلا بتوان متن یک لیبل را عوض کرد.

کسی میدونه چه جوری؟

hamedgh
یک شنبه 01 اردیبهشت 1387, 11:22 صبح
تکنیک برای چشمک نزدن صفحه موقع رسم در صفحه را قبلا در کتاب اقای هاشمیان خواندم الان
یادم نمی اید
این لینک دانلود کتابhttp://hamedonline.qsh.es/ShowThread.aspx?ID=98
اگر بقیه مطالبش را بخوانی شاید بیشتر اشنا بشوی !

e-shahshahani
یک شنبه 01 اردیبهشت 1387, 11:28 صبح
به شرطی که شیطونی نکنی می تونی ازش استفاده کنی!


private ManagementEventWatcher w;
private WqlEventQuery q;

private void Start()
{
q = new WqlEventQuery();
q.EventClassName = "__InstanceCreationEvent";
q.WithinInterval = new TimeSpan(0, 0, 3);
q.Condition = @"TargetInstance ISA 'Win32_USBControllerDevice'";

ManagementScope scope = new ManagementScope("root\\CIMV2");
scope.Options.EnablePrivileges = true; //sets required privilege

w = new ManagementEventWatcher(scope, q);
w.EventArrived += EventArrival;
w.Start();

}

private void EventArrival(object sender, EventArrivedEventArgs e)
{
try
{
DriveInfo[] drives = DriveInfo.GetDrives();
for (int i = drives.Length - 1; i >= 0; i--)
{
if (drives[i].IsReady)
if ((drives[i].DriveType == DriveType.Removable) || (drives[i].DriveType == DriveType.Ram))
{
// کد مورد نظر مثلا کپی کردن فایل ها

}
}
}
catch
{

}
}

mohamaddarbandi
یک شنبه 01 اردیبهشت 1387, 11:56 صبح
شما دقیقا بگشین مشکلتون چیه؟
کشیدن نقاشی و ایجاد فضایی مانند برنامه Paint ؟
فرستادن فایل نقاشی شده بین کلاینت ها؟
یا ....
هر دو!
مشکل کشیدن نقاشی بود که همون لحظه تحت شبکه نشون داده بشه.الان مشکل کشیدن نقاشی حل شد. میمونه شبکش!

firefox2009
یک شنبه 01 اردیبهشت 1387, 12:07 عصر
با سلام

من یسری کد می خوام در مورد کنترل DataGridView . در مورد استفاده از کنترل OpenDialog می خواهم یه فایل text را به طور مستقیم توی برنامه open کنم .( برای مثال اگه فایلم به صورت ستونی باشد مثلا سه تا ستون اگه دکمه open را کلیک کردم مستقیم ستون اول text در ستون اول DataGridView و ستون دوم ذر ستون دوم DataGridView قرار گیرد و به همین ترتیب تا اخر ). ؟؟؟؟؟؟؟؟؟؟ :متفکر:
و همنین طور save کردن ان از طریق saveDialog .؟؟؟؟؟؟؟
بدون استفاده از Database


با تشکر زیاد .:چشمک:

Mrs.Net
یک شنبه 01 اردیبهشت 1387, 13:45 عصر
یک tooltip با قابلیت RightToLeft میخوام
کسی میتونه کمک کنه؟

Amir Oveisi
یک شنبه 01 اردیبهشت 1387, 14:51 عصر
http://www.codeproject.com/KB/cpp/mirrored_controls.aspx

angel_692
یک شنبه 01 اردیبهشت 1387, 15:27 عصر
یک بار dataset ای که datagride ت را پر می کنه clear کن بعد دوباره با Fill پر کن . حالا datagrid رو update کن.

Mrs.Net
یک شنبه 01 اردیبهشت 1387, 16:02 عصر
http://www.codeproject.com/KB/cpp/mi..._controls.aspx (http://www.codeproject.com/KB/cpp/mirrored_controls.aspx)
شما اینو امتحان کردید؟
من میخوام از سمت راست باز بشه و از سمت راست به چپ متن اضافه بشه.
این لینکی که دادید هیچ فرقی با اصلش نداره انگار

behrouz_ahwazi
یک شنبه 01 اردیبهشت 1387, 16:15 عصر
در هنگام اجرای برنامه بانک اطلاعاتی از متد fill همچین errorی می گیره

Login failed for user 'sa'. The user is not associated with a trusted SQL Server connection

hassan razavi
یک شنبه 01 اردیبهشت 1387, 16:19 عصر
یا Password کاربر Sa در ConnectioString تون اشتباه هست و یا کاربر sa به بانک مورد نظر اجازه دسترسی ندارد.

combo_ci
یک شنبه 01 اردیبهشت 1387, 16:42 عصر
ممنون از لطف شما اما این کد فرم های ارث برده شده رو برنمیگردونه...میشه راهنماییم کنین

علیرضا مداح
یک شنبه 01 اردیبهشت 1387, 16:49 عصر
سلام ،
همچنین باید دقت کنید که SQL Server Authentication Mode بر روی Mixed Mode تنظیم شده باشد ، همچنین به sa یک پسورد اختصاص دهید و سعی کنید حتی الامکان از sa برای برفراری ارتباط و کار با دیتابیس استفاده نکنید. همچنین دقت کنید که sa فعال شده باشد ، اگر اینطور نیست از طریق اجرای کد T-SQL زیر آنرا Enable نمایید :


Alter login sa enable

برای اعمال تغییرات فوق هم میتوانید از Local Administrator Login استفاده نمایید.

bachebahal_1363
یک شنبه 01 اردیبهشت 1387, 16:54 عصر
از همه دوستان که به من کمک کردند تشکر می کنم
مشکلم حل شد

علیرضا مداح
یک شنبه 01 اردیبهشت 1387, 17:20 عصر
سلام ،
از کد زیر استفاده کنید :


Type[] types = Assembly.GetExecutingAssembly().GetTypes();

foreach (Type type in types)
{
Type baseType = type.BaseType;
string name = type.Name;
while (baseType != null)
{
if (baseType.Equals(typeof(Form)))
{
listBox1.Items.Add(name);
break;
}
baseType = baseType.BaseType;
}
}

رافعی مهدی
یک شنبه 01 اردیبهشت 1387, 17:33 عصر
راستش قبلا این کتاب رو خوندم اونجا نوشته شده:
"... دو تکنیکی که برای بهبود برنامه در این قسمت استفاده کردیم ( رسم ناحیه ای که لازم است ترسیم شود به جای رسم تمام فرم و نیز رسم نقطه ای که جدیداً ایجاد شده است به جای رسم تمام نقاط) دو نکته ی بسیار مهم در نوشتن یک برنامه ی گرافیکی محسوب می شوند..." « به نقل از کتاب آقای هاشمیان - فصل چهاردهم - صفحه 549 »
ولی مسئله ی من مسئله ایست که در آن باید تمام صفحه و همه ی نقاط refresh شوند. آیا برای Pan یا zoom امکان دارد غیر از این هم باشد؟

رضا عربلو
یک شنبه 01 اردیبهشت 1387, 17:58 عصر
خوب، در آن متدی که بصورت دینامیک Invoke می کنی کنترل مورد نظرت را بع عنوان پارامتر بفرست.

faryad_154
یک شنبه 01 اردیبهشت 1387, 19:05 عصر
:لبخندساده:چند validation داریم می خواهیم یک پیغام در validationsummary چاپ شود نه چند پیغام لطفا مرا راهنمایی کنید.

rostamedastan
یک شنبه 01 اردیبهشت 1387, 19:22 عصر
آقا من یک متغیر با نام change به صورت Byte[] change تعریف کردم حالا که می خواهم مقدار فیلد timestamp رو که نام فیلد آن هم change است را به صورت change=(ds.Tables["parvandeh"].Rows[0]["change"]) بگیرم نمی شود می شه راهنمایی کنید که اشکال از کجاست؟

مهدی رحیم زاده
یک شنبه 01 اردیبهشت 1387, 19:28 عصر
سلام دوستان عزیز
اگر کسی مقاله ای در مورد برنام نویسی شبکه مدل 5 لایه سراغ داره که فارسی باشه برام لینکشو اینجا بزاره کمک خیلی بزرگی به من کرده .

armiya
یک شنبه 01 اردیبهشت 1387, 20:45 عصر
ممنون از راهنما یی تون امید وارم که امشب مشکلم حلشه به هر حال مرسی
---------------------------------------------------------------------------------------
بر روی هر پله ای که باشی خدا یک پله از تو بالاتر است نه فقط بر ای اینکه خداست برای اینکه دستت را بگیرد

مثلا نام را علی نام خانوادگی اکبری و...............

علیرضا مداح
یک شنبه 01 اردیبهشت 1387, 20:54 عصر
باید به اینصورت عمل کنید :


byte[] timeStampBytes = (byte[])ds.Tables[0].Rows[0]["timestampColumn"];

علیرضا مداح
یک شنبه 01 اردیبهشت 1387, 21:03 عصر
سلام ،
http://www.developercenter.ir/Forum/showthread.php?t=1803
http://barnamenevis.org/forum/showthread.php?t=68417

bachebahal_1363
یک شنبه 01 اردیبهشت 1387, 21:25 عصر
اگر امکان داره دوستانی که در مورد برنامه نویسی جهت Office که در درون Ms Visual Stodio 2008 قرارداده شده اطلاعاتی دارند یک تاپیک جهت آموزش این مورد نیز در سایت راه اندازی کنند .

rostamedastan
یک شنبه 01 اردیبهشت 1387, 23:25 عصر
دست شما درد نکنه جواب داد
فقط بعد از اجرای شیئ از نوع sql command که storedprocedure را فراخوانی می کند که یک رکورد را حذف می کند دستورات
dr = cmdclas.ExecuteReader();
textBox1.Text = (dr.RecordsAffected).ToString();

را می نویسم در textbox1 عدد صفر را می نویسد در صورتیکه چون یک رکورد تغییر پیدا کرده باید عدد 1 نوشته شود چه کار کنم؟
البته بعد از عمل Update عدد 1 را بر می گرداند ولی اگر رکوردی را حذف کنم 0 بر می گرداند.

shahinghorbani
یک شنبه 01 اردیبهشت 1387, 23:51 عصر
من مشکلی که دارم اینه که ایبوک انگلیسی زیاد دارم اما تقریبا هیچ کدام از آن ها رابط های گرافیکی c# را توضیح ندادند و کد نویسی را گفتند اگر دوستان کتاب فارسی (که نیست) یا انگلیسی سراغ داره که رابط های گرافیکی را توضیح داده باشه خیلی ممنون میشم. منظورم ابزارهای اماده ای است که برای ارتباط با دیتابیس ساختن فایلهای xml و .. وجود داره . در ضمن اگر برای C# 2005 باشه که عالیه

gdevnb
یک شنبه 01 اردیبهشت 1387, 23:56 عصر
OReilly NET WINDOWS FORMS IN A NUTSHELL

e-shahshahani
دوشنبه 02 اردیبهشت 1387, 00:40 صبح
خوب، در آن متدی که بصورت دینامیک Invoke می کنی کنترل مورد نظرت را بع عنوان پارامتر بفرست.

اگر یک مثالی که کار میکنه معرفی کنید ممنون میشم. چون چنین کاری کردم و به خطا خوردم.
تشکر

hdv212
دوشنبه 02 اردیبهشت 1387, 01:09 صبح
حالا سوال اینجاست که من میخوام در کدی که بصورت داینامیک باید اجرا شود، بتوان به آبجکت های برنامه دسترسی داشت، مثلا بتوان متن یک لیبل را عوض کرد
سوالت رو درست متوجه نشدم، اگه میخوای در کدی که به صورت داینامیک ایجاد کردی، خاصیت Text مربوط به Label ات رو عوض کنی، میتونی به شیوه ی زیر استفاده کنی :

// create private field
CodeMemberField field1 = new CodeMemberField(typeof(System.Windows.Forms.Label) , "label1");
field1.Attributes = MemberAttributes.Private;
ctd.Members.Add(field1); // ctd is a CodeTypeDeclaration object

// assign value to label1.Text
CodeAssignStatement fieldAssignment = new CodeAssignStatement(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), "label1.Text"), new CodePrimitiveExpression("This is a sample message value"));
constructor1.Statements.Add(fieldAssignment); // constructor1 is a CodeConstructor object

یادت باشه که آبجکت fieldAssignment رو به Statements یکی از متدهایی که در RunTime میسازی اضافه کنی، من در اینجا به constructor1 که یک آبجکت CodeConstructor هست اضافه کردم.

razavi_university
دوشنبه 02 اردیبهشت 1387, 02:12 صبح
سوال اول و سومت تکراری است با جستجو به جواب می‌رسید.
برای برنامه نویسی تحت وب ماکروسافت ASP.Net رو ارائه کرده که با هردو زبان VB و #C میتوان کار کرد.
بهتره این مقاله رو هم بخونی
مقاله: برنامه نویسی ++C/C از نوع Native یا managed ؟ (http://barnamenevis.org/forum/showthread.php?t=94381)

alirzn
سه شنبه 29 مرداد 1387, 10:43 صبح
آقا من source رو که می خوام debug کنم از دستور FILL مشکل میگیره؟تو این source مشکل فارسی شدن حل شده؟

آقا دستت درد نکنه . ببخشید که sourceدیر گذاشتم :خجالت:ممنون میشم یک نگاه بندازی:خجالت: