最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#操作LINQ to SQL組件進行數(shù)據(jù)庫建模的基本教程

 更新時間:2016年03月07日 15:23:29   作者:DebugLZQ  
這篇文章主要介紹了C#操作LINQ to SQL組件進行數(shù)據(jù)庫建模的基本教程,LINQ to SQL被集成在.NET框架之中,需要的朋友可以參考下

建立實體類
使用LINQ to SQL時,需要首先建立用于映射數(shù)據(jù)庫對象的模型,也就是實體類。在運行時,LINQ to SQL 根據(jù)LINQ表達式或查詢運算符生成SQL語句,發(fā)送到數(shù)據(jù)庫進行操作。數(shù)據(jù)庫返回后,LINQ to SQL負(fù)責(zé)將結(jié)果轉(zhuǎn)換成實體類對象。

建立實體類的方法有很多,例如LINQ to SQL設(shè)計器,手動編碼建立,使用XML文件映射,使用命令行工具SqlMetal生成等。其中最方便的就是LINQ to SQL設(shè)計器。

1.使用LINQ to SQL設(shè)計器建立實體類        
在一個示例用的Demo控制臺程序中添加一個“基于服務(wù)的數(shù)據(jù)庫”Database1.mdf,建立一張tb_GuestInfo的表。該表的詳細(xì)如下:

201637151447232.png (410×180)

下面的所有建立方式,都用的這個數(shù)據(jù)庫。

在項目中添加一個LINQ to SQL類,采用默認(rèn)的名稱DataClasses1.dbml,如下:

201637151549229.jpg (955×608)

將tb_GuestInfo表拖到界面上,保存。

201637151656732.png (240×183)

OK,編寫相關(guān)代碼如下,實現(xiàn)增刪改查:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LINQ_To_SQL自定義數(shù)據(jù)庫和實體類
{
  /// <summary>
  /// 實體類的建立___1.VS建立實體類
  /// </summary>
  class Program
  {
    static void Main(string[] args)
    {
      //
      DataClasses1DataContext dc = new DataClasses1DataContext();
      
      //1.查詢
      IQueryable<tb_GuestInfo> query = from p in dc.tb_GuestInfo
                       where p.Name != "XXX"
                       select p;

      foreach (var g in query)
      {
        Console.WriteLine("{0} {1} {2} {3}",g.Id,g.Name,g.Age ,g.Tel );
      }

      Console.WriteLine("-----------------");
      Console.ReadKey(false);
      //2.增加一條記錄
      tb_GuestInfo gInfo = new tb_GuestInfo() { Id = 9, Name = "M&M", Age = 40, Tel = "135****5555" };
      dc.tb_GuestInfo.InsertOnSubmit(gInfo);
      dc.SubmitChanges();

      foreach (var g in query)
      {
        Console.WriteLine("{0} {1} {2} {3}",g.Id , g.Name, g.Age, g.Tel);
      }

      Console.WriteLine("-----------------");
      Console.ReadKey(false);

      //3.刪除
      var query_itemToDelete = from g in dc.tb_GuestInfo
                   where g.Name == "M&M"
                   select g;
      foreach (var g in query_itemToDelete)
      {
        dc.tb_GuestInfo.DeleteOnSubmit(g);
      }
      dc.SubmitChanges();


      foreach (var g in query)
      {
        Console.WriteLine("{0} {1} {2} {3}", g.Id, g.Name, g.Age, g.Tel);
      }
      Console.WriteLine("-----------------");
      Console.ReadKey(false);

      //4.修改
      var query_itemToUpdate = from g in dc.tb_GuestInfo
                   where g.Name.Contains("DebugLZQ")
                   select g;

      foreach (var g in query_itemToUpdate)
      {
        g.Name = g.Name + "A";
      }
      dc.SubmitChanges();


      foreach (var g in query)
      {
        Console.WriteLine("{0} {1} {2} {3}", g.Id, g.Name, g.Age, g.Tel);
      }

      Console.WriteLine("-----------------");
      Console.ReadKey(false);

    }
  }
}

