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

C#數(shù)據(jù)庫操作之LINQ to SQL技術(shù)詳解

 更新時間:2024年12月31日 08:40:08   作者:木林森先生  
本文詳細(xì)介紹了LINQtoSQL技術(shù),包括其基本概念、使用方法、動態(tài)創(chuàng)建數(shù)據(jù)庫、插入數(shù)據(jù)、查詢數(shù)據(jù)、更新數(shù)據(jù)和刪除數(shù)據(jù)等操作

一、LINQ to SQL技術(shù)概述

LINQ to SQL 是 .NET Framework version 3.5 的一個組件,提供了用于將關(guān)系數(shù)據(jù)作為對象管理的運(yùn)行時基礎(chǔ)結(jié)構(gòu)。

在 LINQ to SQL 中,將關(guān)系數(shù)據(jù)庫的數(shù)據(jù)模型,映射到一種對象模型中,該對象模型省指開發(fā)人員使用的編程語言表示的對象。通俗來講,就是將數(shù)據(jù)庫中的關(guān)系型數(shù)據(jù),映射到代碼里的實(shí)例對象。 當(dāng)應(yīng)用程序運(yùn)行時,LINQ to SQL 會將對象模型中的語言集成查詢轉(zhuǎn)換為 SQL語句,然后將它們發(fā)送到數(shù)據(jù)庫進(jìn)行執(zhí)行。 當(dāng)數(shù)據(jù)庫返回結(jié)果時,LINQ to SQL 會將它們轉(zhuǎn)換回你可以用你自己的編程語言處理的對象。

【tips】使用Visual Studio的開發(fā)者可以使用對象關(guān)系設(shè)計(jì)器the Object Relational Designer,它為實(shí)現(xiàn)LINQ to SQL的許多特性提供了一個用戶界面。

二、使用LINQ to SQL 進(jìn)行簡單操作.

通過使用 LINQ to SQL,使得訪問 SQL 數(shù)據(jù)庫,就像訪問內(nèi)存中的集合一樣。

以下代碼,創(chuàng)建一個Northwnd對象,代表northwnd數(shù)據(jù)庫,并從Customers表中查詢出城市為“London”的數(shù)據(jù),返回一個集合,賦值給companyNameQuery,之后通過循環(huán),輸出集合內(nèi)的元素。

// Northwnd inherits from System.Data.Linq.DataContext.
Northwnd nw = new Northwnd(@"northwnd.mdf");
// or, if you are not using SQL Server Express
// Northwnd nw = new Northwnd("Database=Northwind;Server=server_name;Integrated Security=SSPI");

var companyNameQuery =
    from cust in nw.Customers
    where cust.City == "London"
    select cust.CompanyName;

foreach (var customer in companyNameQuery)
{
    Console.WriteLine(customer);
}

通過上述例子中,相必您已經(jīng)體會到了LINQ to SQL技術(shù)的強(qiáng)大之處了,接下來,我將帶領(lǐng)你們逐步的吸收LINQ to SQL技術(shù)。

三、如何動態(tài)創(chuàng)建數(shù)據(jù)庫

在LINQ to SQL技術(shù)中,對象模型和關(guān)系型數(shù)據(jù)庫之間是映射關(guān)系。要想啟用映射關(guān)系,一般可以通過使用基于特性的映射,或者是使用描述關(guān)系數(shù)據(jù)庫結(jié)構(gòu)的外部映射文件。在這兩種情況下,如果你有足夠的關(guān)系型數(shù)據(jù)庫的信息,那么就可以通過使用DataContext.CreateDatabase()方法來創(chuàng)建數(shù)據(jù)庫實(shí)例。

DataContext.CreateDatabase()方法,僅在對象模型中被編碼信息的范圍內(nèi)創(chuàng)建數(shù)據(jù)庫的副本。對象模型中的映射文件和特性,不會對現(xiàn)有數(shù)據(jù)庫結(jié)構(gòu)的所有內(nèi)容進(jìn)行編碼。映射信息不表示用戶自定義函數(shù)、存儲過程、觸發(fā)器或檢查約束的內(nèi)容。這種行為對于各種數(shù)據(jù)庫來說已經(jīng)足夠了。

如果已知的數(shù)據(jù)提供者是可用的(如SQL Server 2008),那么你可以在任何情況下使用DataContext.CreateDatabase()方法。

  • →構(gòu)建一個自動安裝在客戶系統(tǒng)上的應(yīng)用程序。
  • →構(gòu)建一個客戶機(jī)應(yīng)用程序,該應(yīng)用程序需要一個本地?cái)?shù)據(jù)庫來保存其脫機(jī)狀態(tài)。

您還可以使用DataContext.CreateDatabase()方法來使用SQL Server,通過創(chuàng)建.mdf文件或目錄名,具體是哪種取決于您的連接字符串。LINQ to SQL 使用連接字符串來定義將要創(chuàng)建的數(shù)據(jù)庫,以及要創(chuàng)建數(shù)據(jù)連接的服務(wù)器。

【tips】盡可能的,請使用Windows集成安全性連接到數(shù)據(jù)庫,以便在連接字符串中不需要密碼。

案例一:

該例展示了一個如何創(chuàng)建一個名為MyDVDs.mdf數(shù)據(jù)庫的方式。

//在使用該例展示的方法之前,必須進(jìn)行以下兩個步驟:
//1、添加引用System.Data.Linq;
//2、使用using語句,添加命名空間,否則報(bào)錯
//   using TableAttribute = System.Data.Linq.Mapping.TableAttribute;
//   using ColumnAttribute = System.Data.Linq.Mapping.ColumnAttribute;

//Table特性,創(chuàng)建了數(shù)據(jù)庫中的名為DVDTable的表與該類之間的映射關(guān)系。
[Table(Name = "MyOrders")]
public class Order
{
	//Column特性,創(chuàng)建了DVDTable表中同名列與該類成員屬性之間的映射關(guān)系。
	[Column(IsPrimaryKey = true)]
	public int id;
	[Column]
	public string name;
	[Column]
	public DateTime date;

	public override string ToString()
	{
		return "Order對象:{" + id + "," + name + "," + date + "}";
	}
}

//自定義類 ,繼承DataContext類。
public class MyOrders : DataContext
{
    public MyOrders(String connection) : base(connection)
    {
    }

    public Table<Order> orders;
}

//創(chuàng)建一個MyOrders 類的對象db,該類繼承自DataContext類。
MyOrders myOrders = new MyOrders(@"D:\myFirstOrder.mdf");

public void CreateDatabase()
{
    if (myOrders.DatabaseExists())
    {
        //先判斷該路徑中,是否存在該數(shù)據(jù)庫文件,如果存在,則刪除。
        MessageBox.Show("Deleting old database...");
        myOrders.DeleteDatabase();
    }
    //myOrders對象創(chuàng)建數(shù)據(jù)庫
    myOrders.CreateDatabase();
    //釋放DataContext實(shí)例,所使用的的所有資源
    //myOrders.Dispose();
}

【注意】

MyOrders myOrders = new MyOrders(@"D:\myFirstOrder4.mdf");

語句中的myOrders對象,最好設(shè)置成全局變量,如果設(shè)置成局部變量,后續(xù)在重復(fù)的調(diào)用方法時,可能會出現(xiàn)“該數(shù)據(jù)庫已存在,請選擇其他數(shù)據(jù)庫名稱”異常。

在構(gòu)建自動安裝在客戶系統(tǒng)上的應(yīng)用程序時,請先查看數(shù)據(jù)庫是否已經(jīng)存在,并在創(chuàng)建新數(shù)據(jù)庫之前刪除它。DataContext類提供DatabaseExists()和DeleteDatabase()方法來幫助您完成這個過程。

四、如何向數(shù)據(jù)庫中insert數(shù)據(jù)

通過向關(guān)聯(lián)的LINQ to SQL里的Table<TEntity>集合添加對象,然后向數(shù)據(jù)庫提交更改,您就可以將行插入到數(shù)據(jù)庫中。LINK to SQL將您提交的更改,翻譯成適當(dāng)?shù)腟QL insert語句,然后提交到數(shù)據(jù)庫執(zhí)行的。

【tips】您也可以為LINQ to SQL里默認(rèn)的insert數(shù)據(jù)庫、Update數(shù)據(jù)庫、Delete數(shù)據(jù)庫等操作進(jìn)行重載。

以下步驟假設(shè)有一個連接到Northwind數(shù)據(jù)庫的DataContext連接。

  • 1、創(chuàng)建一個新對象,包含要提交的列數(shù)據(jù)。
  • 2、將新對象添加到與數(shù)據(jù)庫中目標(biāo)表相關(guān)聯(lián)的LINQ to SQL Table集合中。
  • 3、提交更改到數(shù)據(jù)庫中。

下面代碼展示了創(chuàng)建一個新的Order對象(Order是用戶自定義類),然后為它填充適當(dāng)?shù)膶傩灾怠V髮⑿碌腛rder對象添加到Order集合里。最后,將更改提交到數(shù)據(jù)庫,作為Orders表中一個新的行。

// Create a new Order object.Order class is user defined class.
Order ord = new Order
{
    id = 12000,
    name = "Harry Potty",
    OrderDate = DateTime.Now
    // …
};

// Add the new object to the Orders collection.
System.Data.Linq.Table<Order> table = myOrders.GetTable<Order>();
table.InsertOnSubmit(ord);

// Submit the change to the database.
try
{
    myOrders.SubmitChanges();
}
catch (Exception e)
{
    MessageBox.Show(e.Message);
    // Make some adjustments.
    // ...
    // Try again.
    myOrders.SubmitChanges();
}
//釋放資源
//myOrders.Dispose();

【注意】在向數(shù)據(jù)庫中的表里,insert數(shù)據(jù)或者后續(xù)的update、delete操作時,無論您對對象做了多少項(xiàng)更改,都只是在更改內(nèi)存中的副本。 您并未對數(shù)據(jù)庫中的實(shí)際數(shù)據(jù)做任何更改。 直到您對 顯式調(diào)用DataContext里的SubmitChanges()方法 ,您所做的更改才會傳輸?shù)椒?wù)器。

五、如何從數(shù)據(jù)庫中query數(shù)據(jù)

LINQ to SQL 中的查詢使用與 LINQ 中的查詢相同的語法。 唯一的差異是 LINQ to SQL 查詢中引用的對象映射到數(shù)據(jù)庫中的元素。 有興趣的朋友,可以看下 LINQ 查詢知識。

下面的代碼,展示了一個簡單的查詢請求,查詢出id等于12000的訂單,并將查詢結(jié)果輸出。

MyOrders myOrders = new MyOrders(@"c:\northwnd.mdf");
System.Data.Linq.Table<Order> table = myOrders.GetTable<Order>();

// Query for customers in London.
IQueryable<Customer> custQuery =
    from order in myOrders.orders
    where order.id == 12000
    select order;

//將查詢結(jié)果輸出
foreach( var o in result)
{
	Console.WriteLine(o.toString());
}

從數(shù)據(jù)庫中查詢數(shù)據(jù),還有更多復(fù)雜的操作,后續(xù)我會繼續(xù)整理更為詳細(xì)的數(shù)據(jù)庫查詢操作,可以先關(guān)注下。

六、如何update表中的數(shù)據(jù)

通過修改與LINQ to SQL 的Table集合相關(guān)聯(lián)的對象的成員值,然后將更改提交給數(shù)據(jù)庫,那么就可以更新數(shù)據(jù)庫中的某行數(shù)據(jù)。LINQ to SQL 將你的改變轉(zhuǎn)換為相對應(yīng)的SQL update語句。

將某行數(shù)據(jù)更新到數(shù)據(jù)庫中的步驟如下:

1、在數(shù)據(jù)庫中查詢要更新的行。

2、對第1步的LINQ to SQL 查詢結(jié)果里的成員值進(jìn)行所需的更改。

3、將更改提交到數(shù)據(jù)庫里。

下面的示例在數(shù)據(jù)庫中查詢訂單#11000,然后更改結(jié)果order對象中的name和date的值。最后,對這些成員值的更改作為name和date列中的更改提交給數(shù)據(jù)庫。

// Query the database for the row to be updated.
var query =
    from ord in myOrders.Orders
    where ord.id== 11000
    select ord;

// Execute the query, and change the column values
// you want to change.
foreach (Order ord in query)
{
    ord.name = "Hong Lou Meng";
    ord.date = DateTime.Now;
    // Insert any additional changes to column values.
}

// Submit the changes to the database.
try
{
    myOrders.SubmitChanges();
}
catch (Exception e)
{
    MessageBox.Show(Console.WriteLine(e));
    // Provide for exceptions.
}
//釋放DataContext對象占用的資源。
//myOrders.Dispose();

七、如何如何delete表中的數(shù)據(jù)

可以通過從與表相關(guān)聯(lián)的集合中刪除相應(yīng)的LINQ to SQL對象,來完成對數(shù)據(jù)庫中某行的刪除。LINQ to SQL 會將刪除操作轉(zhuǎn)變?yōu)檫m當(dāng)?shù)腟QL delete語句。

LINQ to SQL不支持或不識別級聯(lián)刪除操作。如果你想刪除表中有約束的一行,你必須完成以下其中一項(xiàng)條件:

1、在數(shù)據(jù)庫的外鍵約束中設(shè)置ON DELETE CASCADE規(guī)則。

2、使用您自己的代碼先刪除阻止父對象被刪除的子對象。

如果無法保證上述至少一個條件成立,則將拋出異常。請參閱本主題的第二個代碼示例。

刪除數(shù)據(jù)庫中某一行的操作如下:

  • 1、在數(shù)據(jù)庫中查詢需要刪除的行。
  • 2、調(diào)用DeleteOnSubmit方法。
  • 3、將刪除操作提交到數(shù)據(jù)庫。

下面的第1個代碼示例向數(shù)據(jù)庫查詢屬于order# 11000的訂單詳細(xì)信息,將這些訂單詳細(xì)信息標(biāo)記為刪除,并將這些更改提交給數(shù)據(jù)庫。

Table<Order> orders = myOrders.GetTable<Order>();
// Query the database for the rows to be deleted.

var deleteResult =
    from ord in orders
    where ord.id == 11000
    select ord;

foreach (var ord in deleteResult )
{
    orders.DeleteOnSubmit(ord );
}

try
{
    myOrders.SubmitChanges();
}
catch (Exception e)
{
    MessagBox.Show(e.Message);
    // Provide for exceptions.
}

在第二個代碼示例中,目標(biāo)是刪除一個訂單(#10250)。代碼首先檢查OrderDetails表,以查看要刪除的訂單在那里是否有子訂單。如果訂單有子訂單,則首先將子訂單標(biāo)記為要刪除,然后將訂單標(biāo)記為要刪除。DataContext將實(shí)際的刪除按正確的順序排列,以便發(fā)送到數(shù)據(jù)庫的刪除命令遵守?cái)?shù)據(jù)庫約束。

//Northwnd myOrders = new Northwnd(@"c:\northwnd.mdf");

MyOrders myOrders = new MyOrders(@"D:\myFirstOrder.mdf");

myOrders.Log = Console.Out;

// Specify order to be removed from database
int reqOrder = 10250;

// Fetch OrderDetails for requested order.
var ordDetailQuery =
    from odq in myOrders.OrderDetails
    where odq.OrderID == reqOrder
    select odq;

foreach (var selectedDetail in ordDetailQuery)
{
    MessageBox.Show(selectedDetail.toString());
    myOrders.OrderDetails.DeleteOnSubmit(selectedDetail);
}

// Display progress.
MessageBox.Show("detail section finished.");

// Determine from Detail collection whether parent exists.
if (ordDetailQuery.Any())
{
    MessageBox.Show("The parent is present in the Orders collection.");
    // Fetch Order.
    try
    {
        var ordFetch =
            (from ofetch in myOrders.Orders
             where ofetch.OrderID == reqOrder
             select ofetch).First();
        myOrders.Orders.DeleteOnSubmit(ordFetch);
        MessageBox.Show("{0} OrderID is marked for deletion.", ordFetch.OrderID);
    }
    catch (Exception e)
    {
        MessageBox.Show(e.Message);
    }
}
else
{
    MessageBox.Show("There was no parent in the Orders collection.");
}

// Display progress.
MessageBox.Show("Order section finished.");

try
{
    myOrders.SubmitChanges();
}
catch (Exception e)
{
    MessageBox.Show(e.Message);
}

// Display progress.
MessageBox.Show("Submit finished.");

總結(jié)

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • C#算法之無重復(fù)字符的最長子串

    C#算法之無重復(fù)字符的最長子串

    這篇文章介紹了C#算法之無重復(fù)字符的最長子串,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-01-01
  • C#中GDI+繪制圓弧及圓角矩形等比縮放的繪制

    C#中GDI+繪制圓弧及圓角矩形等比縮放的繪制

    這篇文章主要介紹了C#中GDI+繪制圓弧及圓角矩形等比縮放的繪制,文章圍繞主題展開詳細(xì)的內(nèi)容戒殺,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • C#設(shè)計(jì)模式之外觀模式介紹

    C#設(shè)計(jì)模式之外觀模式介紹

    外觀模式:為子系統(tǒng)中的一組接口提供一個一致的界面,此模式定義了一個高層的接口,這個借口使得這子系統(tǒng)容易使用
    2012-10-10
  • C# Winform 子窗體訪問父級窗體的控件和屬性

    C# Winform 子窗體訪問父級窗體的控件和屬性

    本文主要介紹兩種子窗體訪問父窗體控件和屬性的方法,大家可以參考一下,本人比較偏向第二種,把父窗體作為屬性傳遞,一勞永逸,想訪問父窗體的什么控件屬性都可以。
    2016-05-05
  • C#中的不可變數(shù)據(jù)類型介紹(不可變對象、不可變集合)

    C#中的不可變數(shù)據(jù)類型介紹(不可變對象、不可變集合)

    這篇文章主要介紹了C#中的不可變數(shù)據(jù)類型介紹(不可變對象、不可變集合),本文講解了不可變對象、自定義不可變集合、Net提供的不可變集合、不可變優(yōu)點(diǎn)、不可變對象缺點(diǎn)等內(nèi)容,需要的朋友可以參考下
    2015-04-04
  • C#實(shí)現(xiàn)Excel與TXT文本文件高效互轉(zhuǎn)

    C#實(shí)現(xiàn)Excel與TXT文本文件高效互轉(zhuǎn)

    在日常辦公和數(shù)據(jù)處理工作中,Excel 和 TXT文本文件是兩種常見的數(shù)據(jù)存儲格式,很多時候,我們需要在這兩種文件格式之間進(jìn)行轉(zhuǎn)換,下面我們就來看看如何使用C#實(shí)現(xiàn)這一功能吧
    2025-09-09
  • C# 中的委托詳細(xì)解析與完整應(yīng)用小結(jié)

    C# 中的委托詳細(xì)解析與完整應(yīng)用小結(jié)

    C#委托是一種類型安全的函數(shù)指針,允許將方法作為參數(shù)傳遞或賦值給變量,它在事件處理、回調(diào)和異步編程中廣泛應(yīng)用,本文詳細(xì)介紹了委托的基本概念、用法和高級應(yīng)用,感興趣的朋友一起看看吧
    2025-03-03
  • 深入解析:打造自動消失的對話框

    深入解析:打造自動消失的對話框

    本篇文章是對打造自動消失的對話框進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C#?Math中常用數(shù)學(xué)運(yùn)算的示例詳解

    C#?Math中常用數(shù)學(xué)運(yùn)算的示例詳解

    Math?為通用數(shù)學(xué)函數(shù)、對數(shù)函數(shù)、三角函數(shù)等提供常數(shù)和靜態(tài)方法,使用起來非常方便。這篇文章主要為大家介紹幾個常用的數(shù)學(xué)運(yùn)算的使用,需要的可以參考一下
    2022-11-11
  • C#開發(fā)簡易winform計(jì)算器程序

    C#開發(fā)簡易winform計(jì)算器程序

    這篇文章主要為大家詳細(xì)介紹了C#開發(fā)簡易winform計(jì)算器程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02

最新評論

钟山县| 重庆市| 保靖县| 平南县| 沂源县| 肇源县| 荆门市| 江孜县| 保德县| 徐汇区| 上思县| 额尔古纳市| 司法| 额尔古纳市| 图木舒克市| 清徐县| 绍兴县| 浦县| 庆云县| 湘阴县| 长葛市| 广昌县| 曲阳县| 包头市| 凤翔县| 赤壁市| 彭水| 介休市| 资源县| 宁武县| 贵定县| 磴口县| 浦北县| 鹤岗市| 南康市| 香河县| 嘉禾县| 任丘市| 即墨市| 罗山县| 平陆县|