在 Visual Basic .NET 中使用預存程序(2)

來源:互聯網
上載者:User
visual|預存程序 從預存程序傳回值
以上樣本有一個不足之處。Northwind Customers 表使用數字字母形式的主鍵,並且必須由插入資料的應用程式產生。也就是說,如果使用以上程式插入新記錄,則必須為 CustomerID 自行建立由五個字元組成的值。

在真實軟體中,為新記錄自動產生主鍵更為常見。主鍵通常是按順序分配的長整數。

為新記錄設定主鍵有兩種基本技術。應用程式可調用產生下一個可用 ID 的預存程序,然後將此 ID 直接放到 DataSet 的新行中。或者,用於插入記錄的預存程序可以為記錄派生新 ID,然後將其作為傳回值傳遞迴應用程式。

第一種技術需要一點額外的邏輯來擷取新 ID 並將其放到新記錄的相應位置。使用預存程序執行插入操作與以上樣本類似。

但第二種技術要求在預存程序中使用一種新型參數。到目前為止我們見到的所有參數都是預設類型,即輸入參數。實際上參數分四種類型:

Input 此參數只用於將資訊從應用程式傳輸到預存程序。
InputOutput 此參數可將資訊從應用程式傳輸到預存程序,並將資訊從預存程序傳輸回應用程式。
Output 此參數只用於將資訊從預存程序傳輸回應用程式。
ReturnValue 此參數表示預存程序的傳回值。SQL Server 的預存程序參數列表中不顯示該參數。它只與預存程序的 RETURN 語句中的值相關聯。

預存程序為主鍵產生新值後,通常使用預存程序中的 RETURN 語句返回該值,因此用來訪問該值的參數類型是 ReturnValue 參數。

ReturnValue 參數與其他類型的參數有一個重要的區別。通常,在 ADO.NET 中為 Command 對象配置的參數的順序並不重要。參數名稱只用來與預存程序中相應的參數相匹配。但是,對於 ReturnValue 參數,它必須是列表中的第一個參數。

也就是說,為 Command 對象配置 ReturnValue 參數時,必須首先在代碼中配置該參數,這樣它才能擷取集合中的第一個數字索引。如果先配置任何其他參數,ReturnValue 參數將不能正常工作。

為了說明帶傳回值的預存程序的用法,我們編寫一個在 Northwind Products 表中插入記錄的樣本。此表被設定為使用 Identity 列自動建立新產品識別碼。遺憾的是,Northwind 樣本資料庫不包含執行所需操作的預存程序,所以在完成樣本其餘部分之前,我們需要向資料庫插入一個這樣的預存程序。

轉到 Visual Studio .NET 中的 Server Explorer(伺服器總管)。開啟 SQL Server 的節點,開啟 SQL Server 執行個體的節點,然後開啟 Northwind 資料庫的節點。

按右鍵 Stored Procedures(預存程序)節點,選擇 New Stored Procedure(建立預存程序)。在出現的編輯視窗中,用以下文本替換其中的所有文本:

ALTER PROCEDURE dbo.MSDNInsertProduct
(
   @ProductName nvarchar(40),
   @SupplierID int,
   @CategoryID int,
   @QuantityPerUnit nvarchar(20),
   @UnitPrice money,
   @UnitsInStock smallint,
   @UnitsOnOrder smallint,
   @ReorderLevel smallint,
   @Discontinued bit
)
AS
   declare @ProductID int

   SET NOCOUNT OFF;
INSERT INTO Products(ProductName, SupplierID, CategoryID, QuantityPerUnit,
UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel, Discontinued) VALUES
(@ProductName, @SupplierID, @CategoryID, @QuantityPerUnit, @UnitPrice,
@UnitsInStock, @UnitsOnOrder, @ReorderLevel, @Discontinued);
   SELECT @ProductID = @@IDENTITY

RETURN @ProductID

現在關閉編輯視窗,當系統詢問您是否要儲存更改時,單擊 Yes(是)。現在預存程序就已儲存到資料庫中,並被命名為 MSDNInsertProduct。

現在便可以編寫代碼來使用此預存程序。建立 Windows 應用程式,在空白 Form1 上,放置錨定到所有四個邊的 DataGrid,還需添加名為 btnFill 和 btnInsertProduct 的兩個按鈕。將 btnFill 的 Text 屬性設定為 Fill,將 btnInsertProduct 的 Text 屬性設定為 Insert Product。

在 btnFill 的 Click 事件中,放置以下代碼:

Dim sConnectionString As String = _
    "server=localhost;uid=sa;pwd=;database=Northwind"
Dim sSQL As String = "SELECT * FROM Products"
Dim daGetProducts As New SqlDataAdapter(sSQL, sConnectionString)
Dim dsProducts As New DataSet()
daGetProducts.Fill(dsProducts, "Products")
DataGrid1.DataSource = dsProducts

它與本文前面所講的代碼大致相同,所以我們不再贅述。不要忘記必要時更改連接字串,並在項目代碼的頂部為 SQLClient 命名空間放置 Imports 語句。然後在 btnInsertProduct 的 Click 事件中放置以下代碼:

Dim sConnectionString As String = _
    "server=localhost;uid=sa;pwd=;database=Northwind"
