저장 프로시저를 사용하여 데이터 수정Modify data with stored procedures

적용 대상: .NET Framework .NET Core .NET Standard

ADO.NET 다운로드

저장 프로시저는 입력 매개 변수로 데이터를 받아들이고 출력 매개 변수, 결과 집합 또는 반환 값으로 데이터를 반환할 수 있습니다.Stored procedures can accept data as input parameters and can return data as output parameters, result sets, or return values. 아래 예제는 Microsoft SqlClient Data Provider for SQL Server가 입력 매개 변수, 출력 매개 변수 및 반환 값을 보내고 받는 방법을 보여 줍니다.The sample below illustrates how Microsoft SqlClient Data Provider for SQL Server sends and receives input parameters, output parameters, and return values. 이 예제에서는 기본 키 열이 ID 열인 테이블에 새 레코드를 삽입합니다.The example inserts a new record into a table where the primary key column is an identity column.

注意

SqlDataAdapter를 사용하여 데이터를 편집하거나 삭제하기 위해 저장 프로시저를 사용하는 경우 저장 프로시저 정의에서 SET NOCOUNT ON 을 사용하지 않아야 합니다.If you are using stored procedures to edit or delete data using a SqlDataAdapter, make sure that you do not use SET NOCOUNT ON in the stored procedure definition. 사용할 경우에는 영향을 받는 행 수가 0으로 반환되어 DataAdapter가 동시성 충돌로 해석됩니다.This causes the rows affected count returned to be zero, which the DataAdapter interprets as a concurrency conflict. 이 경우 DBConcurrencyException이 throw됩니다.In this event, a DBConcurrencyException will be thrown.

예제Example

이 예제는 다음 저장 프로시저를 사용하여 Northwind Categories 테이블에 새 범주를 삽입합니다.The sample uses the following stored procedure to insert a new category into the Northwind Categories table. 저장 프로시저는 CategoryName 열의 값을 입력 매개 변수로 받아 SCOPE_IDENTITY() 함수를 사용하여 ID 필드인 CategoryID 의 새 값을 검색한 다음 이를 출력 매개 변수로 반환합니다.The stored procedure takes the value in the CategoryName column as an input parameter and uses the SCOPE_IDENTITY() function to retrieve the new value of the identity field, CategoryID, and return it in an output parameter. RETURN 문은 @@ROWCOUNT 함수를 사용하여 삽입된 행의 수를 반환합니다.The RETURN statement uses the @@ROWCOUNT function to return the number of rows inserted.

CREATE PROCEDURE dbo.InsertCategory  
  @CategoryName nvarchar(15),  
  @Identity int OUT  
AS  
INSERT INTO Categories (CategoryName) VALUES(@CategoryName)  
SET @Identity = SCOPE_IDENTITY()  
RETURN @@ROWCOUNT  

다음 코드 예제에서는 위의 InsertCategory 저장 프로시저를 InsertCommandSqlDataAdapter에 대한 소스로 사용합니다.The following code example uses the InsertCategory stored procedure shown above as the source for the InsertCommand of the SqlDataAdapter. @IdentityDataSet 메서드를 호출하면 데이터베이스에 레코드가 삽입된 후 Update 출력 매개 변수가 SqlDataAdapter에 반영됩니다.The @Identity output parameter will be reflected in the DataSet after the record has been inserted into the database when the Update method of the SqlDataAdapter is called. 이 코드는 반환 값도 검색합니다.The code also retrieves the return value.

using System;
using System.Data;
using Microsoft.Data.SqlClient;

class Program
{
    static void Main()
    {
        string connectionString = GetConnectionString();
        ReturnIdentity(connectionString);
        // Console.ReadLine();
    }

    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.
            Int rowCount = (Int)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]);
            }
        }
    }

    static private string GetConnectionString()
    {
        // To avoid storing the connection string in your code,
        // you can retrieve it from a configuration file.
        return "Data Source=(local);Initial Catalog=Northwind;Integrated Security=true";
    }
}

참조See also