ADO.NET修改數(shù)據(jù)巧妙運用存儲過程實現(xiàn)
學(xué)習(xí)ADO.NET時,你可能會遇到ADO.NET修改數(shù)據(jù)問題,這里將介紹ADO.NET修改數(shù)據(jù)問題的解決方法,在這里拿出來和大家分享一下。存儲過程可以接受數(shù)據(jù)作為輸入?yún)?shù)并可以返回數(shù)據(jù)作為輸出參數(shù)、結(jié)果集或返回值。 下面的示例演示 ADO.NET 如何發(fā)送和接收輸入?yún)?shù)、輸出參數(shù)及返回值。 該示例將一條新記錄插入到一個表中,該表中的主鍵列為 SQL Server 數(shù)據(jù)庫中的標識列。
#T#如果您通過 SqlDataAdapter 使用 SQL Server 存儲過程來編輯或刪除數(shù)據(jù),則應(yīng)確保不在存儲過程定義中使用 SET NOCOUNT ON。 這將使返回的受影響的行數(shù)為零,DataAdapter 會將其解釋為并發(fā)沖突。 在這種情況下,將引發(fā) DBConcurrencyException。此示例使用以下存儲過程將一個新類別插入到 Northwind 的“類別”表。 存儲過程獲取 CategoryName 列中的值作為輸入?yún)?shù),并使用 SCOPE_IDENTITY() 函數(shù)來檢索標識字段 CategoryID 的新值,然后在輸出參數(shù)中返回該新值。 RETURN 語句使用 @@ROWCOUNT 函數(shù)返回所插入的行數(shù)。
- CREATE PROCEDURE dbo.InsertCategory
- @CategoryName nvarchar(15),
- @Identity int OUT
- AS
- INSERT INTO Categories (CategoryName) VALUES(@CategoryName)
- SET @Identity = SCOPE_IDENTITY()
- RETURN @@ROWCOUNT
下面的ADO.NET修改數(shù)據(jù)代碼示例使用上面顯示的 InsertCategory 存儲過程作為 SqlDataAdapter 的 InsertCommand 的來源。 如果在將記錄插入到數(shù)據(jù)庫后調(diào)用 SqlDataAdapter 的 Update 方法,DataSet 中將會反映出 @Identity 輸出參數(shù)。 此代碼還會檢索返回值。在使用 OleDbDataAdapter 時,必須在其他參數(shù)之前先使用 ReturnValue 的ParameterDirection 指定參數(shù)。
- Private Sub ReturnIdentity(ByVal connectionString As String)
- Using connection As SqlConnection = New SqlConnection( _
- connectionString)
- ' Create a SqlDataAdapter based on a SELECT query.
- Dim adapter As SqlDataAdapter = New SqlDataAdapter( _
- "SELECT CategoryID, CategoryName FROM dbo.Categories", _
- connection)
- ' Create a SqlCommand to execute the stored procedure.
- adapter.InsertCommand = New SqlCommand("dbo.InsertCategory", _
- connection)
- adapter.InsertCommand.CommandType = CommandType.StoredProcedure
- ' Create a parameter for the ReturnValue.
- Dim parameter As SqlParameter = _
- adapter.InsertCommand.Parameters.Add( _
- "@RowCount", SqlDbType.Int)
- parameter.Direction = ParameterDirection.ReturnValue
- ' Create an input parameter for the CategoryName.
- ' You do not need to specify direction for input parameters.
- adapter.InsertCommand.Parameters.Add( _
- "@CategoryName", SqlDbType.NChar, 15, "CategoryName")
- ' Create an output parameter for the new identity value.
- parameter = adapter.InsertCommand.Parameters.Add( _
- "@Identity", SqlDbType.Int, 0, "CategoryID")
- parameter.Direction = ParameterDirection.Output
- ' Create a DataTable and fill it.
- Dim categories As DataTable = New DataTable
- adapter.Fill(categories)
- ' Add a new row.
- Dim newRow As DataRow = categories.NewRow()
- newRow("CategoryName") = "New Category"
- categories.Rows.Add(newRow)
- ' Update the database.
- adapter.Update(categories)
- ' Retrieve the ReturnValue.
- Dim rowCount As Int32 = _
- CInt(adapter.InsertCommand.Parameters("@RowCount").Value)
- Console.WriteLine("ReturnValue: {0}", rowCount.ToString())
- Console.WriteLine("All Rows:")
- Dim row As DataRow
- For Each row In categories.Rows
- Console.WriteLine("{0}: {1}", row(0), row(1))
- Next
- End Using
- End Sub