Dim cnNorthwind As New SqlConnection(sConnectionString)
Dim cmdInsertProduct As New SqlCommand("MSDNInsertProduct", cnNorthwind)
cmdInsertProduct.CommandType = CommandType.StoredProcedure
' 為預存程序設定參數
cmdInsertProduct.Parameters.Add(New SqlParameter("@RETURN_VALUE", SqlDbType.Int, 4, "ProductID"))
cmdInsertProduct.Parameters("@RETURN_VALUE").Direction = ParameterDirection.ReturnValue

cmdInsertProduct.Parameters.Add(New SqlParameter("@ProductName", _
    SqlDbType.NVarChar, 40, "ProductName"))
cmdInsertProduct.Parameters.Add(New SqlParameter("@SupplierID", _
    SqlDbType.Int, 4, "SupplierID"))
cmdInsertProduct.Parameters.Add(New SqlParameter("@CategoryID", _
    SqlDbType.Int, 4, "CategoryID"))
cmdInsertProduct.Parameters.Add(New SqlParameter("@QuantityPerUnit", _
    SqlDbType.NVarChar, 20, "QuantityPerUnit"))
cmdInsertProduct.Parameters.Add(New SqlParameter("@UnitPrice", _
    SqlDbType.Money, 8, "UnitPrice"))
cmdInsertProduct.Parameters.Add(New SqlParameter("@UnitsInStock", _
    SqlDbType.SmallInt, 2, "UnitsInStock"))
cmdInsertProduct.Parameters.Add(New SqlParameter("@UnitsOnOrder", _
    SqlDbType.SmallInt, 2, "UnitsOnOrder"))
cmdInsertProduct.Parameters.Add(New SqlParameter("@ReorderLevel", _
    SqlDbType.SmallInt, 2, "ReorderLevel"))
cmdInsertProduct.Parameters.Add(New SqlParameter("@Discontinued", _
    SqlDbType.Bit, 1, "Discontinued"))

Dim daInsertProduct As New SqlDataAdapter()
daInsertProduct.InsertCommand = cmdInsertProduct
Dim dsProducts As DataSet = CType(DataGrid1.DataSource, DataSet)

Dim drNewProduct As DataRow
drNewProduct = dsProducts.Tables("Products").NewRow
drNewProduct.Item("ProductName") = "Billy's Sesame Oil"
drNewProduct.Item("SupplierID") = 4
drNewProduct.Item("CategoryID") = 7
drNewProduct.Item("QuantityPerUnit") = "6 10oz bottles"
drNewProduct.Item("UnitPrice") = 69
drNewProduct.Item("UnitsInStock") = 12
drNewProduct.Item("UnitsOnOrder") = 0
drNewProduct.Item("ReorderLevel") = 6
drNewProduct.Item("Discontinued") = False
dsProducts.Tables("Products").Rows.Add(drNewProduct)

daInsertProduct.Update(dsProducts.Tables("Products"))

MsgBox(drNewProduct.Item("ProductID"))

此代碼與如上所示的代碼類似,只是為傳回值配置參數的程式碼不同。請注意,它是第一個參數,並被設定為將傳回值放回到 ProductID 欄位中。

用於向資料集中插入新行的代碼是標準 ADO.NET 代碼,所以我們就不再贅述。它為產品記錄建立一行新的適當結構(使用產品 DataTable 的 NewRow 方法),然後將資料放入行中,最後向產品 DataTable 的 Rows 集合中添加行。

現在運行程式進行測試。單擊 Fill 按鈕,但不對網格中的資料進行任何更改。然後按 Insert Product 按鈕。將插入 Billy's Sesame Oil 的新產品記錄,並且出現的訊息框會通知您為其返回的 ProductID。還可以開啟網格中的 Products 表,滾動到底部,並看到已添加了新行。

使用 Server Explorer(伺服器總管)編寫參數代碼
以上代碼編寫起來既冗長又繁瑣。但是,DataAdapter Configuration Wizard(資料配接器設定精靈)提示可以使用 Visual Studio 為我們編寫此代碼。DataAdapter Configuration Wizard(資料配接器設定精靈)為完整配置所需的四個預存程序(分別是 Select、Update、Insert 和 Delete)產生了代碼。假設您象以上樣本一樣只需要一個預存程序的代碼,可以將其截短。要獲得只與一個預存程序通訊的預先編寫好的代碼,只需展開 Server Explorer(伺服器總管)以顯示需要訪問的預存程序,然後將該預存程序拖到設計介面上。將看到為該預存程序建立的 DataAdapter 和 Command 對象,代碼的設計器部分包含為該預存程序配置參數所需的所有代碼。可以按原樣使用該代碼,也可以根據需要複製並調整後使用。

小結
本文中的樣本仍是示範軟體,但至少足以向您說明如何訪問預存程序,以便您開始編寫自己的真實軟體。當然,您需要瞭解要訪問的預存程序,並且可能需要向資料庫管理員 (DBA) 或其他組員諮詢以擷取該資訊。

對於複雜系統,預存程序有許多優勢。希望您在本文中學到了足夠的知識,可以不必擔心如何開始使用它們。第一次嘗試編寫代碼時,您可能希望使用 DataAdapter Wizard(DataAdapter 嚮導)或 Server Explorer(伺服器總管)。但如果您能在必要時自行編寫存取碼,則可以更有效地使用預存程序。

相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。