ADO.NET修改数据巧妙运用存储过程实现
创始人
2024-06-11 15:00:25
0

学习ADO.NET时,你可能会遇到ADO.NET修改数据问题,这里将介绍ADO.NET修改数据问题的解决方法,在这里拿出来和大家分享一下。存储过程可以接受数据作为输入参数并可以返回数据作为输出参数、结果集或返回值。 下面的示例演示 ADO.NET 如何发送和接收输入参数、输出参数及返回值。 该示例将一条新记录插入到一个表中,该表中的主键列为 SQL Server 数据库中的标识列。

#T#如果您通过 SqlDataAdapter 使用 SQL Server 存储过程来编辑或删除数据,则应确保不在存储过程定义中使用 SET NOCOUNT ON。 这将使返回的受影响的行数为零,DataAdapter 会将其解释为并发冲突。 在这种情况下,将引发 DBConcurrencyException。此示例使用以下存储过程将一个新类别插入到 Northwind 的“类别”表。 存储过程获取 CategoryName 列中的值作为输入参数,并使用 SCOPE_IDENTITY() 函数来检索标识字段 CategoryID 的新值,然后在输出参数中返回该新值。 RETURN 语句使用 @@ROWCOUNT 函数返回所插入的行数。

  1. CREATE PROCEDURE dbo.InsertCategory  
  2. @CategoryName nvarchar(15),  
  3. @Identity int OUT  
  4. AS  
  5. INSERT INTO Categories (CategoryName) VALUES(@CategoryName)  
  6. SET @Identity = SCOPE_IDENTITY()  
  7. RETURN @@ROWCOUNT 

下面的ADO.NET修改数据代码示例使用上面显示的 InsertCategory 存储过程作为 SqlDataAdapter 的 InsertCommand 的来源。 如果在将记录插入到数据库后调用 SqlDataAdapter 的 Update 方法,DataSet 中将会反映出 @Identity 输出参数。 此代码还会检索返回值。在使用 OleDbDataAdapter 时,必须在其他参数之前先使用 ReturnValue 的ParameterDirection 指定参数。

  1. Private Sub ReturnIdentity(ByVal connectionString As String)  
  2. Using connection As SqlConnection = New SqlConnection( _  
  3.  connectionString)  
  4.  
  5. ' Create a SqlDataAdapter based on a SELECT query.  
  6. Dim adapter As SqlDataAdapter = New SqlDataAdapter( _  
  7.  "SELECT CategoryID, CategoryName FROM dbo.Categories", _  
  8.  connection)  
  9.  
  10. ' Create a SqlCommand to execute the stored procedure.   
  11. adapter.InsertCommand = New SqlCommand("dbo.InsertCategory", _  
  12.  connection)  
  13. adapter.InsertCommand.CommandType = CommandType.StoredProcedure  
  14.  
  15. ' Create a parameter for the ReturnValue.  
  16. Dim parameter As SqlParameter = _ 
  17.  adapter.InsertCommand.Parameters.Add( _  
  18. "@RowCount", SqlDbType.Int)  
  19. parameter.Direction = ParameterDirection.ReturnValue  
  20.  
  21. ' Create an input parameter for the CategoryName.  
  22. ' You do not need to specify direction for input parameters.  
  23. adapter.InsertCommand.Parameters.Add( _  
  24. "@CategoryName", SqlDbType.NChar, 15, "CategoryName")  
  25.  
  26. ' Create an output parameter for the new identity value.  
  27. parameter = adapter.InsertCommand.Parameters.Add( _  
  28. "@Identity", SqlDbType.Int, 0, "CategoryID")  
  29. parameter.Direction = ParameterDirection.Output  
  30.  
  31. ' Create a DataTable and fill it.  
  32. Dim categories As DataTable = New DataTable  
  33. adapter.Fill(categories)  
  34.  
  35. ' Add a new row.  
  36. Dim newRow As DataRow = categories.NewRow()  
  37. newRow("CategoryName") = "New Category"  
  38. categories.Rows.Add(newRow)  
  39.  
  40. ' Update the database.  
  41. adapter.Update(categories)  
  42.  
  43. ' Retrieve the ReturnValue.  
  44. Dim rowCount As Int32 = _ 
  45.  CInt(adapter.InsertCommand.Parameters("@RowCount").Value)  
  46.  
  47. Console.WriteLine("ReturnValue: {0}", rowCount.ToString())  
  48. Console.WriteLine("All Rows:")  
  49. Dim row As DataRow  
  50. For Each row In categories.Rows  
  51. Console.WriteLine("{0}: {1}", row(0), row(1))  
  52. Next  
  53. End Using  
  54. End Sub  

 

 

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...