使用存储过程修改数据 (ADO.NET)
更新:November 2007
存储过程可以接受数据作为输入参数并可以返回数据作为输出参数、结果集或返回值。 下面的示例演示 ADO.NET 如何发送和接收输入参数、输出参数及返回值。 该示例将一条新记录插入到一个表中,该表中的主键列为 SQL Server 数据库中的标识列。
说明: |
---|
如果您通过 SqlDataAdapter 使用 SQL Server 存储过程来编辑或删除数据,则应确保不在存储过程定义中使用 SET NOCOUNT ON。 这将使返回的受影响的行数为零,DataAdapter 会将其解释为并发冲突。 在这种情况下,将引发 DBConcurrencyException。 |
此示例使用以下存储过程将一个新类别插入到 Northwind 的“类别”表。 存储过程获取 CategoryName 列中的值作为输入参数,并使用 SCOPE_IDENTITY() 函数来检索标识字段 CategoryID 的新值,然后在输出参数中返回该新值。 RETURN 语句使用 @@ROWCOUNT 函数返回所插入的行数。
CREATE PROCEDURE dbo.InsertCategory @CategoryName nvarchar(15), @Identity int OUT AS INSERT INTO Categories (CategoryName) VALUES(@CategoryName) SET @Identity = SCOPE_IDENTITY() RETURN @@ROWCOUNT
下面的代码示例使用上面显示的 InsertCategory 存储过程作为 SqlDataAdapter 的 InsertCommand 的来源。 如果在将记录插入到数据库后调用SqlDataAdapter 的 Update 方法,DataSet 中将会反映出 @Identity 输出参数。 此代码还会检索返回值。
说明: |
---|
在使用 OleDbDataAdapter 时,必须在其他参数之前先使用 ReturnValue 的 ParameterDirection 指定参数。 |
private static void ReturnIdentity(string connectionString) { using (SqlConnection connection = new SqlConnection(connectionString)) { // Create a SqlDataAdapter based on a SELECT query. SqlDataAdapter adapter = new SqlDataAdapter( "SELECT CategoryID, CategoryName FROM dbo.Categories", connection); // Create a SqlCommand to execute the stored procedure. adapter.InsertCommand = new SqlCommand("InsertCategory", connection); adapter.InsertCommand.CommandType = CommandType.StoredProcedure; // Create a parameter for the ReturnValue. SqlParameter parameter = 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. DataTable categories = new DataTable(); adapter.Fill(categories); // Add a new row. DataRow categoryRow = categories.NewRow(); categoryRow["CategoryName"] = "New Beverages"; categories.Rows.Add(categoryRow); // Update the database. adapter.Update(categories); // Retrieve the ReturnValue. Int32 rowCount = (Int32)adapter.InsertCommand.Parameters["@RowCount"].Value; Console.WriteLine("ReturnValue: {0}", rowCount.ToString()); Console.WriteLine("All Rows:"); foreach (DataRow row in categories.Rows) { { Console.WriteLine(" {0}: {1}", row[0], row[1]); } } } }