09存储过程查询-多个结果集
1 创建Northwind代码文件
執行:sqlmetal /code:"c:\linqtest7\northwind.cs" /language:csharp "c:\linqtest7\northwnd.mdf" /sprocs /functions /pluralize
1.2 Northwind 的储存过程
[Get Customer And Orders]
1.3 存储过程映射的代码
下面为工具生成代码。
/// <summary> /// 獲取客戶信息和訂單信息 /// </summary> /// <param name="customerID">客戶ID(輸入)</param> /// <returns> /// 返回2個結果:客戶信息和訂單信息 /// SELECT * FROM Customers AS c WHERE c.CustomerID = @CustomerID /// SELECT * FROM Orders AS o WHERE o.CustomerID = @CustomerID /// </returns> /// <remarks> /// Function:對應到數據庫的Procedure名字 /// ResultType:返回結果的類型,必須指定每一個結果的類型 /// IMultipleResults:表示返回多個結果 /// </remarks> [Function(Name = "dbo.Get Customer And Orders")] [ResultType(typeof(GetCustomerAndOrdersResult1))] [ResultType(typeof(GetCustomerAndOrdersResult2))] public IMultipleResults GetCustomerAndOrders([Parameter(Name = "CustomerID", DbType = "NChar(5)")] string customerID) { IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), customerID); return ((IMultipleResults)(result.ReturnValue)); }
注意:返回多個結果使用IMultipleResults
1.4 GetCustomerAndOrdersResult1类
public partial class GetCustomerAndOrdersResult1 { private string _CustomerID; private string _CompanyName; private string _ContactName; private string _ContactTitle; private string _Address; private string _City; private string _Region; private string _PostalCode; private string _Country; private string _Phone; private string _Fax; public GetCustomerAndOrdersResult1() { } [Column(Storage = "_CustomerID", DbType = "NChar(5)")] public string CustomerID { get { return this._CustomerID; } set { if ((this._CustomerID != value)) { this._CustomerID = value; } } } [Column(Storage = "_CompanyName", DbType = "NVarChar(40)")] public string CompanyName { get { return this._CompanyName; } set { if ((this._CompanyName != value)) { this._CompanyName = value; } } } [Column(Storage = "_ContactName", DbType = "NVarChar(30)")] public string ContactName { get { return this._ContactName; } set { if ((this._ContactName != value)) { this._ContactName = value; } } } [Column(Storage = "_ContactTitle", DbType = "NVarChar(30)")] public string ContactTitle { get { return this._ContactTitle; } set { if ((this._ContactTitle != value)) { this._ContactTitle = value; } } } [Column(Storage = "_Address", DbType = "NVarChar(60)")] public string Address { get { return this._Address; } set { if ((this._Address != value)) { this._Address = value; } } } [Column(Storage = "_City", DbType = "NVarChar(15)")] public string City { get { return this._City; } set { if ((this._City != value)) { this._City = value; } } } [Column(Storage = "_Region", DbType = "NVarChar(15)")] public string Region { get { return this._Region; } set { if ((this._Region != value)) { this._Region = value; } } } [Column(Storage = "_PostalCode", DbType = "NVarChar(10)")] public string PostalCode { get { return this._PostalCode; } set { if ((this._PostalCode != value)) { this._PostalCode = value; } } } [Column(Storage = "_Country", DbType = "NVarChar(15)")] public string Country { get { return this._Country; } set { if ((this._Country != value)) { this._Country = value; } } } [Column(Storage = "_Phone", DbType = "NVarChar(24)")] public string Phone { get { return this._Phone; } set { if ((this._Phone != value)) { this._Phone = value; } } } [Column(Storage = "_Fax", DbType = "NVarChar(24)")] public string Fax { get { return this._Fax; } set { if ((this._Fax != value)) { this._Fax = value; } } } }
1.6 GetCustomerAndOrdersResult2类
public partial class GetCustomerAndOrdersResult2 { private System.Nullable<int> _OrderID; private string _CustomerID; private System.Nullable<int> _EmployeeID; private System.Nullable<System.DateTime> _OrderDate; private System.Nullable<System.DateTime> _RequiredDate; private System.Nullable<System.DateTime> _ShippedDate; private System.Nullable<int> _ShipVia; private System.Nullable<decimal> _Freight; private string _ShipName; private string _ShipAddress; private string _ShipCity; private string _ShipRegion; private string _ShipPostalCode; private string _ShipCountry; public GetCustomerAndOrdersResult2() { } [Column(Storage = "_OrderID", DbType = "Int")] public System.Nullable<int> OrderID { get { return this._OrderID; } set { if ((this._OrderID != value)) { this._OrderID = value; } } } [Column(Storage = "_CustomerID", DbType = "NChar(5)")] public string CustomerID { get { return this._CustomerID; } set { if ((this._CustomerID != value)) { this._CustomerID = value; } } } [Column(Storage = "_EmployeeID", DbType = "Int")] public System.Nullable<int> EmployeeID { get { return this._EmployeeID; } set { if ((this._EmployeeID != value)) { this._EmployeeID = value; } } } [Column(Storage = "_OrderDate", DbType = "DateTime")] public System.Nullable<System.DateTime> OrderDate { get { return this._OrderDate; } set { if ((this._OrderDate != value)) { this._OrderDate = value; } } } [Column(Storage = "_RequiredDate", DbType = "DateTime")] public System.Nullable<System.DateTime> RequiredDate { get { return this._RequiredDate; } set { if ((this._RequiredDate != value)) { this._RequiredDate = value; } } } [Column(Storage = "_ShippedDate", DbType = "DateTime")] public System.Nullable<System.DateTime> ShippedDate { get { return this._ShippedDate; } set { if ((this._ShippedDate != value)) { this._ShippedDate = value; } } } [Column(Storage = "_ShipVia", DbType = "Int")] public System.Nullable<int> ShipVia { get { return this._ShipVia; } set { if ((this._ShipVia != value)) { this._ShipVia = value; } } } [Column(Storage = "_Freight", DbType = "Money")] public System.Nullable<decimal> Freight { get { return this._Freight; } set { if ((this._Freight != value)) { this._Freight = value; } } } [Column(Storage = "_ShipName", DbType = "NVarChar(40)")] public string ShipName { get { return this._ShipName; } set { if ((this._ShipName != value)) { this._ShipName = value; } } } [Column(Storage = "_ShipAddress", DbType = "NVarChar(60)")] public string ShipAddress { get { return this._ShipAddress; } set { if ((this._ShipAddress != value)) { this._ShipAddress = value; } } } [Column(Storage = "_ShipCity", DbType = "NVarChar(15)")] public string ShipCity { get { return this._ShipCity; } set { if ((this._ShipCity != value)) { this._ShipCity = value; } } } [Column(Storage = "_ShipRegion", DbType = "NVarChar(15)")] public string ShipRegion { get { return this._ShipRegion; } set { if ((this._ShipRegion != value)) { this._ShipRegion = value; } } } [Column(Storage = "_ShipPostalCode", DbType = "NVarChar(10)")] public string ShipPostalCode { get { return this._ShipPostalCode; } set { if ((this._ShipPostalCode != value)) { this._ShipPostalCode = value; } } } [Column(Storage = "_ShipCountry", DbType = "NVarChar(15)")] public string ShipCountry { get { return this._ShipCountry; } set { if ((this._ShipCountry != value)) { this._ShipCountry = value; } } } }
2 新建項目
新建Window Form App ,命名為SprocOnlyApp
3 添加引用和Namespace
加入 System.Data.Linq.dll
using System.Data.Linq;
4 将Northwind代码添加到项目
northwind.cs添加到SprocOnlyApp
5 设计界面
在Form上拖一个按钮,用来调用程式。
6 测试
private void button5_Click(object sender, EventArgs e) { Northwnd db = new Northwnd(@"c:\data\northwnd.mdf"); // 聲明變量用來儲存查詢定義 IMultipleResults result = db.GetCustomerAndOrders("ALFKI"); // ------ 方法一 使用專為結果定義的類------ // 執行查詢並且輸出結果 // 客戶 foreach (GetCustomerAndOrdersResult1 cust in result.GetResult<GetCustomerAndOrdersResult1>()) { Console.WriteLine(cust.CustomerID); } // Pause to view company names; press Enter to continue. Console.WriteLine(" ------ Orders ------ "); // 訂單 foreach (GetCustomerAndOrdersResult2 ord in result.GetResult<GetCustomerAndOrdersResult2>()) { Console.WriteLine(ord.OrderID); } // ------ 方法二 使用根據數據庫表生成的類------ Console.WriteLine(" == 使用根據數據庫表生成的類 == "); // 遇到結果是取表的部分有用的欄位,除非是繼承關係,否則不能使用。 // 不好使用。 foreach (Customer cust in result.GetResult<Customer>()) { Console.WriteLine(cust.CustomerID); } foreach (Order ord in result.GetResult<Order>()) { Console.WriteLine(ord.OrderID); } }
注意:IMultipleResults的功能-以变量返回顺序表示已对应函数或查询的结果。
ISingleResult的功能-表示拥有单一返回顺序之已对应函数的结果。
人的一生应该这样度过:当他回首往事的时候,不会因为虚度年华而悔恨,也不会因为碌碌无为而羞愧。