C #에서 매개 변수를 사용하여 저장 프로 시저 호출


138

프로그램에서 삭제, 삽입 및 업데이트를 수행 할 수 있으며 데이터베이스에서 생성 된 저장 프로 시저를 호출하여 삽입을 시도합니다.

이 버튼 삽입은 잘 작동합니다.

private void btnAdd_Click(object sender, EventArgs e)
{
        SqlConnection con = new SqlConnection(dc.Con);
        SqlCommand cmd = new SqlCommand("Command String", con);

        da.InsertCommand = new SqlCommand("INSERT INTO tblContacts VALUES (@FirstName, @LastName)", con);
        da.InsertCommand.Parameters.Add("@FirstName", SqlDbType.VarChar).Value = txtFirstName.Text;
        da.InsertCommand.Parameters.Add("@LastName", SqlDbType.VarChar).Value = txtLastName.Text;

        con.Open();
        da.InsertCommand.ExecuteNonQuery();
        con.Close();

        dt.Clear();
        da.Fill(dt);
    } 

sp_Add_contact연락처를 추가하기 위해 명명 된 프로 시저를 호출하는 버튼의 시작입니다 . 의 두 매개 변수입니다 sp_Add_contact(@FirstName,@LastName). 좋은 예를 찾기 위해 Google을 검색했지만 흥미로운 것은 없습니다.

private void button1_Click(object sender, EventArgs e)
{
        SqlConnection con = new SqlConnection(dc.Con);
        SqlCommand cmd = new SqlCommand("Command String", con);
        cmd.CommandType = CommandType.StoredProcedure;

        ???

        con.Open();
        da. ???.ExecuteNonQuery();
        con.Close();

        dt.Clear();
        da.Fill(dt);
    }

8
약간의 정보 만 추가하면 위의 sp_Add_contact와 같이 sp_ 접두어로 응용 프로그램 저장 프로 시저의 이름을 지정해서는 안됩니다. sp_ 접두어는 시스템 저장 프로 시저 명명 규칙으로, SQL에서 볼 때 모든 시스템 저장 프로 시저를 통해 응용 프로그램이나 사용자 공간에 저장된 proc보다 먼저 검색합니다. 성능면에서 응용 프로그램의 성능에 신경 쓰면 sp_ 접두사가 응답 시간을 저하시킵니다.
Robert Achmann 16:25에서

답변:


265

쿼리를 실행하는 것과 거의 같습니다. 원래 코드에서 명령 객체를 작성하여 cmd변수에 넣고 절대 사용하지 마십시오. 그러나 여기서 대신을 사용합니다 da.InsertCommand.

또한 using모든 일회용 물체에 a 를 사용하여 올바르게 폐기하십시오.

private void button1_Click(object sender, EventArgs e) {
  using (SqlConnection con = new SqlConnection(dc.Con)) {
    using (SqlCommand cmd = new SqlCommand("sp_Add_contact", con)) {
      cmd.CommandType = CommandType.StoredProcedure;

      cmd.Parameters.Add("@FirstName", SqlDbType.VarChar).Value = txtFirstName.Text;
      cmd.Parameters.Add("@LastName", SqlDbType.VarChar).Value = txtLastName.Text;

      con.Open();
      cmd.ExecuteNonQuery();
    }
  }
}

7
그러나이 절차가 데이터를 반환하면 C #에서 어떻게 잡을 수 있습니까?
MA9H

8
@ M009 : 그런 다음 ExecuteReader또는 ExecuteScalar을 사용 하여 호출합니다.
Guffa

2
@ M009 : 예, 똑같은 일을하는 또 다른 방법입니다. 데이터 어댑터는를 사용합니다 ExecuteReader.
Guffa

1
@DylanChen : 데이터베이스 설정에 따라 다릅니다. 기본 설정은 식별자가 대소 문자를 구분하지 않는 것입니다.
Guffa

1
@DylanChen : 식별자의 대소 문자 구분 여부를 결정하는 것은 데이터베이스의 데이터 정렬 설정입니다.
Guffa

36

SP를 실행하는 데 필요하므로 매개 변수를 추가해야합니다.

using (SqlConnection con = new SqlConnection(dc.Con))
{
    using (SqlCommand cmd = new SqlCommand("SP_ADD", con))
    {
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@FirstName", txtfirstname.Text);
        cmd.Parameters.AddWithValue("@LastName", txtlastname.Text);
        con.Open();
        cmd.ExecuteNonQuery();
    }            
}

7
AddWithValue는 나쁜 생각입니다. SQL Server는 nvarchar 또는 varchar에 항상 올바른 길이를 사용하지 않으므로 암시 적 변환이 발생합니다. 매개 변수의 길이를 명시 적으로 지정한 다음을 사용하여 값을 별도로 추가하는 것이 parameter.Value = txtfirstname좋습니다.
George Stocker

14

cmd.Parameters.Add(String parameterName, Object value)더 이상 사용되지 않습니다. 대신 사용cmd.Parameters.AddWithValue(String parameterName, Object value)

추가 (문자열 parameterName, 객체 값)가 더 이상 사용되지 않습니다. AddWithValue (String parameterName, Object value) 사용

기능면에서는 차이가 없습니다. 그들이 cmd.Parameters.Add(String parameterName, Object value)선호 하지 않는 이유 AddWithValue(String parameterName, Object value)는 더 명확 해지기 때문입니다. 다음은 동일한 MSDN 참조입니다.

