저장 프로시저를 이용할 때 리턴되는 값은 크게 리턴(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'에는 리턴값이 들어가게 됩니다.
알고 보면 정말 별거 없습니다 ㅎㅎㅎ