程序運行結(jié)果如下:

201637151722687.png (677×442)

2.手動建立實體類                    
實體類在多數(shù)情況下可以通過LINQ to SQL類設(shè)計器建立,當(dāng)然動手建立一個簡單的實體類也不是難事,并且可以更好的學(xué)習(xí)LINQ to SQL的對象模型。數(shù)據(jù)庫依然是前面的示例數(shù)據(jù)庫。

在項目中添加一個類GuestInfoEntity.cs,如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq.Mapping;

namespace DataContexDemo
{
  /// <summary>
  /// 手動建立實體類
  /// </summary>
  [Table(Name="tb_GuestInfo")]
  class GuestInfoEntity
  {
    [Column(IsPrimaryKey=true,DbType="Int NOT NULL IDENTITY",IsDbGenerated=true,Name="Id")]
    public int ID { get; set; }

    [Column(DbType = "nvarchar(20)", Name = "Name")]
    public string Name{get;set;}

    [Column(DbType = "int", Name = "Age")]
    public int Age { get; set; }

    [Column(DbType = "nvarchar(20)", Name = "Tel")]
    public string Tel { get; set; }
  }
}

編寫示例代碼,注意需要引入System.Data.Linq.dll:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq;//關(guān)注

namespace DataContexDemo
{
  class Program
  {
    static void Main(string[] args)
    {
      //2.手動建立實體類
      //
      //連接字符串
      string constring = @"Data Source=.\SQLEXPRESS;AttachDbFilename=E:\Visual Studio 2010\LINQ_to_SQL\LINQ_To_SQL自定義數(shù)據(jù)庫和實體類\Database1.mdf;Integrated Security=True;User Instance=True";

      DataContext dc = new DataContext(constring);

      Table<GuestInfoEntity> tb = dc.GetTable<GuestInfoEntity>();

      var query = tb.AsEnumerable();

      foreach (var q in query)
      {
        Console.WriteLine("{0} {1} {2} {3}",q.ID,q.Name,q.Age,q.Tel );
      }

      Console.ReadKey();
    }
  }
}

程序運行如下:

201637151816553.png (677×442)

3.使用XML映射文件建立實體類                         
 實體類的映射除了使用內(nèi)聯(lián)Attribute外,還可以建立一個包含映射信息的XML文件,此文件生成System.Data.Linq.Mapping.XmlMappingSource對象,作為DataContext對象構(gòu)造方法的參數(shù)。

這個XML文件只有一個根節(jié)點---Database元素,用來映射的數(shù)據(jù)庫信息。Database元素包含一個或多個Table元素,用于映射數(shù)據(jù)庫表的信息,Table元素由一個Type元素和多個Column元素(或Association元素)組成。Type元素用來指定實體類,Column元素用來指定列信息,Association元素用來映射數(shù)據(jù)庫關(guān)系。

在項目中添加一個XML文件,采用默認(rèn)名稱XMLFile1.xml,內(nèi)容如下:

<?xml version="1.0" encoding="utf-8" ?>
<Database Name="Database1" xmlns="http://schemas.microsoft.com/linqtosql/mapping/2007"><!--數(shù)據(jù)庫名稱可隨意;名稱空間一定要加上-->
 <Table Name="tb_GuestInfo"><!--數(shù)據(jù)庫中表的名稱-->
  <Type Name="LINQtoSQL建立實體類_XML.GuestInfoEntity"><!--太BT了,居然要全名;GuestInfoEntity居然不行-->  
   <Column Name="Id" Member="ID" DbType="Int NOT NULL IDENTITY" IsPrimaryKey="true"/>
   <Column Name="Name" Member="Name" DbType="nvarchar(20)" />
   <Column Name="Age" Member="Age" DbType="int" />
   <Column Name="Tel" Member="Tel" DbType="nvarchar(20)" />
  </Type>
 </Table>
</Database>

