存储过程和执行普通sql语句很类似,也是可以用SqlCommand及其他多种方式来实现,这里说SqlCommand的方式,
和执行sql方式不同的是设定CmdObj.CommandType = CommandType.StoredProcedure;告诉编译器是执行的存储过程.
怎么输入输出?输入和输出都是使用参数方式,
用CmdObj.Parameters.Add("@chapterTotal", SqlDbType.Int).Direction = ParameterDirection.Output;告诉编译器,@chapterTotal这个参数是输出参数,
输入参数赋值,和获取输出参数见例子.
获取输出结果有2方式,
//从连接池中取出一个连接,只要"连接字符串"是相同的,就是从相同的连接池中取连接
SqlConnection myConn = new SqlConnection(application["connString"].ToString());
//建立sql命令对象
SqlCommand CmdObj = new SqlCommand("chapterList", myConn);
//存储过程名 连接
CmdObj.CommandType = CommandType.StoredProcedure;//表明执行的内容是存储过程
CmdObj.Parameters.Add("@bookID", SqlDbType.Int).Value =bookID;//添加输入参数,并赋值
CmdObj.Parameters.Add("@bookID1", SqlDbType.Int).Value =44;
CmdObj.Parameters.Add("@chapterTotal", SqlDbType.Int).Direction = ParameterDirection.Output;
//添加参数,并表明是个输出参数
//打开连接
myConn.Open();
//获得结果,用SqlDataReader方式,既可以以行集方式获取结果,也可以获取单值或值集,但不知道是否可以同时获取行集和单值
SqlDataReader sqlReader = null;
sqlReader = CmdObj.ExecuteReader();
if(sqlReader.Read())
{
chapterTotal = sqlReader.GetInt16(0);
}
//获得结果,直接用SqlCommand方式
CmdObj.ExecuteNonQuery();
// chapterTotal = Convert.ToInt32(CmdObj.Parameters["@chapterTotal"].Value);
注意事项:
1,命令参数的名字必须要和存储过程中定义的名字完全一致.
2.使用SqlDataReader方式返回结果时,存储过程中的sql语句不能是返回的值直接赋给输出参数的形式,不然
sqlReader.Read()根本不会成功,如SELECT @ChapterTotal=ChapterTotal FROM BookIndex就不行,
SELECT ChapterTotal FROM BookIndex执行用sqlReader.Read()就可以获得
存储过程可以同时返回多个输出参数和多个不同列数的行集,其间要使用union all,
详见http://community.youkuaiyun.com/Expert/TopicView3.asp?id=5680198