第八步:從表現(xiàn)層調(diào)用Managed Stored Procedures
當(dāng)對(duì)數(shù)據(jù)訪(fǎng)問(wèn)層和業(yè)務(wù)邏輯層進(jìn)行擴(kuò)充以支持調(diào)用GetDiscontinuedProducts 和 GetProductsWithPriceLessThan這2種managed stored procedures后,我們可以在一個(gè)ASP.NET頁(yè)面里展示這些存儲(chǔ)過(guò)程的結(jié)果了.
打開(kāi)AdvancedDAL文件夾里的ManagedFunctionsAndSprocs.aspx頁(yè)面,從工具箱拖一個(gè)GridView控件到設(shè)計(jì)器,設(shè)其ID為DiscontinuedProducts,在其智能標(biāo)簽里綁定到一個(gè)名為DiscontinuedProductsDataSource的ObjectDataSource控件,設(shè)置其調(diào)用ProductsBLLWithSprocs class類(lèi)的GetDiscontinuedProducts方法.
圖20:調(diào)用ProductsBLLWithSprocs Class類(lèi)
圖21:在SELECT標(biāo)簽里調(diào)用GetDiscontinuedProducts方法
由于我們只需要展示產(chǎn)品信息,在UPDATE, INSERT,和DELETE標(biāo)簽里選 “(None)”,再點(diǎn)Finish完成配置.完成后Visual Studio會(huì)為ProductsDataTable表的列自動(dòng)的添加BoundField列 或 CheckBoxField列. 將除ProductName和Discontinued以外的列全部刪除.這樣你的GridView 和 ObjectDataSource的聲明代碼看起來(lái)和下面的差不多:
asp:GridView ID="DiscontinuedProducts" runat="server"
AutoGenerateColumns="False" DataKeyNames="ProductID"
DataSourceID="DiscontinuedProductsDataSource">
Columns>
asp:BoundField DataField="ProductName" HeaderText="ProductName"
SortExpression="ProductName" />
asp:CheckBoxField DataField="Discontinued" HeaderText="Discontinued"
SortExpression="Discontinued" />
/Columns>
/asp:GridView>
asp:ObjectDataSource ID="DiscontinuedProductsDataSource" runat="server" OldValuesParameterFormatString="original_{0}" SelectMethod="GetDiscontinuedProducts" TypeName="ProductsBLLWithSprocs"> /asp:ObjectDataSource>
花點(diǎn)時(shí)間在瀏覽器里登錄該頁(yè)面。當(dāng)?shù)卿洉r(shí),ObjectDataSource控件將調(diào)用ProductsBLLWithSprocs class類(lèi)的 GetDiscontinuedProducts方法.就像我們?cè)诘谄卟娇吹降哪菢?,該方法又調(diào)用DAL層的ProductsDataTable class類(lèi)的GetDiscontinuedProducts方法,該方法又調(diào)用存儲(chǔ)過(guò)程GetDiscontinuedProducts.該存儲(chǔ)過(guò)程返回那些處于“discontinued”狀態(tài)的產(chǎn)品. 存儲(chǔ)過(guò)程返回的結(jié)果填充到DAL層的一個(gè)ProductsDataTable,進(jìn)而返回給BLL,再返回給表現(xiàn)層并綁定到一個(gè)GridView控件展現(xiàn)出來(lái).
圖22:“Discontinued”的產(chǎn)品被列出來(lái)了
我們可以繼續(xù)加強(qiáng)練習(xí),比如在頁(yè)面上再放置一個(gè)TextBox控件和一個(gè)GridView控件。在TextBox控件里輸入一個(gè)數(shù),而GridView控件調(diào)用ProductsBLLWithSprocs class類(lèi)的GetProductsWithPriceLessThan方法將價(jià)格低于該數(shù)的產(chǎn)品展示出來(lái).
第九步:創(chuàng)建并調(diào)用T-SQL UDFs
用戶(hù)自定義函數(shù)——簡(jiǎn)稱(chēng)UDF,是一種數(shù)據(jù)庫(kù)對(duì)象,與編程語(yǔ)言里的函數(shù)定義很相仿.與C#里面的函數(shù)類(lèi)似,UDF可以包含一系列的輸入?yún)?shù)并返回一個(gè)特定類(lèi)型的值.一個(gè)UDF要么返回標(biāo)量數(shù)據(jù)(scalar data)——比如一個(gè)string, 一個(gè)integer等等;要么返回一個(gè)表列數(shù)據(jù)(tabular data).讓我們先快速的考察一下這2種類(lèi)型的UDF,先從標(biāo)量數(shù)據(jù)類(lèi)型開(kāi)始.
下面的UDF用于計(jì)算某個(gè)特定產(chǎn)品的總價(jià).其有3個(gè)輸入?yún)?shù)——UnitPrice, UnitsInStock,Discontinued.其返回一個(gè)money類(lèi)型的值.它通過(guò)以UnitPrice乘以UnitsInStock來(lái)得到總價(jià),如是處于“discontinued”狀態(tài),則總價(jià)減半.
CREATE FUNCTION udf_ComputeInventoryValue
(
@UnitPrice money,
@UnitsInStock smallint,
@Discontinued bit
)
RETURNS money
AS
BEGIN
DECLARE @Value decimal
SET @Value = ISNULL(@UnitPrice, 0) * ISNULL(@UnitsInStock, 0)
IF @Discontinued = 1
SET @Value = @Value * 0.5
RETURN @Value
END
將該UDF添加到數(shù)據(jù)庫(kù)后,我們打開(kāi)Management Studio,打開(kāi)Programmability文件夾,再打開(kāi)Functions文件夾,再打開(kāi)Scalar-value Functions文件夾,就可以看到該UDF.我們可以在一個(gè)SELECT查詢(xún)里這樣來(lái)使用:
SELECT ProductID, ProductName, dbo.udf_ComputeInventoryValue
(UnitPrice, UnitsInStock, Discontinued) as InventoryValue
FROM Products
ORDER BY InventoryValue DESC
我已經(jīng)將該udf_ComputeInventoryValue用戶(hù)函數(shù)添加到了Northwind數(shù)據(jù)庫(kù)。圖23就是在Management Studio里調(diào)用上述SELECT查詢(xún)得到的輸出結(jié)果.
圖23:列出了每個(gè)產(chǎn)品的總價(jià)
UDF也可以返回表列數(shù)據(jù).比如,我們可以創(chuàng)建一個(gè)UDF返回屬于某個(gè)category的所有產(chǎn)品:
CREATE FUNCTION dbo.udf_GetProductsByCategoryID
(
@CategoryID int
)
RETURNS TABLE
AS
RETURN
(
SELECT ProductID, ProductName, SupplierID, CategoryID,
QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder,
ReorderLevel, Discontinued
FROM Products
WHERE CategoryID = @CategoryID
)
該udf_GetProductsByCategoryID用戶(hù)函數(shù)接受一個(gè)@CategoryID輸入?yún)?shù),返回SELECT查詢(xún)的結(jié)果.一旦創(chuàng)建之后,該UDF就可以在SELECT查詢(xún)的FROM (或 JOIN)之句里引用.下面的示例返回飲料類(lèi)所屬的每個(gè)產(chǎn)品的ProductID, ProductName,CategoryID值:
SELECT ProductID, ProductName, CategoryID
FROM dbo.udf_GetProductsByCategoryID(1)
我已經(jīng)將該udf_GetProductsByCategoryID用戶(hù)函數(shù)添加到Northwind數(shù)據(jù)庫(kù)。圖24顯示的是在Management Studio運(yùn)行上述SELECT查詢(xún)的結(jié)果.返回表列數(shù)據(jù)的UDF放在Table-value Functions文件夾里.
圖24:飲料類(lèi)產(chǎn)品的ProductID, ProductName,CategoryID都列出來(lái)了
注意:關(guān)于創(chuàng)建和使用UDF的更多詳情,請(qǐng)參閱文章《Intro to User-Defined Functions》和《dvantages and Drawbacks of User-Defined Functions》
第十步:創(chuàng)建一個(gè)Managed UDF
上面示例里創(chuàng)建的udf_ComputeInventoryValue和 udf_GetProductsByCategoryID用戶(hù)函數(shù)都是T-SQL數(shù)據(jù)庫(kù)對(duì)象.SQL Server 2005同樣支持managed UDF,我們可以將其添加到ManagedDatabaseConstructs工程,就像在第三和第五步做的那樣.在這一步,我們將用managed code執(zhí)行udf_ComputeInventoryValue用戶(hù)函數(shù).
在解決資源管理器里右鍵單擊,選擇“Add a New Item”,在對(duì)話(huà)框里選User-Defined Function模板,將新UDF文件命名為udf_ComputeInventoryValue_Managed.cs.
圖25:向ManagedDatabaseConstructs工程添加一個(gè)Managed UDF
該User-Defined Function模板將創(chuàng)建一個(gè)名為UserDefinedFunctions的partial class類(lèi),同時(shí)還有一個(gè)方法,該方法的名字與類(lèi)文件的名字一樣(就本例而言,為udf_ComputeInventoryValue_Managed)。該方法有一個(gè)SqlFunction特性, 這就標(biāo)明了該方法是一個(gè)managed UDF.
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
public partial class UserDefinedFunctions
{
[Microsoft.SqlServer.Server.SqlFunction]
public static SqlString udf_ComputeInventoryValue_Managed()
{
// Put your code here
return new SqlString("Hello");
}
}
該udf_ComputeInventoryValue方法目前返回一個(gè)SqlString對(duì)象,且不接受任何的輸入?yún)?shù).我們將對(duì)其進(jìn)行更新以包含3個(gè)參數(shù)——UnitPrice, UnitsInStock,和Discontinued,并返回一個(gè)SqlMoney對(duì)象.該方法用到邏輯與上面的T-SQL類(lèi)型的udf_ComputeInventoryValue用戶(hù)函數(shù)的一樣.
[Microsoft.SqlServer.Server.SqlFunction]
public static SqlMoney udf_ComputeInventoryValue_Managed
(SqlMoney UnitPrice, SqlInt16 UnitsInStock, SqlBoolean Discontinued)
{
SqlMoney inventoryValue = 0;
if (!UnitPrice.IsNull !UnitsInStock.IsNull)
{
inventoryValue = UnitPrice * UnitsInStock;
if (Discontinued == true)
inventoryValue = inventoryValue * new SqlMoney(0.5);
}
return inventoryValue;
}
我們注意到UDF方法的輸入?yún)?shù)就是其對(duì)應(yīng)的SQL類(lèi)型:UnitPrice的類(lèi)型為SqlMoney、UnitsInStock的類(lèi)型為SqlInt16、Discontinued的類(lèi)型為SqlBoolean.這些類(lèi)型反映了這些列在Products表里定義的類(lèi)型:UnitPrice列的類(lèi)型為money、UnitsInStock列的類(lèi)型為smallint、Discontinued列的類(lèi)型為bit.
代碼首先創(chuàng)建了一個(gè)SqlMoney類(lèi)型的名為inventoryValue的實(shí)例,并賦值為0.由于Products表允許UnitsInPrice 和 UnitsInStock列的值為NULL,因此我們首先通過(guò)SqlMoney對(duì)象的IsNull屬性來(lái)檢查這2列是否包NULL值。如果這2列的值都不為NULL,那么UnitPrice乘以UnitsInStock就得到了inventoryValue的值,另外如果Discontinued為true的話(huà),inventoryValue的值減半.
注意:由于SqlMoney對(duì)象只允許2個(gè)SqlMoney實(shí)例相乘,它不允許一個(gè)SqlMoney實(shí)例與一浮點(diǎn)數(shù)(literal floating-point)相乘,所以在代碼里我們用一個(gè)值為0.5的SqlMoney實(shí)例與inventoryValue相乘.
第11步驟:配置Managed UDF
現(xiàn)在我們已經(jīng)創(chuàng)建了一個(gè)managed UDF,我們將把它配置給Northwind數(shù)據(jù)庫(kù).就像我們?cè)诘谒牟娇吹降哪菢?,在解決資源管理器里,在工程名上右鍵單擊選“Deploy”.
完成后,返回到SQL Server Management Studio,刷新Scalar-valued Functions文件夾.你就會(huì)看到2個(gè)實(shí)體:
.dbo.udf_ComputeInventoryValue——在第九步創(chuàng)建的T-SQL UDF
.dbo.udf ComputeInventoryValue_Managed——我們?cè)诘?0步剛剛創(chuàng)建的managed UDF
對(duì)該managed UDF進(jìn)行測(cè)試,在Management Studio里執(zhí)行如下的查詢(xún):
SELECT ProductID, ProductName,
dbo.udf_ComputeInventoryValue_Managed(
UnitPrice,
UnitsInStock,
Discontinued
) as InventoryValue
FROM Products
ORDER BY InventoryValue DESC
該命令使用的是udf ComputeInventoryValue_Managed函數(shù)而不是udf_ComputeInventoryValue函數(shù),但是輸出結(jié)果都一樣,可以查看圖23的截屏.
第12步:調(diào)試Managed Database Objects
在第72章我們探討了通過(guò)Visual Studio調(diào)試SQL Server的3種模式:直接數(shù)據(jù)庫(kù)調(diào)試、應(yīng)用程序調(diào)試、通過(guò)SQL Server Project調(diào)試.Managed database objects不能用直接數(shù)據(jù)庫(kù)模式調(diào)試,不過(guò)可以從一個(gè)客戶(hù)端程序和SQL Server Project來(lái)調(diào)試.為了使調(diào)試正常工作,SQL Server 2005 數(shù)據(jù)庫(kù)要求必須允許SQL/CLR調(diào)試.記得當(dāng)我們最初創(chuàng)建ManagedDatabaseConstructs工程時(shí),Visual Studio詢(xún)問(wèn)我們是否激活SQL/CLR調(diào)試(見(jiàn)第2步的圖6).我們可以在Server Explorer窗口里在數(shù)據(jù)庫(kù)上右鍵單擊,以對(duì)該配置進(jìn)行修改.
圖26:確保數(shù)據(jù)庫(kù)激活SQL/CLR調(diào)試
設(shè)想我們想調(diào)試GetProductsWithPriceLessThan存儲(chǔ)過(guò)程.我們首先要在GetProductsWithPriceLessThan方法的代碼里設(shè)置斷點(diǎn).
圖27:在GetProductsWithPriceLessThan方法里設(shè)置斷點(diǎn)
首先我們考察從SQL Server Project里調(diào)試managed database objects.
由于我們的解決資源管理器里包含2個(gè)工程——ManagedDatabaseConstructs SQL Server Project以及我們的website.為了從SQL Server Project進(jìn)行調(diào)試,當(dāng)調(diào)試時(shí)我們需要引導(dǎo)Visual Studio開(kāi)啟ManagedDatabaseConstructs SQL Server Project.在解決資源管理器里的ManagedDatabaseConstructs project上點(diǎn)擊右鍵,選“Set as StartUp Project”項(xiàng).
當(dāng)從調(diào)試器打開(kāi)ManagedDatabaseConstructs project時(shí),它執(zhí)行Test.sql文件的SQL statements,該文件位于Test Scripts文件夾.比如,要測(cè)試GetProductsWithPriceLessThan存儲(chǔ)過(guò)程的話(huà),將Test.sql文件的內(nèi)容替換為下面的statement,這些statement調(diào)用GetProductsWithPriceLessThan存儲(chǔ)過(guò)程,其輸入?yún)?shù)@CategoryID的值為14.95:
exec GetProductsWithPriceLessThan 14.95
一旦將上面的腳本鍵入Test.sql文件,點(diǎn)Debug菜單里的“Start Debugging”項(xiàng),或按F5或是工具欄上的綠色圖標(biāo)啟動(dòng)調(diào)試.這將在資源管理器里構(gòu)建工程,將該managed database objects配置給Northwind數(shù)據(jù)庫(kù),然后執(zhí)行Test.sql腳本.此時(shí),將會(huì)遇到斷點(diǎn),我們可以進(jìn)入GetProductsWithPriceLessThan方法,檢查輸入?yún)?shù)的值等等.
圖28:碰到GetProductsWithPriceLessThan方法里的斷點(diǎn)
為了從客戶(hù)端程序調(diào)試一個(gè)SQL database object,數(shù)據(jù)庫(kù)務(wù)必要配置為支持應(yīng)用程序調(diào)試.在服務(wù)器資源管理器里,在數(shù)據(jù)庫(kù)上右鍵單擊,確保選中“Application Debugging”項(xiàng)。另外,我們還要將ASP.NET應(yīng)用程序與SQL Debugger結(jié)合起來(lái),而且關(guān)閉連接池.這些步驟我們?cè)诘?4章的第2步里詳細(xì)探討過(guò)了.
一旦你配置完ASP.NET應(yīng)用程序和數(shù)據(jù)庫(kù).設(shè)置ASP.NET website為啟動(dòng)方案.如果你登錄一個(gè)調(diào)用設(shè)置了斷點(diǎn)的managed objects的頁(yè)面的話(huà),該程序就會(huì)碰到斷點(diǎn),并轉(zhuǎn)換到調(diào)試器,在調(diào)試器里你可以進(jìn)入代碼,就像圖28那樣.
第13步:手動(dòng)編譯并配置Managed Database Objects
使用SQL Server Projects,我們可以很容易的創(chuàng)建、編譯、配置managed database objects.不過(guò)遺憾的是,只有在Visual Studio的Professional 和 Team Systems這2個(gè)版本才可以使用SQL Server Projects.如果你使用的是Visual Web Developer 或 Standard Edition版本,并且打算使用managed database objects的話(huà),你需要手動(dòng)創(chuàng)建并配置它們.這將包括4個(gè)步驟:
1.創(chuàng)建一個(gè)文件來(lái)存放managed database object的源代碼
2.將object進(jìn)行編譯
3.將編譯文件注冊(cè)到SQL Server 2005數(shù)據(jù)庫(kù)
4.在SQL Server里創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)對(duì)象,并指向編譯文件里的相應(yīng)的方法
為便于演示,我們將創(chuàng)建一個(gè)新的managed stored procedure,返回那些UnitPrice值高于指定值的產(chǎn)品.在你的電腦上創(chuàng)建一個(gè)名為GetProductsWithPriceGreaterThan.cs 的新文件,并鍵入如下的代碼(你可以使用Visual Studio, Notepad或任何的文本編輯器來(lái)進(jìn)行):
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
public partial class StoredProcedures
{
[Microsoft.SqlServer.Server.SqlProcedure]
public static void GetProductsWithPriceGreaterThan(SqlMoney price)
{
// Create the command
SqlCommand myCommand = new SqlCommand();
myCommand.CommandText =
@"SELECT ProductID, ProductName, SupplierID, CategoryID,
QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder,
ReorderLevel, Discontinued
FROM Products
WHERE UnitPrice > @MinPrice";
myCommand.Parameters.AddWithValue("@MinPrice", price);
// Execute the command and send back the results
SqlContext.Pipe.ExecuteAndSend(myCommand);
}
}
這些代碼與我們?cè)诘谖宀絼?chuàng)建的GetProductsWithPriceLessThan方法的代碼很相似.唯一的不同在于:方法名不同、WHERE字句不同、以及查詢(xún)使用的參數(shù)名不同.返回到GetProductsWithPriceLessThan方法,其WHERE字句為“WHERE UnitPrice @MaxPrice”. 而在這里,GetProductsWithPriceGreaterThan方法里,代碼為“WHERE UnitPrice > @MinPrice”.
我們現(xiàn)在需要將該類(lèi)進(jìn)行編譯.在命令行里導(dǎo)航到你存放GetProductsWithPriceGreaterThan.cs文件的根目錄,并使用C#編譯器(csc.exe)來(lái)進(jìn)行編譯:
csc.exe /t:library /out:ManuallyCreatedDBObjects.dll GetProductsWithPriceGreaterThan.cs
如果包含csc.exe的文件夾沒(méi)有位于系統(tǒng)路徑,那你將必須完全引用其路徑,%WINDOWS%/Microsoft.NET/Framework/version/,比如:
C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/csc.exe /t:library /out:ManuallyCreatedDBObjects.dll GetProductsWithPriceGreaterThan.cs
圖29:對(duì)GetProductsWithPriceGreaterThan.cs文件進(jìn)行編譯
其中,/t標(biāo)記指定將C# class類(lèi)編譯為一個(gè)DLL(而不是可執(zhí)行文件)。而 /out標(biāo)記指定了編譯后文件的名稱(chēng).
注意:除了用命令行來(lái)編譯GetProductsWithPriceGreaterThan.cs class類(lèi)外,我們還可以使用Visual C# Express Edition或在Visual Studio Standard Edition版里創(chuàng)建一個(gè)單獨(dú)的Class Library project.S?ren Jacob Lauritsen為我們提供了一個(gè)Visual C# Express Edition project,它包含了GetProductsWithPriceGreaterThan存儲(chǔ)過(guò)程,以及我們?cè)诘?、5和10步里創(chuàng)建的那2個(gè)managed stored procedures 和 UDF.此外還包含了添加相應(yīng)數(shù)據(jù)庫(kù)對(duì)象必需的T-SQL commands.
將代碼編譯完后,我們需要將其注冊(cè)到SQL Server 2005數(shù)據(jù)庫(kù).可以通過(guò)T-SQL,使用命令CREATE ASSEMBLY,或通過(guò)SQL Server Management Studio. 我們來(lái)看使用Management Studio的情況.
在Management Studio里,展開(kāi)Northwind數(shù)據(jù)庫(kù)里的Programmability文件夾,其內(nèi)有一個(gè)Assemblies文件夾。在該文件夾上右鍵單擊,選“New Assembly”.這將開(kāi)啟New Assembly對(duì)話(huà)框(見(jiàn)圖30),點(diǎn)擊Browse按鈕,選擇我們剛剛編譯的ManuallyCreatedDBObjects.dll文件,再點(diǎn)OK完成添加.在Object Explorer里你應(yīng)該可以看到ManuallyCreatedDBObjects.dll文件.
圖30:將ManuallyCreatedDBObjects.dll添加到數(shù)據(jù)庫(kù)
圖31:ManuallyCreatedDBObjects.dll展示在Object Explorer里
完成后,我們要將一個(gè)存儲(chǔ)過(guò)程與編譯文件里的GetProductsWithPriceGreaterThan方法聯(lián)系起來(lái).為此,打開(kāi)一個(gè)new query窗口,執(zhí)行下面的腳本:
CREATE PROCEDURE [dbo].[GetProductsWithPriceGreaterThan]
(
@price [numeric](18, 0)
)
WITH EXECUTE AS CALLER
AS
EXTERNAL NAME [ManuallyCreatedDBObjects].[StoredProcedures].[GetProductsWithPriceGreaterThan]
GO
這將在Northwind數(shù)據(jù)庫(kù)里創(chuàng)建一個(gè)名為etProductsWithPriceGreaterThan的新存儲(chǔ)過(guò)程,并將其與GetProductsWithPriceGreaterThan方法聯(lián)系起來(lái)(該方法屬于編譯文件ManuallyCreatedDBObjects)
執(zhí)行完腳本后,在Object Explorer里刷新Stored Procedures文件夾。你將看到一個(gè)新的存儲(chǔ)過(guò)程——GetProductsWithPriceGreaterThan,在該存儲(chǔ)過(guò)程旁邊有一個(gè)鎖的圖標(biāo).測(cè)試該存儲(chǔ)過(guò)程,在查詢(xún)窗口鍵入并執(zhí)行如下的腳本:
exec GetProductsWithPriceGreaterThan 24.95
如圖32所示,上述命令將那些價(jià)格高于24.95的產(chǎn)品展示出來(lái).
圖32:在對(duì)象資源管理器的顯示的列表
結(jié)語(yǔ):
Microsoft SQL Server 2005整合了Common Language Runtime (CLR),它允許用managed code來(lái)創(chuàng)建數(shù)據(jù)庫(kù)對(duì)象.在以前,要?jiǎng)?chuàng)建數(shù)據(jù)庫(kù)對(duì)象,我們只能使用T-SQL, 但是現(xiàn)在我們可以使用.NET編程語(yǔ)言,比如C#來(lái)進(jìn)行創(chuàng)建. 在本文我們創(chuàng)建了2個(gè)managed stored procedures以及一個(gè)managed User-Defined Function.
Visual Studio的SQL Server Project類(lèi)型可以很容易的創(chuàng)建、編譯、配置managed database objects,此外還支持多種調(diào)試.遺憾的是,SQL Server Project類(lèi)型只有在Visual Studio的Professional 和 Team Systems版本才有。對(duì)于Visual Web Developer 或Standard版的用戶(hù)而言,要手工完成這些步驟,就想我們?cè)诘?3步看到的那樣.
祝編程快樂(lè)!
作者簡(jiǎn)介
本系列教程作者 Scott Mitchell,著有六本ASP/ASP.NET方面的書(shū),是4GuysFromRolla.com的創(chuàng)始人,自1998年以來(lái)一直應(yīng)用 微軟Web技術(shù)。大家可以點(diǎn)擊查看全部教程《[翻譯]Scott Mitchell 的ASP.NET 2.0數(shù)據(jù)教程》,希望對(duì)大家的學(xué)習(xí)ASP.NET有所幫助。
您可能感興趣的文章:- sqlserver中的自定義函數(shù)的方法小結(jié)
- mysql建立自定義函數(shù)的問(wèn)題
- SQL server使用自定義函數(shù)以及游標(biāo)
- 深入mysql創(chuàng)建自定義函數(shù)與存儲(chǔ)過(guò)程的詳解
- MySQL中文漢字轉(zhuǎn)拼音的自定義函數(shù)和使用實(shí)例(首字的首字母)
- MySQL 自定義函數(shù)CREATE FUNCTION示例
- 談?wù)剆qlserver自定義函數(shù)與存儲(chǔ)過(guò)程的區(qū)別
- 淺談mysql 自定義函數(shù)
- Mysql中實(shí)現(xiàn)提取字符串中的數(shù)字的自定義函數(shù)分享
- Sql Server中常用的6個(gè)自定義函數(shù)分享