저장 프로시저를 이용할 때 리턴되는 값은 크게 리턴(Return)과 셀랙트(Select)로 나눌 수 있습니다.
리턴은 int형만 가능하고 일반적으로 프로시저에 대한 응답(로그인 중이라면 로그인이 안 된 이유 같은 것들)용으로 많이 사용합니다.
셀랙트는 말 그대로 데이터(테이블)를 리턴하는 것이고요.
리턴과 셀랙트를 구분 안 하는 경우도 있습니다만
구분해서 쓰면 처리하기도 편해지고 코드도 일관성 있어저서 좋습니다.
--Return과 Select를 구분한 경우
Select 1
Return 2
--결과
--Select : 1
--Return : 2
--Return과 Select를 구분하지 않은 경우
Select 1
Return
--결과
--Select : 1
--Return : null
일반적인경우 셀랙트를 사용하기 전 조건을 검사해야 한다면 저장 프로시저를 하나 더 만드는 것이 맞습니다.
하지만 편의상 두 개를 붙여 쓸 때도 있죠 ㅎㅎ;
그렇다면 문제가 C#에서는 Return 값을 어떻게 가지고 오지?
셀랙트야 맨날 하는 내용이니 그렇다 치지만 리턴은 해본 적이 없죠 ㅎㅎㅎ
일반적으로 C#에서 저장 프로시저를 호출할 때는 다음과 같이 합니다.
//커낵션은 스스로 생성합시다 ㅎㅎㅎ
//데이터요청 프로시저
SqlCommand m_msComm = new SqlCommand("procTest", m_msConn);
m_msComm.CommandType = CommandType.StoredProcedure;
//파라메타 지정
m_msComm.Parameters.Add("@sData", SqlDbType.VarChar).Value = "데이터";
m_msConn.Open();
//m_msComm.ExecuteReader();
//m_msComm.ExecuteScalar();
m_msComm.ExecuteNonQuery();
m_msConn.Close();
리턴값을 받고 싶으시다면 리턴을 받을 파라매타를 지정해 주시면 됩니다.
//커낵션은 스스로 생성합시다 ㅎㅎㅎ
//데이터요청 프로시저
m_msComm = new SqlCommand("procTest", m_msConn);
m_msComm.CommandType = CommandType.StoredProcedure;
//파라메타 지정
m_msComm.Parameters.Add("@sUserID", SqlDbType.VarChar).Value = "데이터";
//리턴용 파라메타 지정
m_msComm.Parameters.Add("@nReturn", SqlDbType.VarChar).Direction = ParameterDirection.ReturnValue;
m_msConn.Open();
//m_msComm.ExecuteReader();
//m_msComm.ExecuteScalar();
m_msComm.ExecuteNonQuery();
Label1.Text = m_msComm.Parameters["@nReturn"].Value.ToString();
m_msConn.Close();
알고 보니 참 쉽죠잉?
이 방법은 아웃풋(output)과는 다릅니다.
아웃풋은 C++로 따지면 포인터 변수 같은 것이죠.
그러면 둘 다 받아 올 수는 없느냐?
같은 방법을 이용하여 둘 다 받아올 수도 있습니다.
//전체데이터를 받아올 데이터테이블
DataTable dtData = new DataTable();
//데이터요청 프로시저
msComm = new SqlCommand("procTest", msConn);
msComm.CommandType = CommandType.StoredProcedure;
//파라메타 지정
m_msComm.Parameters.Add("@sUserID", SqlDbType.VarChar).Value = "데이터";
//리턴용 파라메타 지정
m_msComm.Parameters.Add("@nReturn", SqlDbType.VarChar).Direction = ParameterDirection.ReturnValue;
//아답터 생성
msAdapter = new SqlDataAdapter(msComm);
//데이터 테이블 체우기
msAdapter.Fill(dtData);
//리턴값 받아오기
int nResult = Convert.ToInt32( msComm.Parameters["@nReturn"].Value);
이렇게 하면 'dtData'에는 셀랙트값이, 'nResult'에는 리턴값이 들어가게 됩니다.
알고 보면 정말 별거 없습니다 ㅎㅎㅎ