這個XML文件包含類全部的映射信息,下面建立映射的類GuestInfoEntity.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LINQtoSQL建立實體類_XML
{
  public class GuestInfoEntity
  {    
    public int ID { get; set; }
    
    public string Name { get; set; }
    
    public int Age { get; set; }
    
    public string Tel { get; set; }
  }
}

編寫示例代碼,同樣需要引入System.Data.Linq.dll:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq;
using System.Data.Linq.Mapping;
using System.IO;//

namespace LINQtoSQL建立實體類_XML
{
  class Program
  {
    static void Main(string[] args)
    {
      string constring = @"Data Source=.\SQLEXPRESS;AttachDbFilename=E:\Visual Studio 2010\LINQ_to_SQL\LINQ_To_SQL自定義數(shù)據(jù)庫和實體類\Database1.mdf;Integrated Security=True;User Instance=True";

      XmlMappingSource map = XmlMappingSource.FromXml(File.ReadAllText("XMLFile1.xml"));

      DataContext dc = new DataContext(constring, map);

      Table<GuestInfoEntity> tb = dc.GetTable<GuestInfoEntity>();

      var query = tb.AsEnumerable();

      foreach (var g in query)
      {
        Console.WriteLine("{0} {1} {2} {3}",g.ID,g.Name,g.Age,g.Tel );
      }
      Console.ReadKey();
    }
  }
}

程序的運行如下:

201637151900484.png (677×442)


用于數(shù)據(jù)庫連接的DataContext對象成員
DataContext類位于System.Data.Linq.dll程序集中的System.Data.Linq名稱空間下。在LINQ to SQL中負(fù)責(zé)實體對象和數(shù)據(jù)庫之間的數(shù)據(jù)交換及其他數(shù)據(jù)庫操作,還負(fù)責(zé)把數(shù)據(jù)庫中的數(shù)據(jù)映射成實體類的實例。

DataContext是LINQ to SQL操作實體類建立后緊接著需要操作的對象。本文總結(jié)其常用函數(shù)和屬性的作用及常用用法,實體類是上一節(jié)的GuestInfo.cs類,數(shù)據(jù)庫也采用上一節(jié)的數(shù)據(jù)庫Database1.mdb,下面的示例程序?qū)ο蠛蛯傩园雌涔δ苓M行了必要的分組,代碼中也有詳盡的注釋。代碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq;
using System.IO;
using System.Data.SqlClient;

