‏نمایش پست‌ها با برچسب SQL and DB programming. نمایش همه پست‌ها
‏نمایش پست‌ها با برچسب SQL and DB programming. نمایش همه پست‌ها

مشکلات حروف فارسی چندگانه


  
برخی از حروف فارسی به چند شکل و به اصطلاح بر اسا Character Set های مختلف نوشته می‌شوند
مثلا:
"ک" و "ك"
"ی" و "ي"
که در اصل شکل‌های دوم عربی هستند
حالا اگر در پایگاه داده‌های شما هردو "ک" و هردو "ی" ذخیره شده باشند باید چه‌کار کرد؟
مثلا شما می‌خواهید یک Select بنویسید که تمام کسانی که نام آنها "بابک" است را برای شما بیاورد
دو نفر با نام بابک در جدول شما ذخیره شده‌اند یکی با "ک" و دیگری با "ك"
یک روش این است که دو شرط برای Select بگذارید که هردو بابک را چک کند، ولی اگر متنی که در حال جستجوی آن هستید طولانی باشد چه؟ اصلا اگر در متن شما هم "ک" وجود داشت و هم "ی" چه؟ یعنی باید ترکیب تمام حالات مختلف را در شرطتان اعمال کنید؟
در واقع اگر مجبور باشید باید این کار را بکنید ولی به‌جای نوشتن تمام متن در حالات مختلف می‌توانید توابعی بنویسید که این کار را برای شما انجام بدهند، این کدی‌است که من از آن استفاده می‌کردم:

  string MakeitFarsi(string NetString)
    {
        NetString = NetString.Replace((char)1705, (char)1603);
        return NetString.Replace((char)1740, (char)1610);

    }

این تابع کارکترهای عربی را با نظایر فارسی آنها معاوضه می‌کند

می‌توانید سه تابع دیگر هم برای جستجوی کارکترهای عربی و ترکیب آنها بنویسید، ولی پیشنهاد من این است که هنگام data entry یعنی وقتی که در حال ثبت اطلاعات در پایگاه داده‌ها هستید آنها را استاندارد سازی کنید، مثلا همه کارکترهای عربی را در آنها فارسی کنید و هنگام انجام جستجو فقط به‌دنبال کارکترهای فارسی بگردید، به‌این ترتیب یک تابع مثل تابع فوق کفایت می‌کند، البته با این شرط که همانطور که گفتم، یک بار هنگام ثبت اطلاعات از آن استفاده کنید و یک بار هم هنگام بازیابی.

Binding در Template Field


  
همانطور که می‌دانید ما به اشیای درون Template Field ها در کد، دسترسی مستقیم نداریم، شما به راحتی می‌توانید Bound Column به یک GridView اضافه کنید ولی اگر Template Field و یا به قول قدیمی‌تر ها Template Column داشته باشید و بخواهید اشیای موجود در آن را (مثلا متن یک Lable) را Bind کنید باید چه کار کرد؟

پاسخ، تابع Eval است، فرض ما این است که شما قبلا به خود Gridview یک Data source داده‌اید و حالا مشکل فقط نمایش Record های آن در اشیای مورد نظر شما است، در حقیقت Container شما دارای Datasource می‌باشد و کافیست که شما از طریق تابع Eval به فیلدهای آن دسترسی پیدا کنید.

شی DataBinder این تابع را در اختیار ما می‌گذارد:
DataBinder.Eval(container, "dataitem.Title")
در مثال فوق، شما به جای Title نام فیلد مورد نظر خود را خواهید گذاشت.

البته این کار را به این راحتی هم می‌توانید انجام دهید:
Eval(“Title”)
حالا این کد باید کجا نوشته بشود؟
کافیست که در محیط Edit Templates، روی شی مورد نظر کلیک کرده و Edit Bindings را برای آن انتخاب کنید، حالا با انتخاب Property مورد نظر و گزینه Custom binding  برای آن می‌توانید Code Expression مورد نظر را (Eval(“FieldName”)) برای آن بنویسید.