private void button1_Click(object sender, EventArgs e) {
  using (SqlConnection con = new SqlConnection(dc.Con)) {
    using (SqlCommand cmd = new SqlCommand("sp_Add_contact", con)) {
      cmd.CommandType = CommandType.StoredProcedure;

      cmd.Parameters.AddWithValue("@FirstName", SqlDbType.VarChar).Value = txtFirstName.Text;
      cmd.Parameters.AddWithValue("@LastName", SqlDbType.VarChar).Value = txtLastName.Text;

      con.Open();
      cmd.ExecuteNonQuery();
    }
  }
}

2
cmd.Parameters.Add더 이상 사용되지 않는 소유권 주장에 대한 링크 나 출처 가 있습니까?
David

7
@TonyG : 사실이 아닙니다. 허용 된 답변은 선호하는 과부하를 사용하며 Add그중 더 이상 사용되지 않습니다. AddWithValue매개 변수 값에서 매개 변수 유형을 유추하기 때문에 가장 좋은 방법은 아닙니다. 이로 인해 실행 계획이 잘못되거나 변환이 잘못 될 수 있습니다. 또한 첫 번째 장소에서 매개 변수의 유효성을 검사하지 않습니다 (fe 유형 인 경우 Datetimea를 전달하십시오 String). 당신은 볼 수 여기 것만 Add소요되는 Object두 번째 인수로는 사용되지 않습니다.
Tim Schmelter

2
AddWithValue보다는 그냥 같은 기능이 Add과를 Object하지만 선호하는 방법이 아니다. 둘 다 유형을 유추해야합니다.
Tim Schmelter

2
당신은 절대적으로 맞습니다, @TimSchmelter. 글을 읽지 못했습니다. 수정 해 주셔서 감사합니다. Add ()를 사용할 새로운 코드를 작성하고 있습니다. 그리고 Rahul Nikate가 나처럼 실수 했으므로이 답변에 대한 공감대를 공감대로 바꿀 것입니다.
TonyG

2
@TimSchmelter 조언 해 주셔서 감사합니다. 내 답변을 편집했습니다.
Rahul Nikate

3

대안으로, 나는 procs로 쉽게 작업 할 수있는 라이브러리를 가지고 있습니다 : https://www.nuget.org/packages/SprocMapper/

SqlServerAccess sqlAccess = new SqlServerAccess("your connection string");
    sqlAccess.Procedure()
         .AddSqlParameter("@FirstName", SqlDbType.VarChar, txtFirstName.Text)
         .AddSqlParameter("@FirstName", SqlDbType.VarChar, txtLastName.Text)
         .ExecuteNonQuery("StoredProcedureName");

0
public void myfunction(){
        try
        {
            sqlcon.Open();
            SqlCommand cmd = new SqlCommand("sp_laba", sqlcon);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.ExecuteNonQuery();
        }
        catch(Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
        finally
        {
            sqlcon.Close();
        }
}

0

.NET 데이터 공급자는 데이터 소스에 연결하고 명령을 실행하며 레코드 세트를 반환하는 데 사용되는 많은 클래스로 구성됩니다. ADO.NET의 명령 개체는 다양한 방식으로 SQL 쿼리를 수행하는 데 사용할 수있는 많은 Execute 메서드를 제공합니다.

저장 프로시 저는 하나 이상의 SQL 문이 포함 된 사전 컴파일 된 실행 가능 개체입니다. 대부분의 경우 저장 프로시 저는 입력 매개 변수를 수락하고 여러 값을 반환합니다. 스토어드 프로 시저가이를 승인하도록 작성된 경우 매개 변수 값을 제공 할 수 있습니다. 입력 매개 변수를 승인하는 샘플 저장 프로시 저는 다음과 같습니다.

  CREATE PROCEDURE SPCOUNTRY
  @COUNTRY VARCHAR(20)
  AS
  SELECT PUB_NAME FROM publishers WHERE COUNTRY = @COUNTRY
  GO

위의 저장 프로시 저는 국가 이름 (@COUNTRY VARCHAR (20))을 매개 변수로 사용하고 입력 국가에서 모든 게시자를 반환합니다. CommandType이 StoredProcedure로 설정되면 Parameters 컬렉션을 사용하여 매개 변수를 정의 할 수 있습니다.

  command.CommandType = CommandType.StoredProcedure;
  param = new SqlParameter("@COUNTRY", "Germany");
  param.Direction = ParameterDirection.Input;
  param.DbType = DbType.String;
  command.Parameters.Add(param);

위 코드는 국가 매개 변수를 C # 응용 프로그램에서 저장 프로 시저로 전달합니다.

using System;
using System.Data;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string connetionString = null;
            SqlConnection connection ;
            SqlDataAdapter adapter ;
            SqlCommand command = new SqlCommand();
            SqlParameter param ;
            DataSet ds = new DataSet();

            int i = 0;

            connetionString = "Data Source=servername;Initial Catalog=PUBS;User ID=sa;Password=yourpassword";
            connection = new SqlConnection(connetionString);

            connection.Open();
            command.Connection = connection;
            command.CommandType = CommandType.StoredProcedure;
            command.CommandText = "SPCOUNTRY";

            param = new SqlParameter("@COUNTRY", "Germany");
            param.Direction = ParameterDirection.Input;
            param.DbType = DbType.String;
            command.Parameters.Add(param);

            adapter = new SqlDataAdapter(command);
            adapter.Fill(ds);

            for (i = 0; i <= ds.Tables[0].Rows.Count - 1; i++)
            {
                MessageBox.Show (ds.Tables[0].Rows[i][0].ToString ());
            }

            connection.Close();
        }
    }
}

당신의 대답은 사용하지 않는 사용 하는 것이 좋습니다 블록. 또한 예외를 처리하기 위해 try catch 블록이 있어야합니다.
17 분 42 초에 종료
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.