namespace DataContext對象成員
{
  /// <summary>
  /// 用于數(shù)據(jù)庫連接的DataContext類成員
  /// </summary>
  class Program
  {
    static void Main(string[] args)
    {
      
      //連接字符串
      string constring = @"Data Source=.\SQLEXPRESS;AttachDbFilename=E:\Visual Studio 2010\LINQ_to_SQL\LINQ_To_SQL自定義數(shù)據(jù)庫和實體類\Database1.mdf;Integrated Security=True;User Instance=True";
      //1.構(gòu)造函數(shù)
      DataContext dc = new DataContext(constring);
      //2.GetTable
      Table<GuestInfoEntity> table = dc.GetTable<GuestInfoEntity>();
      var query = table.AsEnumerable();
      foreach(var g in query)
      {
        Console.WriteLine("{0} {1} {2} {3}",g.ID,g.Name,g.Age,g.Tel );
      }
      Console.WriteLine("-----------------");
      Console.ReadKey();

      string fileName = @"E:\Visual Studio 2010\LINQ_to_SQL\LINQ_To_SQL自定義數(shù)據(jù)庫和實體類\Database1.mdf";
      //3.DatabaseExists、DeleteDatabase、CreateDatabase
      if (dc.DatabaseExists())
      {
        Console.WriteLine("數(shù)據(jù)庫文件已經(jīng)存在.");
        dc.DeleteDatabase();
      }
      dc.CreateDatabase();
      if (dc.DatabaseExists())
      {
        Console.WriteLine("{0} 數(shù)據(jù)庫文件創(chuàng)建成功.",Path.GetFileName(fileName ));
      }
      Console.WriteLine("-----------------");
      Console.ReadKey();
      //4_1.ExecuteCommand 作為LINQ補充直接用SQL指令操作數(shù)據(jù)庫
      dc.ExecuteCommand("insert into tb_GuestInfo(Name,Age,Tel) values({0},{1},{2})","DebugLZQ",25,"198****1336");

      foreach (var r in dc.GetTable<GuestInfoEntity>())
      {
        Console.WriteLine("{0} {1} {2} {3}",r.ID,r.Name,r.Age,r.Tel );
      }
      Console.WriteLine("-----------------");
      Console.ReadKey();
      //4_2.ExecuteQuery 作為LINQ補充直接用SQL指令操作數(shù)據(jù)庫
      var rows= dc.ExecuteQuery<GuestInfoEntity>("select * from tb_GuestInfo");

      foreach (var r in rows)
      {
        Console.WriteLine("{0} {1} {2} {3}", r.ID, r.Name, r.Age, r.Tel);
      }
      Console.WriteLine("-----------------");
      Console.ReadKey();
      //4_3Translate 將DbReader轉(zhuǎn)換為LINQ對象
      string queryString = "select * from tb_GuestInfo";
      SqlConnection connection = new SqlConnection(constring);
      SqlCommand cmd = new SqlCommand(queryString, connection);
      connection.Open();

      var result = dc.Translate<GuestInfoEntity>(cmd.ExecuteReader());//ADO.NET轉(zhuǎn)換LINQ

      foreach (var r in result)
      {
        Console.WriteLine("{0} {1} {2} {3}", r.ID, r.Name, r.Age, r.Tel);
      }
      connection.Close();
      Console.WriteLine("-----------------");
      Console.ReadKey();
      //5.SubmitChanges 應(yīng)用修改
      var firstrow = (from p in dc.GetTable<GuestInfoEntity>()            
            select p).First();
      firstrow.Name =firstrow.Name +"A";

      dc.SubmitChanges();//應(yīng)用修改

      foreach (var r in dc.GetTable<GuestInfoEntity>() )
      {
        Console.WriteLine("{0} {1} {2} {3}", r.ID, r.Name, r.Age, r.Tel);
      }
      Console.WriteLine("-----------------");
      Console.ReadKey();
      //6.GetChangeSet方法 返回DataContext對象插入、刪除、修改過的對象
      ChangeSet cs = dc.GetChangeSet();
      foreach (var r in cs.Updates )
      {
        GuestInfoEntity t = r as GuestInfoEntity;
        Console.WriteLine("{0} {1} {2} {3}", t.ID,t.Name,t.Age,t.Tel );
      }
      Console.WriteLine("-----------------");
      Console.ReadKey();
      //7.Refresh刷新實體對象
      var row1=(from g in dc.GetTable<GuestInfoEntity>() select g).First();
      row1.Age = row1.Age + 5;
      dc.SubmitChanges();
      dc.Refresh(RefreshMode.OverwriteCurrentValues, row1);//

      foreach (var r in dc.GetTable<GuestInfoEntity>())
      {
        Console.WriteLine("{0} {1} {2} {3}", r.ID, r.Name, r.Age, r.Tel);
      }
      Console.WriteLine("7-----------------");
      Console.ReadKey();
      //ChangeConflicts屬性 返回DataContext操作數(shù)據(jù)庫時產(chǎn)生的并發(fā)沖突合集

      //Transaction屬性 設(shè)置或返回DataContext跟其他ADO.NET程序共享的事物對象

      //ObjectTrackingEnabled屬性 開啟或關(guān)閉DataContext實體對象的狀態(tài)跟蹤   
   
      //8.Log屬性 返回DataContext產(chǎn)生的SQL命令
      dc.Log = Console.Out;//控制臺輸出DataContext產(chǎn)生的SQL語句

      foreach (var r in dc.GetTable<GuestInfoEntity>())
      {
        Console.WriteLine("{0} {1} {2} {3}", r.ID, r.Name, r.Age, r.Tel);
      }
      Console.WriteLine("-----------------");
      Console.ReadKey();

    }
  }
}

程序中的注釋很詳細(xì),不再贅述。

程序的運行結(jié)果如下:

201637152021439.png (677×442)


操作單一表格的Table<TEntity>類
前面介紹了DataContext類,它可以用來映射和連接數(shù)據(jù)庫,執(zhí)行SQL命令,跟蹤實體對象的狀態(tài)。

下面介紹Table<TEntity>表示表格記錄,它是一個泛型集合類,它的元素就是表格實體對象。它提供一組方法,對元素進行添加刪除操作,并可以通過DataContext將這些操作保存到數(shù)據(jù)庫。

表還是前面的那張表,在項目中添加了一個LINQ to SQL類。重點是InsertOnSubmit、DeleteOnSubmit等方法。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LINQ_to_SQL_Table
{
  /// <summary>
  /// 操作單一表格的Table<TEntity>類
  /// </summary>
  class Program
  {
    static void Main(string[] args)
    {
      //1.a.Attach附加實體
      DataClasses1DataContext dc1 = new DataClasses1DataContext();
      tb_GuestInfo guset = new tb_GuestInfo() { Id=1, Name = "DebugLZQ", Age = 35, Tel = "138****8888" };

      dc1.tb_GuestInfo.Attach(guset);//這樣的Attach僅僅附加實體,數(shù)據(jù)庫沒有更新
      dc1.SubmitChanges();
      //顯示附加成功
      foreach (var g in dc1.tb_GuestInfo)
      {
        Console.WriteLine("{0} {1} {2} {3}", g.Id, g.Name, g.Age, g.Tel);
      }
      Console.WriteLine("---------");
      //顯示數(shù)據(jù)庫沒有更新
      DataClasses1DataContext dc2 = new DataClasses1DataContext();
      foreach (var g in dc2.tb_GuestInfo)
      {
        Console.WriteLine("{0} {1} {2} {3}", g.Id, g.Name, g.Age, g.Tel);
      }
      Console.WriteLine("------------------------");
      Console.ReadKey();

      //2.InsertOnSubmit
      dc2.tb_GuestInfo.InsertOnSubmit(guset);
      dc2.SubmitChanges();

      foreach (var g in dc2.tb_GuestInfo)
      {
        Console.WriteLine("{0} {1} {2} {3}", g.Id, g.Name, g.Age, g.Tel);
      }
      Console.WriteLine("------------------------");
      Console.ReadKey();
      //2b.InsertAllOnSubmit 插入集合
      List<tb_GuestInfo> lst = new List<tb_GuestInfo>() 
      {
        new tb_GuestInfo(){ Name="AA", Age=25,Tel="133****3333"},
        new tb_GuestInfo(){ Name="BB", Age=25,Tel="135****5555"}
      };
      dc2.tb_GuestInfo.InsertAllOnSubmit(lst);
      dc2.SubmitChanges();

      foreach (var g in dc2.tb_GuestInfo)
      {
        Console.WriteLine("{0} {1} {2} {3}", g.Id, g.Name, g.Age, g.Tel);
      }
      Console.WriteLine("------------------------");
      Console.ReadKey();
      //
      //3.DeleteOnSubmit
      tb_GuestInfo entity = (from g in dc2.tb_GuestInfo
                  where g.Name == "AA"
                  select g).Single();
      dc2.tb_GuestInfo.DeleteOnSubmit(entity);//
      dc2.SubmitChanges();

      foreach (var g in dc2.tb_GuestInfo)
      {
        Console.WriteLine("{0} {1} {2} {3}", g.Id, g.Name, g.Age, g.Tel);
      }
      Console.WriteLine("------------------------");
      Console.ReadKey();
      //3b.DeleteAllOnSubmit
      IEnumerable<tb_GuestInfo> entitys = from g in dc2.tb_GuestInfo
                        where g.Name == "AA" || g.Name == "BB"
                        select g;
      dc2.tb_GuestInfo.DeleteAllOnSubmit(entitys);
      dc2.SubmitChanges();

      foreach (var g in dc2.tb_GuestInfo)
      {
        Console.WriteLine("{0} {1} {2} {3}", g.Id, g.Name, g.Age, g.Tel);
      }
      Console.WriteLine("------------------------");
      Console.ReadKey();      
      
    }
  }
}

程序運行結(jié)果如下:

201637152048997.png (677×458)

相關(guān)文章

  • C#編寫Windows服務(wù)程序詳細(xì)步驟詳解(圖文)

    C#編寫Windows服務(wù)程序詳細(xì)步驟詳解(圖文)

    本文介紹了如何用C#創(chuàng)建、安裝、啟動、監(jiān)控、卸載簡單的Windows Service 的內(nèi)容步驟和注意事項,需要的朋友可以參考下
    2017-09-09
  • 關(guān)于C#基礎(chǔ)知識回顧--反射(二)

    關(guān)于C#基礎(chǔ)知識回顧--反射(二)

    其實說白了,反射就是能知道我們未知類型的類型信息這么一個東西.沒什么神秘可講!反射的核心是System.Type。System.Type包含了很多屬性和方法,使用這些屬性和方法可以在運行時得到類型信息
    2013-07-07
  • C#實現(xiàn)讀取txt文件生成Word文檔

    C#實現(xiàn)讀取txt文件生成Word文檔

    大家好,本篇文章主要講的是C#實現(xiàn)讀取txt文件生成Word文檔,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • Unity利用UGUI制作提示框效果

    Unity利用UGUI制作提示框效果

    這篇文章主要為大家詳細(xì)介紹了Unity利用UGUI制作提示框效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • 如何用.NETCore操作RabbitMQ

    如何用.NETCore操作RabbitMQ

    這篇文章主要介紹了如何用.NETCore操作RabbitMQ,對中間件感興趣的同學(xué),可以參考下
    2021-05-05
  • C#之CLR內(nèi)存深入分析

    C#之CLR內(nèi)存深入分析

    這篇文章主要介紹了C#之CLR內(nèi)存深入分析,對引用類型進行了深入討論,需要的朋友可以參考下
    2014-08-08
  • C#使用Dispose模式實現(xiàn)手動對資源的釋放

    C#使用Dispose模式實現(xiàn)手動對資源的釋放

    這篇文章主要介紹了C#使用Dispose模式實現(xiàn)手動對資源的釋放,涉及C#采用Dispose模式操作資源的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-08-08
  • 詳解WPF如何把checkbox改成開關(guān)樣式

    詳解WPF如何把checkbox改成開關(guān)樣式

    這篇文章主要為大家詳細(xì)介紹了WPF如何把checkbox改成開關(guān)樣式,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,有需要的小伙伴可以參考一下
    2024-11-11
  • C#的FileInfo類實現(xiàn)文件操作實例

    C#的FileInfo類實現(xiàn)文件操作實例

    這篇文章主要介紹了C#的FileInfo類實現(xiàn)文件操作實例,比較實用的功能,需要的朋友可以參考下
    2014-07-07
  • C# ManagementObjectSearcher操作window案例詳解

    C# ManagementObjectSearcher操作window案例詳解

    這篇文章主要介紹了C# ManagementObjectSearcher操作window案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08

最新評論

保康县| 石首市| 明溪县| 霸州市| 盐津县| 克什克腾旗| 永清县| 托里县| 库尔勒市| 陈巴尔虎旗| 昭苏县| 寻乌县| 垫江县| 康乐县| 西和县| 日土县| 南投县| 邯郸市| 大港区| 拜泉县| 新河县| 汾阳市| 酉阳| 威远县| 博白县| 罗山县| 肥西县| 卓尼县| 东海县| 京山县| 嵩明县| 岢岚县| 通许县| 莎车县| 阿鲁科尔沁旗| 巴青县| 汽车| 滨州市| 金昌市| 屯门区| 浪卡子县|