پیغام خطا برای Delete Button Field


  
اگر به یک Gridview یک Button Field اضافه کنید و Command Name آن را Delete بگذارید و ItemCommand Event را برای آن بنویسید، احتمالا وقت Raise شدن، پیغام خطایی مبنی بر Handle نکردن Event دریافت خواهید کرد، این خطا به این دلیل اتفاق می‌افتد که کلیلک کردن روی دکمه‌ای که شما Command Name ‌آن را Delete گذاشته‌اید دو Event را فراخوانی می‌کند: itemCommand و Delete را که شما دومی را Handle نکرده‌اید و این مشکل به دلیل کلمه Delete که یک Reserved word است بوجود می‌اید.

پیشنهاد می‌کنم که برای پیشگیری این مشکل، یا Command name را تغییر دهید و یا از یک Command Filed  از نوع Delete استفاده نمایید.

Master-Detail در Grid


پیش فرض:
در Database دو Table به مرتبط با مشخصات زیر وجود دارند:

“Categories” table
ID, CategoryName
“Products” table
      ID, ProductName, CategoryID

بین این دو Table یک Relation بواسطه ID در “categories” و CategoryID در “Products” وجود دارد.

هدف:
نمایش همزمان Category ها و Product ها را در یک Gridview



روش:
در حقیقت در شکل فوق دو gridview وجود دارد، به این معنی که در template column در gridview اول، gridview دیگر گذاشته شده است.
پس از ایجاد دو gridview به ترتیبی که گفته شد کدهای زیر را برای پر کردن Gridview ها در Page_Load می نویسیم.
دقت کنید که در Select Command برای Data adapter برای دو Table دستور Select نوشته شده است:
C#:
            System.Data.SqlClient.SqlDataAdapter da;
            da = new System.Data.SqlClient.SqlDataAdapter("select * from categories;select * from products","Data Source=.;Initial Catalog=TrainingDB;Integrated Security=True");
            System.Data.DataSet ds;
            ds = new System.Data.DataSet();
            da.Fill(ds);
ds.Tables[0].TableName = "Categories";
            ds.Tables[1].TableName = "Products";
VB.NET:
Dim da As New SqlClient.SqlDataAdapter("select * from maincategories;select * from Products", SqlConnection1)
      Dim ds As New DataSet
 da.Fill(ds)
 ds.Tables(0).TableName = "Categories"
 ds.Tables(1).TableName = "Products"

ساختن Relation و اضافه کردن آن به Dataset:

C#:
            System.Data.DataColumn ParentDC = ds.Tables["Categories"].Columns["id"];
            System.Data.DataColumn ChildDC = ds.Tables["Products"].Columns["Categoryid"];
            System.Data.DataRelation dr;
            dr = new System.Data.DataRelation("Categories_Products", ParentDC, ChildDC);
            ds.Relations.Add(dr);

VB.NET
        Dim Parent As DataColumn = ds.Tables("Categories").Columns("ID")
        Dim Child As DataColumn = ds.Tables("Products").Columns("CategoryID")

        Dim CategoryRelation As DataRelation = New DataRelation("Categories_Products", Parent, Child, False)
        ds.Relations.Add(Categories_Products)

پر کردن Gridview اول:

C#
            GridView1.DataSource = ds.Tables["Categories"].DefaultView;
            GridView1.DataBind();
VB.NET:
        DataGrid1.DataSource = ds.Tables("Categories").DefaultView
        DataGrid1.DataBind()

پر کردن Gridview دوم:
این کد باید برای Datasource مربوط به Gridview دوم نوشته شود و نه در Page_load، اگر نمی دانید که چگونه آنرا از طریق Property و Wizard وارد کنید، آن را در محیط  HTMLبرای Gridview دوم و در DataSource property آن بنویسید.

