صفحه 1 از 3 123 آخرآخر
نمایش نتایج 1 تا 40 از 88

نام تاپیک: خواندن dbf در 2005 C#‎

  1. #1

    خواندن dbf در 2005 C#‎

    من می خوام با 2005 C#‎ به فایلهای dbf مربوط به foxpro وصل شوم و به رکوردهای آن دسترسی پیدا کنم ممکنه من رو راهنمائی کنید .اصلا همچین امکانی وجود دراد یا نه


  2. #2
    سلام ،
    باید از اشیاء فضای نام System.Data.Odbc استفاده نمایید.
    I've just started tweeting!
    @Alireza_Maddah

  3. #3
    کاربر دائمی آواتار KavoshGar_ir
    تاریخ عضویت
    شهریور 1386
    محل زندگی
    Isfahan
    پست
    198
    نقل قول نوشته شده توسط ali2000_1358 مشاهده تاپیک
    من می خوام با 2005 C#‎ به فایلهای dbf مربوط به foxpro وصل شوم و به رکوردهای آن دسترسی پیدا کنم ممکنه من رو راهنمائی کنید .اصلا همچین امکانی وجود دراد یا نه
    از sql server هم می توانید استفاده کنید به عبارتی خواندن فایل را توسط یک stored procedure به sql server بسپارید و بعد از مقادیری که خوانده در برنامه تان استفاده کنید.

  4. #4
    کاربر جدید
    تاریخ عضویت
    آبان 1385
    محل زندگی
    تهران
    سن
    32
    پست
    29
    باید از اشیاء فضای نام System.Data.Odbc استفاده نمایید
    با کلاسهای موجود در این فضای نام میتونی از فایل text,paradox,faxpro گرفته تا بانکهای اطلاعاتی sqlserver,oracle رو بخونی و تغییر بدی.

  5. #5
    کاربر تازه وارد
    تاریخ عضویت
    بهمن 1386
    محل زندگی
    تهران
    پست
    80
    شما می توانید از ODBC استفاده کنید ولی با فارسی به مشکل می خورید. برای حل این مشکل هم اگر جستجو کنید راه حل را پیدا می کنید. در تاپیک های فاکس پرو جستجو کنید.

  6. #6
    دستتون درد نکنه من از odbc استفاده کردم و به بانک وصل شدم . در odbcAdapter در پیش نمایش اطلاعات رو نشان می دهد ولی وقتی می خواهم اطلاعات رو fill کنیم و در گرید مشاهده کنیم پیغام خطای زیرو می دهد

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

  7. #7
    دوستان کسی نمی دونه علت این پیغام خطا چی هست .
    کسی در این مورد یک مثال ندارد به من بده

  8. #8
    لطف کن و کد مربوط به این قسمتو بزار.

  9. #9

    راست به چپ کردن tooltip

    چطوری میشه Tooltip Balloon رو کاملاً Right to Left کرد؟؟

  10. #10
    به این یه نگاهی بکن
    شاید به دردت بخوره
    فایل های ضمیمه فایل های ضمیمه

  11. #11
    نقل قول نوشته شده توسط mostafa.vahab مشاهده تاپیک
    به این یه نگاهی بکن
    شاید به دردت بخوره
    کد خوبی بود مرسی.
    ولی مشکل RTL رو حل نکرد.

  12. #12

    مشکل در طراحی یک گزارش

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

    مثلا نام را علی نام خانوادگی اکبری و...............
    آخرین ویرایش به وسیله sinpin : یک شنبه 25 فروردین 1387 در 04:46 صبح

  13. #13
    سلام ،
    در صورتیکه اطلاعات گزارش از دیتابیس گرفته نمیشود و در همان زمان از کاربر گرفته میشود میتوانید چند TextObject در گزارش قرار داده و از طریق کالکشن ReportClass.ReportDefinition.ReportObjects به شی ء مورد نظر دسترسی داشته باشید ، ولی اگر گزارش شما به همین سادگی است پیشنهاد میکنم از PrintPreviewControl و PrintDocument استفاده نمایید.
    I've just started tweeting!
    @Alireza_Maddah

  14. #14
    ممنون از برنامه ولی کاری که من گفتم یه چیزه دیگه بود.

  15. #15

    source

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

  16. #16

    مشکل حذف یک رکورد از dataGridview

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

  17. #17
    DataTable متصل به DataGride را مجددا Fill کنید

  18. #18
    دوستان اگر ممکنه لطف کنید یک نگاهی به این source ما بندازید

  19. #19
    کاربر دائمی آواتار rostamedastan
    تاریخ عضویت
    فروردین 1384
    محل زندگی
    جمهوری اسلامی ایران
    پست
    111

    Question مشکل همزمانی کاربران

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

  20. #20
    کاربر دائمی آواتار Pioneers
    تاریخ عضویت
    فروردین 1385
    محل زندگی
    شیراز
    پست
    217
    از Transaction استفاده کنید. هم در C#‎ و هم در Sql Server موجود است. دارای قفلهای مختلفی است از جمله برای نوشتن، خواندن و ...

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

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


    وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
    و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.

  22. #22
    سلام ،
    یک روش هم به کارگیری Timestamp میباشد :
    http://www.codeproject.com/KB/aspnet...ntupdates.aspx
    I've just started tweeting!
    @Alireza_Maddah

  23. #23
    سلا م مممنون از را هنما یی تون ولی می خوام که اطلا عات تو یه دیتا بیس ذخیره بشه و در هنگامی که ذخیره شده کاربر بتونه متن مورد نظر رو تو مو قعیت های خودش قرار بدهو گزارش رو به طرف بده من با crystal report کمی کار کردم ولی متا سفانه نشد اگه ممکنه یه مثال در بارش واسم بزارین ممنون می شم
    -----------------------------------------------------------------------
    رنگین کمان پاداش کسانی است که تا اخرین قطره زیر باران می مانند

  24. #24
    کاربر دائمی آواتار bachebahal_1363
    تاریخ عضویت
    اسفند 1384
    محل زندگی
    اینترنت
    پست
    336

    Tick تغییر در منوهای فرم والد از طریق یک فرم فرزند

    سلام خدمت دوستان
    سوال من این هست که برای مثال من یک فرم parent دارم و یک فرم Child و در فرم Parent یک سری menu حال می خواهم توسط فرم Child که به عنوان فرم LogIn برنامه من هست اگر نام کاربری و رمز عبور رو به درستی تایپ کرد و کلید ورود را فشار داد یک سری منو ها فعال شود در غیر این صورت منو ها به صورت غیر فعال باقی بماند
    اگر کسی می تواند کمک کنه
    در Vb.Net به راحتی با دستور زیر می توان این کار را انجام داد چون با ساخت یک آبجکت فرم Parent تمامی کنترل های موجود در فرم Parent قابل استفاده در فرم Child بود و هر تغییری به راحتی صورت می گرفت .
    Dim frm as new Form1
    frm.menubar1.visible=false
    آخرین ویرایش به وسیله bachebahal_1363 : پنج شنبه 29 فروردین 1387 در 22:40 عصر

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

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

  26. #26
    کاربر دائمی آواتار tthenry14plus
    تاریخ عضویت
    مرداد 1386
    محل زندگی
    Tehran
    پست
    218
    از 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 از مسیری که در عکس ضمیمه مشخصه بری و کانکشن کریستال ریپورتتو
    به دیتاست مربوط کنی :
    عکس های ضمیمه عکس های ضمیمه

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


    وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
    و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.

  28. #28
    کاربر دائمی آواتار rostamedastan
    تاریخ عضویت
    فروردین 1384
    محل زندگی
    جمهوری اسلامی ایران
    پست
    111
    یعنی من در #C خودم به صورت دستی همانطور که در تاپیک بالا گفتم که یک فیلد مثلا با نام change عمل کنم یا کد وتابعی برای این کار وجود دادر؟
    مثلا آیا در دلفی چنین تابعی وجود دارد؟

  29. #29
    یعنی من در #C خودم به صورت دستی همانطور که در تاپیک بالا گفتم که یک فیلد مثلا با نام change عمل کنم یا کد وتابعی برای این کار وجود دادر؟
    امکاناتی که برای Lock کردن گفتم، مربوط به ADO و SQL Server میشند و باید در ADO.Net هم موجود باشد. تمام اون کارهایی که گفتم توسط خود ADO و سرور بانک اطلاعاتی انجام میشه، نه اینکه شما خودتون توی برنامه تون از فیلدی برای این کارها استفاده کنید! شما فقط نوع قفل رو تعیین می کنید، مابقی کارها رو خودشون انجام میدن.

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


    وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
    و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.

  30. #30
    نقل قول نوشته شده توسط rostamedastan مشاهده تاپیک
    بسم الله الرحمن الرحیم
    سلام علیکم
    من می خواهم برنامه ایکه با 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 به کاربر بر میگردونن که تعداد رکوردهای تاثیر یافته از این سه عمل رو به کاربر بر میگردون. اگر این مقدار صفر باشه، یعنی رکورد مورد نظر پیدا نشده، در نتیجه، همزمانی رخ داده. یعنی یا اون رکورد توسط کاربر دیگه ای پاک شده، یا تغییر پیدا کرده.

  31. #31
    کاربر دائمی آواتار bachebahal_1363
    تاریخ عضویت
    اسفند 1384
    محل زندگی
    اینترنت
    پست
    336
    مثل اینکه کسی راه حلی توصیه نمی کنه

  32. #32
    کاربر دائمی آواتار Pioneers
    تاریخ عضویت
    فروردین 1385
    محل زندگی
    شیراز
    پست
    217
    جالبه. اغلب با 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 نام فرم دارای منو است.

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

  33. #33
    کاربر دائمی آواتار rostamedastan
    تاریخ عضویت
    فروردین 1384
    محل زندگی
    جمهوری اسلامی ایران
    پست
    111
    با تشکر از تمامی دوستان که مرا راهنمایی کردند.
    الان من کلاً با مفهوم انواع قفل آشنا شدم که قبلاً بلد نبودم حالا چگونه به مقدار این فیلد timestamp دسترسی داشته باشیم آیا باید به این فیلد مقدار اولیه بدهیم؟ آیا برای حل مشکل همزمانی باید برای تمامی جداول که امکان ویرایش کردن و حذف رکورد در آن از سوی کاربر وجود دارد یک فیلد از این نوع تعریف کرد؟
    برای حل مشکل delete هم می شود از این فیلد استفاده کرد؟

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

    حالا چگونه به این مقدار RecordsAffected دسترسی داشته باشیم ؟
    آخرین ویرایش به وسیله rostamedastan : جمعه 30 فروردین 1387 در 22:39 عصر

  34. #34
    نقل قول نوشته شده توسط rostamedastan مشاهده تاپیک
    با تشکر از تمامی دوستان که مرا راهنمایی کردند.
    الان من کلاً با مفهوم انواع قفل آشنا شدم که قبلاً بلد نبودم حالا چگونه به مقدار این فیلد 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 رو بهتون میده!

  35. #35
    کاربر دائمی آواتار bachebahal_1363
    تاریخ عضویت
    اسفند 1384
    محل زندگی
    اینترنت
    پست
    336
    نقل قول نوشته شده توسط Pioneers مشاهده تاپیک
    جالبه. اغلب با 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;
    تعریف کنید
    اما در مورد کد نوشته در فرم دوم باید بگم که امتحانش کردم اما جوابی نداد
    اگر به صورت یک فایل ضمیمه نمونه ای از یک پروژه رو برام بزارین ممنون می شم

  36. #36
    نقل قول نوشته شده توسط bachebahal_1363 مشاهده تاپیک
    سلام خدمت دوستان
    سوال من این هست که برای مثال من یک فرم parent دارم و یک فرم Child و در فرم Parent یک سری menu حال می خواهم توسط فرم Child که به عنوان فرم LogIn برنامه من هست اگر نام کاربری و رمز عبور رو به درستی تایپ کرد و کلید ورود را فشار داد یک سری منو ها فعال شود در غیر این صورت منو ها به صورت غیر فعال باقی بماند
    اگر کسی می تواند کمک کنه
    در Vb.Net به راحتی با دستور زیر می توان این کار را انجام داد چون با ساخت یک آبجکت فرم Parent تمامی کنترل های موجود در فرم Parent قابل استفاده در فرم Child بود و هر تغییری به راحتی صورت می گرفت .
    Dim frm as new Form1
    frm.menubar1.visible=false
    نقل قول نوشته شده توسط bachebahal_1363 مشاهده تاپیک
    مثل اینکه کسی راه حلی توصیه نمی کنه
    برای مثال در فرم فرزند بنویسید :
    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 بود)
    ...مرا به خانه ام ببر، اگرچه خانه؛ خانه نیست

  37. #37
    کاربر جدید آواتار mohamaddarbandi
    تاریخ عضویت
    اسفند 1386
    محل زندگی
    Iran/Shiraz
    پست
    27

    Tick ایجاد یک محیط شبیه سازی نقاشی مشترک بین کاربران شبکه

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

  38. #38
    نقل قول نوشته شده توسط mohamaddarbandi مشاهده تاپیک
    سلام دوستان!
    چطور میشه در سی شارپ مثل قلم paint نقاشی کشید؟
    موضوع از این قراره که این نقاشی قراره تحت شبکه برای کلاینت های دیگه ارسال بشه و اونا حدس بزنند نقاشی کننده چی کشیده. لازم نیست زیاد حرفه ای باشه. در حد شبیه سازی خودکار و کاغذ معمولی!
    اگر از ویژوال استودیو 2008 استفاده می کنید، که قضیه کاملا متفاوته.. ولی اگر از دات نت 2 استفاده می کنید، ابزار های زیادی برای نقاشی کردن وجود داره...
    Pen
    Brush
    GradientBrush
    و ...

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

    مجموعه آموزشی Asp.Net Core Mvc کاملا به زبان فارسی(21 ماژول و 15 ساعت فیلم آموزشی همراه با سورس کامل تمرینات و پروژه عملی انجام شده در طول آموزشی)
    مشاهده جزئیات در آدرس http://www.mkiani.ir/blog/content/53084


    وب سایت : http://www.mkiani.ir
    پست الکترونیک : mkiani3000@gmail.com

    موفق و پیروز باشید.
    مهدی کیانی


  39. #39
    شما باید با Socket Programing آشنا باشید. بعد مشخصات موس را باید برای Client مقابل ارسال کنید (همراه با اطلاعات دیگه مثل رنگ انتخاب شده و ضخامت خط و ...)
    حالا در طرف مقابل اطلاعات بدست آمده را توسط کلاس Graphics و متدهای Draw... رسم کنید

  40. #40
    موضوع از این قراره که این نقاشی قراره تحت شبکه برای کلاینت های دیگه ارسال بشه و اونا حدس بزنند نقاشی کننده چی کشیده

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

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

    مجموعه آموزشی Asp.Net Core Mvc کاملا به زبان فارسی(21 ماژول و 15 ساعت فیلم آموزشی همراه با سورس کامل تمرینات و پروژه عملی انجام شده در طول آموزشی)
    مشاهده جزئیات در آدرس http://www.mkiani.ir/blog/content/53084


    وب سایت : http://www.mkiani.ir
    پست الکترونیک : mkiani3000@gmail.com

    موفق و پیروز باشید.
    مهدی کیانی


صفحه 1 از 3 123 آخرآخر

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •