① 如何創建自己的Linq provider
當您要使用語言集成查詢 (LINQ) 訪問資料庫中的數據時,不能直接連接到該資料庫。而是應創建表示該資料庫及其表的類,然後使用這些類進行數據交互。通過對象關系設計器或運行 sqlMetal.exe 實用工具可生成這些類。有關更多信息,請參見對象關系設計器(O/R 設計器)和代碼生成工具 (SqlMetal.exe)。
本主題演示如何在 Web 應用程序中使用 O/R 設計器創建表示 SQL Server 資料庫的數據類。
這些數據類必須放置在 Web 應用程序的 App_Code 文件夾或其子文件夾中。如果將數據類包括在 App_Code 的子文件夾中,則會將該子文件夾的名稱用作類的命名空間。在此情況下,必須在連接至數據類時提供該命名空間。
使用O/R 設計器時,會自動將用於訪問資料庫的連接字元串添加到 Web.config 文件中。
創建這些類後,即可使用 LinqDataSource 控制項、ObjectDataSource 控制項或 LINQ 查詢連接它們。
從資料庫表中創建類
如果網站上還沒有 App_Code 文件夾,請在「解決方案資源管理器」中右擊相應的項目,再單擊「添加 ASP.NET 文件夾」,然後單擊「App_Code」。
右擊 App_Code 文件夾,然後單擊「添加新項」。
在「已安裝的模板」下,選擇「LINQ to SQL 類」模板,為 .dbml 文件鍵入一個名稱,然後單擊「添加」。
此時將顯示「對象關系設計器」窗口。
在「伺服器資源管理器」中,將該資料庫表拖入「對象關系設計器」窗口。
在設計器窗口中,該表及其列都表示為實體。
保存 .dbml 文件。
這會在 .dbml 文件下面創建一個 .designer.cs 或 .designer.vb 文件。該文件包含一個表示資料庫的類和一個表示表的類。該資料庫類的無參數構造函數將從 Web.config 文件中讀取連接字元串。
② ASP.NET中的Linq怎麼用
21.1.1 准備數據源
既然LINQ可以查詢多種數據源和對象,這些對象可能是數組,可能是數據集,也可能是資料庫,那麼在使用LINQ進行數據查詢時首先需要准備數據源。
1.數組
數組中的數據可以被LINQ查詢語句查詢,這樣就省去了復雜的數組遍歷。數組數據源示例代碼如下所示。
string[] str = { "學習", "學習LINQ", "好好學習", "生活很美好" };
int[] inter = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
數組可以看成是一個集合,雖然數組沒有集合的一些特性,但是從另一個角度上來說可以看成是一個集合。在傳統的開發過程中,如果要篩選其中包含「學習」欄位的某個字元串,則需要遍歷整個數組。
2.SQL Server
在資料庫操作中,同樣可以使用LINQ進行資料庫查詢。LINQ以其優雅的語法和面向對象的思想能夠方便的進行資料庫操作,為了使用LINQ進行SQL Server資料庫查詢,可以創建兩個表,這兩個表的結構如下所示。Student(學生表):
S_ID:學生ID。
S_NAME:學生姓名。
S_CLASS:學生班級。
C_ID:所在班級的ID。
上述結構描述了一個學生表,可以使用SQL語句創建學生表,示例代碼如下所示。
USE [student]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Student](
[S_ID] [int] IDENTITY(1,1) NOT NULL,
[S_NAME] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[S_CLASS] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[C_ID] [int] NULL,
CONSTRAINT [PK_Student] PRIMARY KEY CLUSTERED
(
[S_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
為了更加詳細的描述一個學生所有的基本信息,就需要創建另一個表對該學生所在的班級進行描述,班級表結構如下所示。Class(班級表):
C_ID:班級ID。
C_GREAD:班級所在的年級。
C_INFOR:班級專業。
上述代碼描述了一個班級的基本信息,同樣可以使用SQL語句創建班級表,示例代碼如下所示。
USE [student]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Class](
[C_ID] [int] IDENTITY(1,1) NOT NULL,
[C_GREAD] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[C_INFOR] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
CONSTRAINT [PK_Class] PRIMARY KEY CLUSTERED
(
[C_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
上述代碼在Student資料庫中創建了一個班級表,開發人員能夠向資料庫中添加相應的信息以准備數據源。
3.數據集
LINQ能夠通過查詢數據集進行數據的訪問和整合;通過訪問數據集,LINQ能夠返回一個集合變數;通過遍歷集合變數可以進行其中數據的訪問和篩選。在第9章中講到了數據集的概念,開發人員能夠將資料庫中的內容填充到數據集中,也可以自行創建數據集。
數據集是一個存在於內存的對象,該對象能夠模擬資料庫的一些基本功能,可以模擬小型的資料庫系統,開發人員能夠使用數據集對象在內存中創建表,以及模擬表與表之間的關系。在數據集的數據檢索過程中,往往需要大量的if、else等判斷才能檢索相應的數據。
使用LINQ進行數據集中數據的整理和檢索可以減少代碼量並優化檢索操作。數據集可以是開發人員自己創建的數據集也可以是現有資料庫填充的數據集,這里使用上述SQL Server創建的資料庫中的數據進行數據集的填充。
21.1.2 使用LINQ
在傳統對象查詢中,往往需要很多的if、else語句進行數組或對象的遍歷,例如在數組中尋找相應的欄位,實現起來往往比較復雜,而使用LINQ就簡化了對象的查詢。由於前面已經准備好了數據源,那麼就能夠分別使用LINQ語句進行數據源查詢。
1.數組
在前面的章節中,已經創建了一個數組作為數據源,數組示例代碼如下所示。
int[] inter = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
上述代碼是一個數組數據源,如果開發人員需要從其中的元素中搜索大於5的數字,傳統的方法應該遍歷整個數組並判斷該數字是否大於5,如果大於5則輸出,否則不輸出,示例代碼如下所示。
using System;
using System.Collections.Generic;
using System.Linq; //使用必要的命名空間
using System.Text;
namespace _21_1
{
class Program
{
static void Main(string[] args)
{
string[] str = { "學習", "學習LINQ", "好好學習", "生活很美好" }; //定義數組
int[] inter = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
for (int i = 0; i < inter.Length; i++) //遍歷數組
{
if (inter[i] > 5) //判斷數組元素的值是否大於5
{
Console.WriteLine(inter[i].ToString()); //輸出對象
}
}
Console.ReadKey();
}
}
}
上述代碼非常簡單,將數組從頭開始遍歷,遍歷中將數組中的的值與5相比較,如果大於5就會輸出該值,如果小於5就不會輸出該值。雖然上述代碼實現了功能的要求,但是這樣編寫的代碼繁冗復雜,也不具有擴展性。如果使用LINQ查詢語句進行查詢就非常簡單,示例代碼如下所示。
class Program
{
static void Main(string[] args)
{
string[] str = { "學習", "學習LINQ", "好好學習", "生活很美好" }; //定義數組
int[] inter = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; //定義數組
var st = from s in inter where s > 5 select s; //執行LINQ查詢語句
foreach (var t in st) //遍歷集合元素
{
Console.WriteLine(t.ToString()); //輸出數組
}
Console.ReadKey();
}
}
使用LINQ進行查詢之後會返回一個IEnumerable的集合。在上一章講過,IEnumerable是.NET框架中最基本的集合訪問器,可以使用foreach語句遍歷集合元素。使用LINQ查詢數組更加容易被閱讀,LINQ查詢語句的結構和SQL語法十分類似,LINQ不僅能夠查詢數組,還可以通過.NET提供的編程語言進行篩選。例如str數組變數,如果要查詢其中包含「學習」的字元串,對於傳統的編程方法是非常冗餘和繁瑣的。由於LINQ是.NET編程語言中的一部分,開發人員就能通過編程語言進行篩選,LINQ查詢語句示例代碼如下所示。
var st = from s in str where s.Contains("學習") select s;
2.使用SQL Server
在傳統的資料庫開發中,如果需要篩選某個資料庫中的數據,可以通過SQL語句進行篩選。在ADO.NET中,首先需要從資料庫中查詢數據,查詢後就必須將數據填充到數據集中,然後在數據集中進行數據遍歷,示例代碼如下所示。
try
{
SqlConnection
con = new SqlConnection("server='(local)';database='student';uid='sa';pwd='sa'"); //創建連接
con.Open(); //打開連接
string strsql = "select * from student,class where student.c_id=class.c_id"; //SQL語句
SqlDataAdapter da = new SqlDataAdapter(strsql, con); //創建適配器
DataSet ds = new DataSet(); //創建數據集
int j = da.Fill(ds, "mytable"); //填充數據集
for (int i = 0; i < j; i++) //遍歷集合
{
Console.WriteLine(ds.Tables["mytable"].Rows[i]["S_NAME"].ToString()); //輸出對象
}
}
catch
{
Console.WriteLine("資料庫連接錯誤"); //拋出異常
}
上述代碼進行資料庫的訪問和查詢。在上述代碼中,首先需要創建一個連接對象進行資料庫連接,然後再打開連接,打開連接之後就要編寫SELECT語句進行資料庫查詢並填充到DataSet數據集中,並在DataSet數據集中遍歷相應的表和列進行數據篩選。如果要查詢C_ID為1的學生的所有姓名,有三個辦法,這三個辦法分別是:
修改SQL語句。
在循環內進行判斷。
使用LINQ進行查詢。
修改SQL語句是最方便的方法,直接在SELECT語句中添加查詢條件WHERE C-ID=1就能夠實現,但是這個方法擴展性非常的低,如果有其他需求則就需要修改SQL語句,也有可能造成其餘代碼填充數據集後數據集內容不同步。
在循環內進行判斷也是一種方法,但是這個方法當循環增加時會造成額外的性能消耗,並且當需要擴展時,還需要修改循環代碼。最方便的就是使用LINQ進行查詢,在Visual Studio 2008中提供了LINQ to SQL類文件用於將現有的數據抽象成對象,這樣就符合了面向對象的原則,同時也能夠減少代碼,提升擴展性。創建一個LINQ to SQL類文件,直接將服務資源管理器中的相應表拖放到LINQ to SQL類文件可視化窗口中即可,如圖21-1所示。
圖21-1 創建LINQ to SQL文件
創建了LINQ to SQL類文件後,就可以直接使用LINQ to SQL類文件提供的類進行查詢,示例代碼如下所示。
linqtosqlDataContext lq = new linqtosqlDataContext();
var mylq = from l in lq.Student from cl in lq.Class where l.C_ID==cl.C_ID select l; //執行查詢
foreach (var result in mylq) //遍歷集合
{
Console.WriteLine(result.S_NAME.ToString()); //輸出對象
}
上述代碼只用了很短的代碼就能夠實現資料庫中數據的查詢和遍歷,並且從可讀性上來說也很容易理解,因為LINQ查詢語句的語法基本與SQL語法相同,只要有一定的SQL語句基礎就能夠非常容易的編寫LINQ查詢語句。
3.數據集
LINQ同樣對數據集支持查詢和篩選操作。其實數據集也是集合的表現形式,數據集除了能夠填充資料庫中的內容以外,開發人員還能夠通過對數據集的操作向數據集中添加數據和修改數據。前面的章節中已經講到,數據集可以看作是內存中的資料庫。數據集能夠模擬基本的資料庫,包括表、關系等。這里就將SQL Server中的數據填充到數據集即可,示例代碼如下所示。
try
{
SqlConnection
con = new SqlConnection("server='(local)';database='student';uid='sa';pwd='sa'"); //創建連接
con.Open(); //打開連接
string strsql = "select * from student,class where student.c_id=class.c_id"; //執行SQL
SqlDataAdapter da = new SqlDataAdapter(strsql, con); //創建適配器
DataSet ds = new DataSet(); //創建數據集
da.Fill(ds, "mytable"); //填充數據集
DataTable tables = ds.Tables["mytable"]; //創建表
var dslq = from d in tables.AsEnumerable() select d; //執行LINQ語句
foreach (var res in dslq)
{
Console.WriteLine(res.Field<string>("S_NAME").ToString()); //輸出對象
}
}
catch
{
Console.WriteLine("資料庫連接錯誤");
}
上述代碼使用LINQ針對數據集中的數據進行篩選和整理,同樣能夠以一種面向對象的思想進行數據集中數據的篩選。在使用LINQ進行數據集操作時,LINQ不能直接從數據集對象中查詢,因為數據集對象不支持LINQ查詢,所以需要使用AsEnumerable方法返回一個泛型的對象以支持LINQ的查詢操作,示例代碼如下所示。
var dslq = from d in tables.AsEnumerable() select d; //使用AsEnumerable
上述代碼使用AsEnumerable方法就可以讓數據集中的表對象能夠支持LINQ查詢。
21.1.3 執行LINQ查詢
從上一節可以看出LINQ在編程過程中極大的方便了開發人員對於業務邏輯的處理代碼的編寫,在傳統的編程方法中復雜、冗餘、難以實現的方法在LINQ中都能很好的解決。LINQ不僅能夠像SQL語句一樣編寫查詢表達式,LINQ最大的優點也包括LINQ作為編程語言的一部分,可以使用編程語言提供的特性進行LINQ條件語句的編寫,這就彌補了SQL語句中的一些不足。在前面的章節中將一些復雜的查詢和判斷的代碼簡化成LINQ應用後,就能夠執行應用程序判斷LINQ是否查詢和篩選出了所需要的值。
1.數組
在數組數據源中,開發人員希望能夠篩選出大於5的元素。開發人員將傳統的代碼修改成LINQ代碼並通過LINQ查詢語句進行篩選,示例代碼如下所示。
var st = from s in inter where s > 5 select s; //執行LINQ查詢
上述代碼將查詢在inter數組中的所有元素並返回其中元素的值大於5的元素的集合,運行後如圖21-2所示。
圖21-2 遍歷數組
LINQ執行了條件語句並返回了元素的值大於5的元素。LINQ語句能夠方便的擴展,當有不同的需求時,可以修改條件語句進行邏輯判斷,例如可以篩選一個平方數為偶數的數組元素,直接修改條件即可,LINQ查詢語句如下所示。
var st = from s in inter where (s*s)%2==0 select s; //執行LINQ查詢
上述代碼通過條件(s*s)%2==0將數組元素進行篩選,選擇平方數為偶數的數組元素的集合,運行後如圖21-3所示。
圖21-3 更改篩選條件
2.使用SQL Server
在LINQ to SQL類文件中,LINQ to SQL類文件已經將資料庫的模型封裝成一個對象,開發人員能夠通過面向對象的思想訪問和整合資料庫。LINQ to SQL也對SQL做了補充,使用LINQ to SQL類文件能夠執行更強大的篩選,LINQ查詢語句代碼如下所示。
var mylq = from l in lq.Student from cl in lq.Class where l.C_ID==cl.C_ID select l; //執行LINQ查詢
上述代碼從Student表和Class表中篩選了C_ID相等的學生信息,這很容易在SQL語句中實現。LINQ作為編程語言的一部分,可以使用更多的編程方法實現不同的篩選需求,例如篩選名稱中包含「郭」字的學生的名稱在傳統的SQL語句中就很難通過一條語句實現,而在LINQ中就能夠實現,示例代碼如下所示。
var mylq = from l in lq.Student from cl in lq.Class where l.C_ID==cl.C_ID where
l.S_NAME.Contains("郭") select l; //執行LINQ條件查詢
上述代碼使用了Contains方法判斷一個字元串中是否包含某個字元或字元串,這樣不僅方便閱讀,也簡化了查詢操作,運行後如圖21-4和圖21-5所示。
圖21-4 簡單查詢 圖21-5 條件查詢
LINQ返回了符合條件的元素的集合,並實現了篩選操作。LINQ不僅作為編程語言的一部分,簡化了開發人員的開發操作,從另一方面講,LINQ也補充了在SQL中難以通過幾條語句實現的功能的實現。從上面的LINQ查詢代碼可以看出,就算是不同的對象、不同的數據源,其LINQ基本的查詢語法都非常相似,並且LINQ還能夠支持編程語言具有的特性從而彌補SQL語句的不足。在數據集的查詢中,其查詢語句也可以直接使用而無需大面積修改代碼,這樣代碼就具有了更高的維護性和可讀性。
③ Linq語句操作資料庫
LINQ,語言集成查詢(Language Integrated Query).僅僅是查詢,無法實現刪除,新增等操作
④ 淺談LINQ如何插入刪除和更新資料庫記錄備注
)。但是,LINQ TO SQL不是萬能的。例如,你在重新修改或設計資料庫表格後,原先使用LINQ TO SQL生成的DATACONTEXT類並不會自動更新。因此,針對這些更改之後的操作,需要特別注意。二、問題描述[一]本文中首先記錄的是使用LINQ插入資料庫記錄時涉及的一個基本概念級問題。請看下面的代碼片斷:public bool InsertUserStatus(string UserName){eMailDataContext dt = new eMailDataContext();try{//刪除可能存在的原有用戶狀態信息 Table3 u = dt.Table3.First(m => m.abc == UserName); //if (dt.Table3.Count() != 0)//{// Table3 u = dt.Table3.First(m => m.abc == UserName); //if (u != null)//{dt.Table3.DeleteOnSubmit(u); dt.SubmitChanges();//}//}//創建新的用戶狀態信息 Table3 userstatus = new Table3{abc = UserName};//插入到資料庫表格UserStatus中 dt.Table3.InsertOnSubmit(userstatus); dt.SubmitChanges();return true;}catch (System.InvalidOperationException){return false;//(2)}}上述代碼的意思是,在表格Table3 中先刪除可能存在的符合條件的記錄,然後在此表格中再插入一條記錄數據。上面的代碼將「可能」引發異常,將流程式控制制轉向(2)處。這些「可能」在於,數據表格Table3 中最初無記錄,則必引發異常;如果有記錄,則一切符合既定操作要求。於是,修改上面的代碼為如下:public bool InsertUserStatus(string UserName){eMailDataContext dt = new eMailDataContext();try{//刪除可能存在的原有用戶狀態信息 if (dt.Table3.Count() != 0)// (1){Table3 u = dt.Table3.First(m => m.abc == UserName); if (u != null){dt.Table3.DeleteOnSubmit(u); dt.SubmitChanges();}}//創建新的用戶狀態信息 Table3 userstatus = new Table3{abc = UserName};//插入到資料庫表格UserStatus中 dt.Table3.InsertOnSubmit(userstatus); dt.SubmitChanges(); return true;}catch (System.InvalidOperationException){return false;}}也就是說,刪除操作前需要先判定數據表格是否記空--這可以通過紅色的if語句((1)處)來實現。如此以來,無論表格中是否事先存在記錄都可以往下執行可能的刪除及插入操作了。[二]再來看一個例子,例如: //刪除舊的郵件 public static void DeleteSubject(string UserName, string host){eMailDataContext dt = new eMailDataContext(); string cmdText = "delete from MailDownloadTemp where UserName=" + "'"+UserName +"'"+ " and Host=" + "'"+host+"'";try{int result = dt.ExecuteCommand(cmdText);return;}catch (System.InvalidOperationException){return;}}上述操作同樣拋出異常。因此,需要同上面提到的那樣,先進行資料庫表格記錄數據判斷,再進行可能的刪除操作。因此,再修改上面代碼,如下所示: //刪除舊的郵件
⑤ C#.net 如何創建access資料庫
好像不能創建吧,倒是可以連接到Access資料庫的,就在工具欄的「工具」裡面
⑥ 如何使用LINQ鏈接資料庫舉個例子(C#.NET)謝謝
1、在App_Code下面添加新項「LINQ
to
SQL
類」
2、打開該類,設置Name屬性(例如MyLinqDB)和Connection屬性
3、伺服器資源管理器內添加資料庫連接
4、將資料庫內需要操作的表拖入LINQ
to
SQL
類的設計視圖,並保存
5、新建數據綁定控制項例如ListView1
6、後台Page_Load編寫代碼:
var
DB
=
new
MyLinqDB();
var
query
=
from
t
in
DB.T_Users
select
new
{t.ID,
t.UserName,
t.Password};
ListView1.DataSource
=
query.Where(t
=>
t.ID
>
0).Skip(3
*
20).Take(20);//每頁20,第四頁
ListView1.DataBind();
⑦ linq to sql,我已經有dbml文件,怎麼建立sql資料庫
linq dbml文件是從資料庫映射過來的,你拷貝dbml文件是也應該把SQL數據部分過來
⑧ 如何使用LINQ鏈接資料庫並操作資料庫
之前在遠標做過用JAVA連接資料庫主要有兩種方式,一是用JDBC-ODBC橋來連接,二是用相關廠商提供的相應驅動程序來連接,首先談談第一種連接。
JDBC-ODBC橋接器是用JdbcOdbc.Class和一個用於訪問ODBC驅動程序的本地庫實現的。對於WINDOWS平台,該本地庫是一個動態連接庫DLL(JDBCODBC.DLL)。
由於JDBC在設計上與ODBC很接近。在內部,這個驅動程序把JDBC的方法映射到ODBC調用上,這樣,JDBC就可以和任何可用的ODBC驅動程序進行交互了。這種橋接器的優點是,它使JDBC目前有能力訪問幾乎所有的資料庫。通行方式如圖所示:
應用程序---JDBC API---JDBC-ODBC---ODBC API---ODBC層---數據源
具體操作方法為:
首先打開控制面板的管理工具,打開數據源(ODBC),在用戶DSN裡面添加數據源(即你要連接的資料庫的名字),在這里假定連接SQL SERVER 2000的GoodsSupply資料庫。名稱填寫你要連接的資料庫的名稱(GoodsSupply),然後逐步設置,如果選用了使用SQL-SERVER密碼認證的話,就要輸入相應的用戶名及密碼連接到資料庫。一路下一步設置完成。
在JAVA裡面編寫程序進行測試,在這里我的程序是讓用戶輸入任意的表名與與列名,把該列的所有數據輸出。源代碼如下:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.sql.*;
public class ODBCBridge {
public static void main(String[] args) {
String url="jdbc:odbc:GoodsSupply";
Statement sm=null;
String command=null;
ResultSet rs=null;
String tableName=null;
String cName=null;
String result=null;
BufferedReader input=new BufferedReader(new InputStreamReader(System.in));
try {
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //載入驅動
}catch(ClassNotFoundException e){
System.out.println("Can not load Jdbc-Odbc Bridge Driver");
System.err.print("ClassNotFoundException:");
System.err.println(e.getMessage());
}
Connection con=DriverManager.getConnection(url,"USER","PASSWORD"); //使用SQL-SERVER2000認證
DatabaseMetaData dmd=con.getMetaData(); //DMD為連接的相應情況
System.out.println("連接的資料庫:"+dmd.getURL());
System.out.println("驅動程序:"+dmd.getDriverName());
sm=con.createStatement();
System.out.println("輸入表名");
tableName=input.readLine();
while(true) {
System.out.println("輸入列名(為空時程序結束):");
cName=input.readLine();
if(cName.equalsIgnoreCase(""))
break;
command="select "+cName+" from "+tableName;
rs=sm.executeQuery(command); //執行查詢
if(!rs.next())
System.out.println("表名或列名輸入有誤");
else {
System.out.println("查詢結果為:");
do
{
result=rs.getString(cName);
//資料庫語言設置為中文,不用轉換編碼
//result=new String(result.getBytes("ISO-8859-1"),"GB2312");
System.out.println(result);
}while(rs.next());
}
}
}catch(SQLException ex) {
System.out.println("SQLException:");
while(ex!=null) {
System.out.println("Message:"+ex.getMessage());
ex=ex.getNextException();
}
}catch(Exception e) {
System.out.println("IOException");
}
}
}
⑨ C#用LINQ操作Datatable資料庫
假設你上圖表格數據為 DataTable dt,列分別為AA,BB,CC,DD
var query = from p in dt.AsEnumerable()
//分組
group p by new
{
t1 = p.Field<int>("AA").ToString().Substring(0, p.Field<int>("AA").ToString().Length - 2),
t2 = p.Field<double>("BB"),
t3 = p.Field<string>("CC")
} into g
select new
{
ColA = g.Key.t1,
ColB = g.Key.t2,
ColC = g.Key.t3,
ColD = g.Sum(c => c.Field<int>("DD"))
};
//轉datatable
DataTable dtNew = dt.Clone();
DataRow drNew;
foreach (var p in query)
{
drNew = dtNew.NewRow();
drNew["AA"] = p.ColA;
drNew["BB"] = p.ColB;
drNew["CC"] = p.ColC;
drNew["DD"] = p.ColD;
dtNew.Rows.Add(drNew);
}
dtNew 為最終結果
註:轉換過程中要考慮空值的情況
⑩ linq 是否的是默認有資料庫連接池
沒有,需要你手動設置。另外你應該說Linq to SQL ....
可以使用一組名稱-值對以鏈接字元串的形式配置鏈接池。例如,可以配置池是否有效(默認是有效的),池的最大、最小容量,用於打
開鏈接的排隊請求被阻斷的時間。下面的示例字元串配置了池的最大和最小容量。
"Server=(local); Integrated Security=SSPI; Database=Northwind;
Max Pool Size=75; Min Pool Size=5"摘要
連接池允許應用程序從連接池中獲得一個連接並使用這個連接,而不需要為每一個連接請求重新建立一個連接。一旦一個新的連接被創建
並且放置在連接池中,應用程序就可以重復使用這個連接而不必實施整個資料庫連接創建過程。
當應用程序請求一個連接時,連接池為該應用程序分配一個連接而不是重新建立一個連接;當應用程序使用完連接後,該連接被歸還給連接
池而不是直接釋放。
確保你每一次的連接使用相同的連接字元串(和連接池相同);只有連接字元串相同時連接池才會工作。如果連接字元串不相同,應用程序
就不會使用連接池而是創建一個新的連接。優點
使用連接池的最主要的優點是性能。創建一個新的資料庫連接所耗費的時間主要取決於網路的速度以及應用程序和資料庫伺服器的
(網路)距離,而且這個過程通常是一個很耗時的過程。而採用資料庫連接池後,資料庫連接請求可以直接通過連接池滿足而不需要為該請
求重新連接、認證到資料庫伺服器,這樣就節省了時間。缺點
資料庫連接池中可能存在著多個沒有被使用的連接一直連接著資料庫(這意味著資源的浪費)。技巧和提示
1. 當你需要資料庫連接時才去創建連接池,而不是提前建立。一旦你使用完連接立即關閉它,不要等到垃圾收集器來處理它。
2. 在關閉資料庫連接前確保關閉了所有用戶定義的事務。
3. 不要關閉資料庫中所有的連接,至少保證連接池中有一個連接可用。如果內存和其他資源是你必須首先考慮的問題,可以關閉所有的連
接,然後在下一個請求到來時創建連接池。連接池FAQ
當第一個連接請求到來時創建連接池;連接池的建立由資料庫連接的連接字元創來決定。每一個連接池都與一個不同的連接字元串相關。
當一個新的連接請求到來時如果連接字元串和連接池使用的字元串相同,就從連接池取出一個連接;如果不相同,就新建一個連接池。
當連接池中的所有連接都已經關閉時關閉連接池。
當連接池已經達到它的最大連接數目時,有新的連接請求到來時,新的連接請求將放置到連接隊列中。當有連接釋放給連接池時,連接池將
新釋放的連接分配給在隊列中排隊的連接請求。你可以調用close和dispose將連接歸還給連接池。
對於.NET應用程序而言,默認為允許連接池。(這意味著你可以不必為這件事情做任何的事情)當然,如果你可以在SQLConnection對象的連
接字元串中加進Pooling=true;確保你的應用程序允許連接池的使用。
ADO.NET默認為允許資料庫連接池,如果你希望禁止連接池,可以使用如下的方式:
1) 使用SQLConnection對象時,往連接字元串加入如下內容:Pooling=False;
2) 使用OLEDBConnection對象時,往連接字元串加入如下內容:OLE DB Services=-4;