خود کد برای VB.NET به این ترتیب است:

CType(Container.DataItem,DataRowView).CreateChildView("Categories_Products”)
حتما متوجه شده اید این کد برساس ID هر سط و Relation تعریف شده برای Gridview موجود در آن سطر، Datasource سازد.
کد برای C#:

((System.Data.DataRowView)Container.DataItem).CreateChildView("Categories_Products")



مفاهیم اولیه ADO.NET


می توان از ADO.NET به عنوان تکنولوژی دسترسی به داده ها نام برد، علی رغم تغییرات گسترده ای که در ADO.NET بواسطه Framework های 1 تا 4 بوجود آمده، مبانی این تکنولوژی تقریبا مشابه آنچه که بود باقی مانده.

در این مقاله تلاش می شود که مبانی مقدماتی  ADO.NET و برخی از Object های کلیدی آن به شیوه ای عملی و دور از پیچیدگیهای تئوریک ارائه شود.

همیشه پای یک DATABASE در میان است

ADO.NET تکنولوژی دسترسی به داده هاییست که در Database ها نگهداری می شوند، توجه داشته باشید که ADO.NET یک Syntax و یا زبان نیست که بوسیله آن بتوان برنامه ای نوشت بلکه مانند ASP.NET یک تکنولوژی است که توسط همه زبانهای .NET Platform مانند VB.NET یا C# قابل پیاده سازی می باشد.

برای دسترسی به یک Database پیش از هر چیز به یک Connection نیاز داریم، Connection به عبارتی پل ارتباطی بین کد برنامه نویسی شما و Database است، ما هنگامی که قصد دسترسی به داده ها در یک پایگاه داده ها (Database) را داریم یک Connection به آن Database باز می کنیم و هنگامیکه کارمان به انجام رسید آن Connection را می بندیم.

کارهایی که ما با داده های موجود در یک پایگاه داده ها انجام می دهیم عبارت هستند از:
  1. خواندن داده ها
  2. ایجاد داده های جدید
  3. ویرایش داده ها
  4. حذف کردن داده ها
فرض کنید که شما لیست دانش آموزان یک مدرسه را در یک پایگاه داده ها نگهداری می کنید، چهار عمل ذکر شده برای این مثال عبارت هستند از:
  1. خواندن لیست دانش آموزان
  2. اضافه کردن یک دانش آموز جدید
  3. تغییر آدرس محل سکونت یک دانش آموز بواسطه تغییر محل سکونت
  4. حذف کردن یک دانش آموز از لیست به دلیل عدم اشتغال به تحصیل در این مدرسه
هرکدام از این عملیات تحت عنوان یک Command (دستور) و با کمک Connection مربوطه در Database انجام می شوند.
تا اینجا با دو Object  از ADO.NET آشنا شده اید: Connection و Command

ممکن است که شما مایل باشید یک یا چند کار را در یک Database انجام بدهید، بنابراین ممکن است شما به چهار Command نیاز داشته باشید، در ADO.NET یک Interface برای سامان دادن به بعضی Object های مرتبط به هم در نظر گرفته شده، این Interface که خود نیز یک Object است، Object هایی نظیر Connection  و Command را مدیریت می کند تا شما انجام عملیات، مجبور به مراجعه مستقیم به خود آنها نباشید و تنها با این Interface که نامش Data Adapter می باشد کار کنید.

فرض می کنیم که قصد ما نمایش لیست دانش آموزان در یک Component دارای توانایی نمایش لیست داده ها مانند GridView و یا به قول برنامه نویسهای قدیمی DataGrid است، یعنی ما می خواهیم لیست دانش آموزان را در یک GridView نمایش بدهیم، برای این منظور لازم است که منبع داده ها (DataSource) را برای GridView آماده کنیم و به آن تحویل دهیم، این DataSource در حقیقت یکی دیگر از Object های ADO.NET می باشد که ما آنرا به وسیله DataAdapter و در حقیقت بوسیله Command مربوط به خواندن لیست و همچنین Connection مربوط به دستور خواندن، آماده می کنیم.

حالا به این سطرها دقت کنید:

برای برنامه نویسان C# :
            

تعریف یک Connction
System.Data.SqlClient.SqlConnection cn;

قابل استفاده کردن یاInstant کردن Connection
cn = new System.Data.SqlClient.SqlConnection();


دادن آدرس و و تعیین نوع دسترسی به Database یه Connection
cn.ConnectionString = "Data Source=.;Initial Catalog=SchoolDataBase;Integrated Security=True";


تعریف DataAdapter
System.Data.SqlClient.SqlDataAdapter da;

تعریف Command
System.Data.SqlClient.SqlCommand cmd;

قابل استفاده کردن یاInstant کردن Command
cmd = new System.Data.SqlClient.SqlCommand();

دادن متن دستور به Command
cmd.CommandText = "select * from StudentList";

تخصیص Connection به Command
cmd.Connection=cn;

قابل استفاده کردن یاInstant کردن DataAdapter
da = new System.Data.SqlClient.SqlDataAdapter();

تخصیص Command به DataAdapter
da.SelectCommand = cmd;

تعریف DataSet
System.Data.DataSet ds;

قابل استفاده کردن یاInstant کردن DataAdapter
ds = new System.Data.DataSet();

پر کردن DataSet توسط DataAdapter
da.Fill(ds);


تخصیص DataSet به GridView
MyGridView.DataSource = ds;

Load کردن  داده ها در GridView
MyGridView.DataBind();
برای برنامه نویسان VB.NET :
        'تعریف یک Connction
        Dim cn As System.Data.SqlClient.SqlConnection

        'قابل استفاده کردن یاInstant کردن Connection
        cn = New System.Data.SqlClient.SqlConnection()

        'دادن آدرس و و تعیین نوع دسترسی به Database یه Connection
        cn.ConnectionString = "Data Source=.;Initial Catalog=SchoolDataBase;Integrated Security=True"


        'تعریف DataAdapter
        Dim da As System.Data.SqlClient.SqlDataAdapter

        'تعریف Command
        Dim cmd As System.Data.SqlClient.SqlCommand

        'قابل استفاده کردن یاInstant کردن Command
        cmd = New System.Data.SqlClient.SqlCommand()

        'دادن متن دستور به Command
        cmd.CommandText = "select * from StudentList"

        'تخصیص Connection به Command
        cmd.Connection = cn

        'قابل استفاده کردن یاInstant کردن DataAdapter
        da = New System.Data.SqlClient.SqlDataAdapter()

        'تخصیص Command به DataAdapter
        da.SelectCommand = cmd

        'تعریف DataSet
        Dim ds As System.Data.DataSet

        'قابل استفاده کردن یاInstant کردن DataAdapter
        ds = New System.Data.DataSet()

        'پر کردن DataSet توسط DataAdapter
        da.Fill(ds)

        'تخصیص DataSet به GridView
        MyGridView.DataSource = ds

        ' پر کردن داده ها در GridView
        MyGridView.DataBind()

این مقاله، فقط یک معرفی اجمالی از  ADO.NET بود، خیلی طبیعی است که برای آنها که تاره به برنامه نویسی روی کرده اند کمی مبهم باشد، برای این دسته از دوستان همین که خطوط کد برنامه تا حدی مفهوم باشد کفایت می کند، با این حال می توانید این کدها را در یک پروژه در Visual Studio بنویسید و نتیجه آن را مشاهده کنید، البته فراموش نکنید که DataBase مورد نیاز را بسازید و همچنین  GridView را نیز روی صفحه قرار بدهید.

برای کسب اطلاعات بیشتر، این مقاله را به شما پیشنهاد می کنم: