ably ably برای هدایت شدن به سایت جدید اینجا کلیک کنید

آموزش برنامه نویسی

آموزش برنامه نویسی وب، اندروید، ویندوز , اسکیوال و...
Tell: 0912 097 5516
| Email: Hello@EduOnline.ir

آموزش Code First Data Annotations

بسم الله الرحمن الرحیم

 برای مشاهده بخش های دوره آموزش Code First Data Annotations از طریق لینکهای زیر اقدام نمایید.

بخش اول

بخش دوم

بخش سوم

بخش چهارم

آموزش Code First

بخش اول

Data Annotations

در طراحی پایگاه داده به وسیله Entity Framework  در MVC برای مشخص کردن خصوصیت های جداول و فیلدها می بایست از خاصیتی به نام Data Annotations استفاده کنید. کار با این خصوصیت بسیار ساده می باشد.
ما دو کلاس را برای پروژه خود نیاز داریم، این دو کلاس را با نام های Blog.cs و Post.cs در فولدر Model پروژه MVC خود ایجاد می کنیم و کد های زیر را در آن ها قرار می دهیم.

public class Blog 
{
public int Id { get; set; }
public string Title { get; set; }
public string BloggerName { get; set;}
public virtual ICollection<Post> Posts { get; set; }
}

public class Post
{
public int Id { get; set; }
public string Title { get; set; }
public DateTime DateCreated { get; set; }
public string Content { get; set; }
public int BlogId { get; set; }
public ICollection<Comment> Comments { get; set; }
}

Key 

تعیین کلید اصلی جداول

Entity Framework برای ایجاد کلید اصلی جدول شما در دیتابیس، در مدلی که طراحی کردید به دنبال نام Id و یا نام کلاس شما به علاوه کلمه Id (مثلا BlogId) می گردد، هر یک از این دو پراپرتی در صورتی که در کلاس شما وجود داشته باشد تبدیل به کلید اصلی در جدول پایگاه داده می شود.

در صورتی که هیچ یک از این دو کلمه در کلاس مدل شما وجود نداشته باشد Entity Framework یکexception  برای این مورد throw می کند. برای حل این مشکل کافی است از خاصیتی به نام [Key]در بالای فیلد کلید خود استفاده کنید.
مثلا ما می خواهیم در اینجا نام کلید اصلی خود راPrimaryTrackingKey قرار دهیم پس باید کد خود را به صورت زیر تغییر دهیم.

ادامه مطلب...

متوقف کردن اجرای دستورات برای مدت زمان 5 ثانیه

بسم الله الرحمن الرحیم

در خصوص متوقف کردن و Sleep کردن برنامه چندین راه متفاوت وجود دارد.

با یک مثال صورت سوال را مشخص و سپس به سراغ پاسخ آن می رویم.

برنامه ای داریم که می خواهیم برای مدت زمان 5 ثانیه متوقف شود و مجددا به کار خود ادامه دهد؟

یکی از ابتدایی ترین راه ها ایجاد یک حلقه for طولانی است که به وسیله آن مدت زمانی را صرف اجرای این دستور کنید!

DateTime start = DateTime.Now;
for (int i = 1; i < 100000; i++)
{
    if ((DateTime.Now - start).TotalSeconds >= 5)
        break;
    Console.WriteLine("This is test no. "+ i+ "\n");
}

راه دوم، بررسی زمان جاری سیستم و ذخیره آن و در نهایت ایجاد یک حلقه تا زمانی است که مدت 5 ثانیه از زمان شروع کار گذشته باشد

    DateTime Tthen = DateTime.Now;
                do
                {
                    Application.DoEvents();
                } while (Tthen.AddSeconds(5) > DateTime.Now);     

ادامه مطلب...

SendKeys

بسم الله الرحمن الرحیم

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

// Clicking Button1 causes a message box to appear. 
    private void Button1_Click(System.Object sender, System.EventArgs e)
    {
        MessageBox.Show("Click here!");
    }


    // Use the SendKeys.Send method to raise the Button1 click event  
    // and display the message box.
    private void Form1_DoubleClick(object sender, System.EventArgs e)
    {

        // Send the enter key; since the tab stop of Button1 is 0, this
        // will trigger the click event.
        SendKeys.Send("{ENTER}");
    }

ادامه مطلب...

T4MVC

بسم الله الرحمن الرحیم

 معرفی T4MVC

T4MVC می تواند بر روی نسخه های Visual Studio 2010, 2012  و  2013نصب شود وASP.NET MVC 4.0  و  5.0این Package را پشتیبانی می کنند، شاید بتوانید بر روی سایر نسخه ها از این Package استفاده کنید اما این Package فقط بر روی گزینه های گفته شده تست شده است.

 

نصب T4MVC

برای نصب این Package کافی است که دستور زیر را از طریق Package Manager Console اجرا کنید

Install-Package T4MVC

پس از اجرای این دستور دو فایل به پروژه شما اضافه می شود.

هدف T4MVC

این Package برای جلوگیری از نوشتن اسامی کنترلر ها و اکشن ها و در نهایت view ها به صورت Hard Code مورد استفاده قرار می گیرد.

برای مثال کدزیر را در نظر بگیرید:

<% Html.RenderPartial("DinnerForm"); %>

 

ما از عبارت های رشته ای برای فراخوانی این Partial استفاده کرده ایم، اگر فردا شما بخواهید این نام را تغییر دهید باید در بهترین و سریعترین روش ممکن با استفاده از Finde ویژوال استادیو تمامی نام های مربوطه را تغییر دهید.

اما چرا از ابتدا از روش دیگری استفاده نکنیم!

T4MVC در واقع نام تمامی View,Conreoller,Action ها را به صورت خودکار در خود ذخیره می کند و عملا یک Enumeration  برای شما به وجود می آورد تا در آینده در صورتی که نامی را برای یک View,Conreoller,Action عوض کردید، این نام در تمامی پروژه عوض شود.

مثال:

<% Html.RenderPartial("DinnerForm"); %>

از این به بعد ما نام ها را به صورت زیر خواهیم نوشت:

 

<% Html.RenderPartial(MVC.Dinners.Views.DinnerForm); %>

ادامه مطلب...

fluent API در Code First

بسم الله الرحمن الرحیم

fluent API

در MVC برای ایجاد روابط بین جداول می توانید از fluent API استفاده کنید، این روش برای کد نویسی و طراحی دیتابیس به روش Code First می باشد:

One-to–Zero-or-One (روابط یک به یک)

modelBuilder.Entity<OfficeAssignment>() 
    .HasKey(t => t.InstructorID);

به رابطه بالا One-to–Zero گفته می شود زیرا شما فقط کلید اصلی جدول را مشخص کرده اید آن را به هیچ جدول دیگری ارتباط نداده اید.

modelBuilder.Entity<OfficeAssignment>() 
    .HasRequired(t => t.Instructor)
    .WithOptional(t => t.OfficeAssignment);

در این رابطه ما یک رابطه One-to-One ایجاد کرده ایم. در این رابطه سمت OfficeAssignment اختیاری است.

برای اجباری کردن هر دو سمت در یک رابطه یک به یک می توانید به صورت زیر عمل کنید:

modelBuilder.Entity<OfficeAssignment>() 
    .HasKey(t => t.InstructorID);
 
modelBuilder.Entity<Instructor>()
    .HasRequired(t => t.OfficeAssignment)
    .WithRequiredPrincipal(t => t.Instructor);

ادامه مطلب...

خطای cycles or multiple cascade paths

بسم الله الرحمن الرحیم

خطای زیرا شاید خیلی از شما دوستان عزیز نیز مشاده کردید:

Introducing FOREIGN KEY constraint 'FK_dbo.aspnet_UsersInRoles_dbo.aspnet_Users_UserId' on table 'aspnet_UsersInRoles' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints. Could not create constraint. See previous errors

برای حل این مشکل می توانید از Fluid API استفاده کنید،

در این مثل اگر من کد زیر را به Context خود اضافه کنم مشکل بالا برطرف خواهد شد:

protected override void OnModelCreating( DbModelBuilder modelBuilder )
{

        modelBuilder.Entity<aspnet_UsersInRoles>().HasMany(i => i.Users).WithRequired().WillCascadeOnDelete(false);
}

همچنین با استفاده از این کد می توانید تمامی CASCADE DELETES ها را از بین ببرید:

modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();

اینم مشکل زمانی رخ می دهد که شما در طراحی دیتابیس خود یک چرخه یا Loop ایجاد کرده اید مانند تصویر زیر:

multiple cascade

اگر به متن خطای بالا دقت کنید مشاهده خواهید کرد که عبارت may cause cycles or multiple cascade paths قید شده است، همان طور که خدمتتان عرض کردم، اگر در طراحی دیتابیس شما چندین جدول را به صورت بالا طراحی کنید که با یکدگیر در ارتباط باشند و این ارتباط به صورت یک چرخه شود، و سعی کنید بر روی این چرخه CASCADE ایجاد کنید، SQL Server نمی تواند متوجه بشود که چطور فرایند بروز رسانی Update CASCADE یا حذف Delete CASCADE شما را مدیریت کند زیرا هر یک از این جداول بر روی یکدیگر تاثیر می گذارند و در صورتی که فرایند CASCADE آغاز شود نقطه پایانی وجود نخواهد داشت.

Delete CASCADE و Update CASCADE

برای حل این مشکل می توانید به صورت زیر عمل کنید:

1- فرایند CASCADE را غیر فعال کنید (در صورت غیر فعال کردن باید این فرایند را به صورت Manually مدیریت کنید)

2- Relation را حذف کنید (در صورت حذف کردن باید این فرایند را به صورت Manually مدیریت کنید)

طراحی دیتابیس

در چنینی شرایطی معمولا طراح دیتبیس اشتباهی را مرتکب شده است، پس بهتر است از او بخواهید تا دیتابیس خود را مجددا بررسی کنید، زیرا مدیریت کردن راه حل های بالا که قید شد کمی دقت لازم دارد

انشالله در اولین فرصت روش های ایجاد Relation را در MVC معرفی خواهم کرد

Strongly typed

بسم الله الرحمن الرحیم

Strongly typed

زبان های Strongly typed به شما اجازه نمی دهند که از یک نوع به نام یک نوع دیگر استفاده کنید. مثلا string به int

در Strongly typed به صورت اتوماتیک یک نوع به نوع دیگر تبدیل نمی شود. مثلا در زبان Perl می توانید یک رشته

شامل "123" در یک numeric قرار دهید و این به صورت اتوماتیک تبدیل به 123 می شود اما زبان های strongly typed این کار را انجام نمی دهند مثلا python یک زبان strongly typed است.

طبیعتا خطاهای زیادی را در هنگام کار کردن با سی شارپ مخصوصا LINQ در ارتباط با strongly typed مشاهده کردید:

مثال

var answer = 1 * "1";

این دستور اجرا نمی شود، بلکه شما باید خودتان به صورت صریح تبدیل نوع را انجام دهید.
اما در PHP دستور زیر اجرا می شود:

$x = "3" * 1; // is correct in php

استفاده از یک تابع کنترلر در View

بسم الله الرحمن الرحیم

طبیعتا شما تمامی توابع خود را کلاس های Common  نمی نویسید و مکن است بخواهید یک تابع ساده را که در Controller نوشته شده است در یک view استفاده کنید. برای استفاده از توابع در View  می توانید به صورت زیر عمل کنید:

تابع زیر در کنترلر نوشته شده است:

public int getClientID(string login)

    {
        var context = new MyEntity(new Uri("host/MyWCF.svc/"));

        var userID = from persons in context.PERSON
                     where persons.LOGIN == login
                     select persons.USER_ID;

        int uID = userID.First();
        var cli = from client in context.CLIENT
                  where client.USER_ID == uID
                  select client.CLIENT_ID;
        int cliID = cli.First();
        return cliID;
    }


می توان این تابع را به صورت زیر فراخوانی کرد اما با Error  مواجه خواهید شد

Client : @{ ((HomeController)(this.ViewContext.Controller)).getClientID(User.Identity.Name); }

خطایی که پس از اجرای این دستور دریافت می کنید به صورت زیر است:

Can only specify query options (orderby, where, take, skip) after last navigation

At line int uID = userID.First();

راه ساده ای که قبلا نیز شما از آن حتما استفاده کرده اید به صورت زیر است:

@Html.Action("Home","getClientID", new {login=User.Identity.Name})

بروز رسانی دیتابیس و خطا One or more validation errors were detected during model generation

بسم الله الرحمن الرحیم

بروز خطای

An exception of type 'System.Data.Entity.ModelConfiguration.ModelValidationException' occurred in EntityFramework.dll but was not handled in user code

 Additional information: One or more validation errors were detected during model generation:

 

 یا خطای

One or more validation errors were detected during model generation:

پس از اجرای کد زیر

db.Database.Initialize(true);

 

 برای رفع این خطا کافی است که پایگاه داده خود را با استفاده از دستور

Update-database –force

بروز نمایید.

این خطا به این دلیل است که اگر Migration بخواهد جداول شما را تغییر دهد اطلاعات شما به دلیل حذف شدن فیلد یا فیلدهایی از بین خواهد می رود؛ به همین دلیل این کار را بر عهده خودتان قرار می دهد (سلب مسئولیت )

آموزش Asp.net Identity

بسم الله الرحمن الرحیم

برای شروع کار Visual Studio را باز کنید سپس New-> project را انتخاب کنید و در پنجره باز شده مانند زیر NET framework 4.5 را انتخاب کنید و سپس بر روی گزینه ASP.NET Web Application  کلیک کنید.

Asp.net Identity

حال گزینه Emprty را انتخاب کنید و سپس نوع پروژه را از بخش پایین MVC انتخاب نمایید تا پروژه شما ایجاد شود.

آموزش Asp.net Identity

حال پروژه شما ایجاد شده است و کافی است در پنجره Package Manager Console دستور زیرا برای ساخت یک پروژه ASP.NET Identity ایجاد کنید.

Install-Package Microsoft.AspNet.Identity.Samples -Pre 

مدت زمان زیادی را باید منتظر بمانید زیرا تمامی package های زیر توسط این دستور نصب خواهد شد

bootstrap (≥ 3.0.0)

Microsoft.Aspnet.Identity.Core(≥ 2.1.0-alpha1)

Microsoft.Aspnet.Identity.EntityFramework(≥ 2.1.0-alpha1)

Microsoft.Aspnet.Identity.Owin(≥ 2.1.0-alpha1)

Newtonsoft.Json(≥ 5.0.6)

Microsoft.Aspnet.Mvc(≥ 5.1.1.0)

Microsoft.Aspnet.Web.Optimization(≥ 1.1.3)

jQuery(≥ 1.10.2)

jQuery.Validation(≥ 1.11.1)

Modernizr
(≥ 2.6.2)

Microsoft.Owin.Host.SystemWeb
(≥ 2.1.0)

Microsoft.Owin.Security
(≥ 2.1.0)

Microsoft.Owin.Security.Facebook(≥ 2.1.0)

Microsoft.Owin.Security.Cookies(≥ 2.1.0)

Microsoft.Owin.Security.Google(≥ 2.1.0)

Microsoft.Owin.Security.Twitter
(≥ 2.1.0)

Microsoft.Owin.Security.MicrosoftAccount(≥ 2.1.0)

Microsoft.jQuery.Unobtrusive.Validation
(≥ 3.1.1)

Respond
(≥ 1.2)

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

حال به سادگی می توانید کد های مایکروسافت را برای استفاده از ASP.NET Identity بررسی کنید و بیشتر با این معماری آشنا شوید.

در بخش دیگر این معماری را به صورت کامل بررسی خواهیم کرد.

Entity Farmework و Code First

بسم الله الرحمن الرحیم

 

برای طراحی پایگاه داده به وسیله Entity Farmework  و Code First بهتر است این چند نکته را رعایت فرمایید:

 

بهتر است از نام Id به عنوان نام تمامی کلید های اصلی جداول استفاده کنید هر چند در بحث

convention over configuration این نکته مورد قبول است اما چیزی را که همه آن را به عنوان یک قرارداد نانوشته قبول دارند را عوض نکنید تا برای انجام کار توضیحاتی لازم نباشد.

بهتر است از نوع GUID برای کلید های اصلی جداول استفاده کنید. نوع int از لحاظ واکشی اطلاعات سریعتر است زیرا مقایسه عددی سریعتر از مقایسه رشته ای است.

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

بهتر است نام کلیدهای خارجی یک نام از جدول + کلمه ای دی باشد:

مثلا: ProductId

برای تعیین نامی مشخص برای ذخیره property ها در دیتابیس می توانید به صورت زیر عمل کنید:

 

 [Column(“ProductId", TypeName="Guid")] 

 

با توجه به اینکه در MVC به صورت پیش فرض اگر Maxlength برای یک Property String تعیین نشود nvarchar(MAX) در دیتابیس در نظر گرفته می شود، لذا برای تمامی Property مقدار Maxlength را تعریف کنید مگر در شرایطی که نیاز به رشته های طولانی دارید.

با توجه به نحوه ذخیره سازی رشته ها در SQL Server ، اگر یک رشته می تواند در نوع nvarchar(300)  ذخیره شود از این نوع استفاده کنید.

با توجه به اینکه در Entity Framework 6 از روی نوع enum فیلد مناسب در دیتابیس ساخته می شود اما بهتر است فیلدهای از نوع enum به صورت int تعریف شوند و شما خودتان نوع بازیابی شده از دیتابیس را به enum تبدیل کنید.

مثلا

Public int CustomerType {get; set;};

 در نام گذاری property ها این نکته را در نظر داشته باشید که نباید از کلمات کلیدی (SQL Server,Oracle,…) استفاده کنید

مثلا: [Order]

 

بازیابی دیتابیس (Restore) به وسیله EntityFarmework

بسم الله الرحمن الرحیم

در پروژه های MVC شما نیاز خواهید پیدا کرد که دیتابیسی که به وسیله Entity Framework (معمولا در روش Code First) تغییر پیدا کرده است را به حالت قبل بازیابی کنید.

به ازای هر بار درخواست تغییر دیتابیس توسط EF یک شماره منحصر به فرد ایجاد می شود که می توانید در دیتابیس خود در تیبل Migration__  این پارت ها را مشاهده کنید.

برای برگرداندن دیتابیس خود به مرحله قبل می توانید به صورت زیر عمل کنید:

Update-Database -Target 2556

2556 شماره حالتی است که قبل از اعمال تغییرات ثبت شده بوده است.

برای رفتن اولین مرحله نیز می توانید به صورت زیر عمل کنید:

Update-Database -Target 0



برطرف کردن مشکل LINQ to Entities does not recognize

بسم الله الرحمن الرحیم

Server Error in '/' Application.


LINQ to Entities does not recognize the method 'EduOnline' method, and this method cannot be translated into a store expression.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

این خطا زمانی رخ می دهد که شما می خواهید یک دستور مشابه دستور زیر اجرا کنید:

db.Accounts.Where(m => m.AccountType == Enum.AccountTypes.Admin

برای حل این مشکل کافی است که کد خود را به صورت یک عبارت مشخص قابل بررسی توسط LINQ تبدیل کنید، مثلا در اینجا می توانید به صورت زیر و خیلی ساده کد خود را بنویسید و مشکل خود را حل نمایید:

db.Accounts.Where(m => m.AccountType == (int)Enum.AccountTypes.Admin)

در اینجا شما با تبدیل عبارت خود به یک به عبارت قابل مقایسه برای LINQ این مشکل را حل کرده اید

CodeSnippets

بسم الله الرحمن الرحیم

برای نوشتن سریعتر دستورات سی شارپ می توانید از Snippets Code استفاده کنید برای استفاده از این ویژگی کافی است کلید CTRL را به همراه K فشار دهید و سپس کلید S را نیز بزنید حال لیست دستوراتی را مشاهده می کنید که می توانید آن ها را انتخاب کنید در زیر این لیست قرار داده شده است.

برای نوشتن تمامی دستورات زیر کافی است متن نوشته شده را بنویسید و سپس دو بار کلید TAB را از روی کیبورد فشار دهید

نام دستور

توضیحات

if#

Creates a #if directive and a #endif directive.

region#

Creates a #region directive and a #endregion directive.

~

Creates a destructor for the containing class.

attribute

Creates a declaration for a class that derives from Attribute.

checked

Creates a checked block.

class

Creates a class declaration.

ctor

Creates a constructor for the containing class.

cw

Creates a call to WriteLine.

do

Creates a do while loop.

else

Creates an else block.

enum

Creates an enum declaration.

equals

Creates a method declaration that overrides the Equals method defined in the Object class.

exception

Creates a declaration for a class that derives from an exception (Exception by default).

for

Creates a for loop.

foreach

Creates a foreach loop.

forr

Creates a for loop that decrements the loop variable after each iteration.

if

Creates an if block.

indexer

Creates an indexer declaration.

interface

Creates an interface declaration.

invoke

Creates a block that safely invokes an event.

iterator

Creates an iterator.

iterindex

Creates a "named" iterator and indexer pair by using a nested class.

lock

Creates a lock block.

mbox

Creates a call to MessageBox.Show. You may have to add a reference to System.Windows.Forms.dll.

namespace

Creates a namespace declaration.

prop

Creates an auto-implemented property declaration.

propfull

Creates a property declaration with get and set accessors.

propg

Creates a read-only auto-implemented property with a private "set" accessor.

sim

Creates a static int Main method declaration.

struct

Creates a struct declaration.

svm

Creates a static void Main method declaration.

switch

Creates a switch block.

try

Creates a try-catch block.

tryf

Creates a try-finally block.

unchecked

Creates an unchecked block.

unsafe

Creates an unsafe block.

using

Creates a using directive.

while

Creates a while loop.

جلوگیری از باز شدن چندین نسخه از نرم افزار

بسم الله الرحمن الرحیم

در بعضی نرم افزار ها شما می بایست اجازه اجرا کردن چندین نسخه از نرم افزار را از کاربر سلب نمایید.

برای اجرا کردن تنها یک نسخه از نرم افزار توسط کاربر می توان به صورت زیر عمل کنید:

فایل program.cs را باز کنید و در آن کد زیر را اضافه کنید

public static Process PriorProcess()
    // Returns a System.Diagnostics.Process pointing to
    // a pre-existing process with the same name as the
    // current one, if any; or null if the current process
    // is unique.
    {
        Process curr = Process.GetCurrentProcess();
        Process[] procs = Process.GetProcessesByName(curr.ProcessName);
        foreach (Process p in procs)
        {
            if ((p.Id != curr.Id) &&
                (p.MainModule.FileName == curr.MainModule.FileName))
                return p;
        }
        return null;
    }

حال متد Main را به صورت زیر عوض کنید:

[STAThread]
    static void Main()
    {
        if (PriorProcess() != null)
        {

            MessageBox.Show("Another instance of the app is already running.");
            return;
        }
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form());
    }

مشخض کردن فایل و فولدرهای تغییر داده شده

بسم الله الرحمن الرحیم

ممکن است در پروژه ی شما، برای چک کردن یک دایرکتوری (Folder) مجبور باشید برنامه ای بنویسید که دائم مسیر مشخصی را برای شما چک کند و در صورتی که فایلی ایجاد/ حذف / ویرایش شد به شما اطلاع داده شود.

اولین راه حل این است که شما شروع کنید در بازهای زمانی مشخص مسیری را که مد نظر دارید چک کنید!

اما کلاس FileSystemWatcher در NET 4.5. این امکان را به شما می دهد که بدون نیاز به چک کردن مداوم یک مسیر، در هر زمانی که فایلی تغییر داده شد شما اطلاع پیدا کنید. مثال

using System;
using System.IO;
using System.Security.Permissions;

public class Watcher
{

    public static void Main()
    {
    Run();

    }

    [PermissionSet(SecurityAction.Demand, Name="FullTrust")]
    public static void Run()
    {
        string[] args = System.Environment.GetCommandLineArgs();

        // If a directory is not specified, exit program.
        if(args.Length != 2)
        {
            // Display the proper way to call the program.
            Console.WriteLine("Usage: Watcher.exe (directory)");
            return;
        }

        // Create a new FileSystemWatcher and set its properties.
        FileSystemWatcher watcher = new FileSystemWatcher();
        watcher.Path = args[1];
        /* Watch for changes in LastAccess and LastWrite times, and
           the renaming of files or directories. */
        watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
           | NotifyFilters.FileName | NotifyFilters.DirectoryName;
        // Only watch text files.
        watcher.Filter = "*.txt";

        // Add event handlers.
        watcher.Changed += new FileSystemEventHandler(OnChanged);
        watcher.Created += new FileSystemEventHandler(OnChanged);
        watcher.Deleted += new FileSystemEventHandler(OnChanged);
        watcher.Renamed += new RenamedEventHandler(OnRenamed);

        // Begin watching.
        watcher.EnableRaisingEvents = true;

        // Wait for the user to quit the program.
        Console.WriteLine("Press \'q\' to quit the sample.");
        while(Console.Read()!='q');
    }

    // Define the event handlers.
    private static void OnChanged(object source, FileSystemEventArgs e)
    {
        // Specify what is done when a file is changed, created, or deleted.
       Console.WriteLine("File: " +  e.FullPath + " " + e.ChangeType);
    }

    private static void OnRenamed(object source, RenamedEventArgs e)
    {
        // Specify what is done when a file is renamed.
        Console.WriteLine("File: {0} renamed to {1}", e.OldFullPath, e.FullPath);
    }
}

using کردن و LifeTime Object

بسم الله الرحمن الرحیم

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

using System;
using System.Data.SqlClient;
///
public class A {
   ///
   public static void Main() {
      string connectionString = "";
      // Wait for 5 second delay in the command
      string queryString = "waitfor delay '00:00:05'";
      using (SqlConnection connection = new SqlConnection(connectionString)) {
         connection.Open();
         SqlCommand command = new SqlCommand(queryString, connection);
         // Setting command timeout to 1 second
         command.CommandTimeout = 1;
         try {
            command.ExecuteNonQuery();
         }
         catch (SqlException e) {
            Console.WriteLine("Got expected SqlException due to command timeout ");
            Console.WriteLine(e);
         }
      }
   }
}

همانطور که مشاهده می کنید با استفاده از دستور using  می توانیم میدان فعالیت یک شی را به سادگی مشخص کنیم.

تغییر دادن مقدار Timeout در SqlCommand

بسم الله الرحمن الرحیم

در بعضی اگر شما بخواهید یک دستور اسکیوال را از طریق سی شارپ فراخوانی کنید که مدت زمان اجرای آن دستور بسیار طولانی باشد با خطای زیر مواجه می شوید:

Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. The statement has been terminated

برای حل این مشکل شما باید مدت زمان Timeout را در SQL Command افزایش دهید و یا این پارامتر را غیر فعال کنید.

به صورت پیش فرض مدت زمان CommandTimeout در SqlCommand برابر با 30 ثانیه می باشد که شما می توانید به صورت زیر آن را تغییر دهید

SqlCommand sqlCommand= new SqlCommand("select * from table_EduOnline");

SqlCommand.CommandTimeout = 100;//100 secound

و یا با مساوی قرار دادن CommandTimeout برار با 0 آن را غیر فعال کنید

SqlCommand.CommandTimeout = 0;// disable

با استفاده از دستور Delay  می توانید این خاصیت را تست کنید، مثال:

  static void Main(string[] args)

        {

            string cString = @"Data source=<your server>;Integrated Security=SSPI;Initial Catalog=Northwind";

            using (SqlConnection sc = new SqlConnection(cString))

            {

                try

                {

                    SqlCommand cmd = new SqlCommand("waitfor delay '00:00:30';select * from Shippers", sc);

                    cmd.CommandTimeout = 10;

                    Console.WriteLine("CommandTimeout: {0}", cmd.CommandTimeout);

                    sc.Open();

                    SqlDataReader r = cmd.ExecuteReader();

                    while (r.Read())

                        Console.WriteLine("{0} : {1}", r[0].ToString(), r[1].ToString());

                    sc.Close();

                }

                catch (SqlException se)

                {

                    Console.WriteLine(se);

                }

            }

        }

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

بسم الله الرحمن الرحیم

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

برای این روش مثلا اگر قرار باشد فقط میلی ثانیه در مقایسه شما تاثیری نداشته باشد می توانید از کد زیر استفاده کنید

public static DateTime TrimMilliseconds(this DateTime dt)
{
    return new DateTime(dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute, dt.Second, 0);
}

DateTime.Compare(DateTime1.TrimMilliseconds(),DateTime2.TrimMilliseconds);

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

dt = dt.AddMilliseconds(-dt.Millisecond);

اما با این تابع می توانید مقایسه های متفاوتی داشته باشید:

 public static DateTime TruncateTo(this DateTime dt, DateTruncate TruncateTo)
    {
        if (TruncateTo == DateTruncate.Year)
همه
        else if (TruncateTo == DateTruncate.Month)
            return new DateTime(dt.Year, dt.Month, 0);
        else if (TruncateTo == DateTruncate.Day)
            return new DateTime(dt.Year, dt.Month, dt.Day);
        else if (TruncateTo == DateTruncate.Hour)
            return new DateTime(dt.Year, dt.Month, dt.Day, dt.Hour, 0, 0);
        else if (TruncateTo == DateTruncate.Minute)
            return new DateTime(dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute, 0);
        else
            return new DateTime(dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute, dt.Second);

    }
    public enum DateTruncate
    {
        Year,
        Month,
        Day,
        Hour,
        Minute,
        Second
    }

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

DateTime dtSecs = DateTime.Now.TruncateTo(Extensions.DateTruncate.Hour);//فقط سال، ماه، روز و ساعت ذخیره می شود دقیقه و ثانیه هر دو صفر است پس عملا مقایسه بر روی تاریخ و ساعت صورت می گیرید
DateTime dtHrs  = DateTime.Now.TruncateTo(Extensions.DateTruncate.Hour);
DateTime.Compare(dtSecs,dtHrs);
up
ما را در گوگل محبوب کنید