Return Procedure (C#)

using System;
using System.Data;
using System.Data.OleDb;
using System.Data.SqlClient;


namespace DataReader
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
string strConn="Provider=SQLOLEDB;User ID=sa;Password=password;Initial Catalog=byVins;Data Source=211.236.186.207;";
OleDbConnection Cn = new OleDbConnection(strConn);
Cn.Open();

OleDbCommand cmd = Cn.CreateCommand();

cmd.CommandText="{?=Call GetPdsBoard(?,?,?,?)}";
/// 이런 종류의 프로시저 실행문은 Parameters컬렉션을 차례로 나열하는것이 중요하다.
/// 만일 아래 5개의 변수열의 순서가 바뀌면...예외오류를 Throw 하게 된다..
/// 예) cmd.Parameters.Add("@FormTypeID",OleDbType.Integer);
/// cmd.Parameters.Add("@RetVal",OleDbType.Integer);
/// 위의 FormTypeID, RetVal 의 순서가 바뀌면..{?=Call GetPdsBoard(?,?,?,?)} 이부분의
/// 첫번째 물음표에 @FormTypeID가 대입되고 두번째는 @RetVal에 대입된다.해서 에러가 발생하는 것이다.

cmd.Parameters.Add("@RetVal",OleDbType.Integer);
cmd.Parameters.Add("@FormTypeID",OleDbType.Integer);
cmd.Parameters.Add("@Name",OleDbType.VarWChar,20);
cmd.Parameters.Add("@Title",OleDbType.VarWChar,30);
cmd.Parameters.Add("@Email",OleDbType.VarWChar, 50);

cmd.Parameters["@RetVal"].Direction = ParameterDirection.ReturnValue;
cmd.Parameters["@FormTypeID"].Value= 1;
cmd.Parameters["@Name"].Direction = ParameterDirection.Output;
cmd.Parameters["@Title"].Direction = ParameterDirection.Output;
cmd.Parameters["@Email"].Direction = ParameterDirection.Output;

cmd.ExecuteNonQuery();


if(Convert.ToInt32(cmd.Parameters["@RetVal"].Value) == 0)
{
Console.WriteLine("이름 : " + cmd.Parameters["@Name"].Value);
Console.WriteLine("제목 : " + cmd.Parameters["@Title"].Value);
Console.WriteLine("메일 : " + cmd.Parameters["@Email"].Value);
}
else if(Convert.ToInt32(cmd.Parameters["@RetVal"].Value)==4207)
{
Console.WriteLine("네트워크 오류입니다.\n잠시후 다시 시도해 주세요.");
}
else
{
Console.WriteLine("결과 없음");
}
}
}
}