本文以SQL Server2000例
一、在JSP(JSTL)中使用存儲過程:
1、Java中存儲過程的標準使用方法:
可實現存儲過程中的各種功能,和最簡方法相比,它可以得到out參數和過程返回值。 ?就是參數的佔位符,一個問號代表有一個參數
。
String proc = “{call procname (?,? )}”;
CallableStatement stat = con.prepareCall(proc);
//第一個參數為in的話,說明?號應為英文輸入法下的,這個博客不能輸入英文的問號。
stat.setString(1,’paravalue’);//設置參數值
//第二個參數作out的話
stat.registerOutParameter(1,java.sql.Types.VARCHAR);//設置參數類型
stat.execute();
String paraValue = stat.getString(2);//得到out參數值
例如:
<%@page import=“java.sql.*”%>
<%@page import=“java.text.*”%>
<%@page contentType=“text/html;charset=GB2312”%>
<%@include file=“opendata.jsp”%>
<%
String strSQL = “{call pdrivertotal( , )}”;
CallableStatement stmt = con.prepareCall(strSQL);
stmt.setString(1,“2005-08-20”);
stmt.setString(2,“2005-10-01”);
stmt.execute();
%>
2、存儲過程的最簡寫法:
思路:將過程當作普通的sql語句去執行,也就是和查詢、更新的寫法是一樣。可實現執行過程並且得到相關的數據集,但它不能得到
過程的out輸出參數,開發中90%的情況下皆適用。
String proc = “exec過程名”+參數1+“,”+參數2;
Statement stat = con.createStatement();
ResultSet rs = stat.executeQuery(proc);
例如:
//在JSP中使用
<%
Statement stat = con.createStatement();
ResultSet rs = stat.executeQuery(“zyfproc 20 ’姓名’”);
//zyfproc為存儲過程名20為int型參數,姓名為varchar類參數
%>
//在使用了jstl標籤的jsp中使用
<!–執行存儲過程–>
<sql:update var=“proc” sql=“exec jproc ?,?” dataSource=“${ds}”>
<!–說明?號應為英文輸入法下的,這個博客不能輸入英文的問號。 –>
<sql:param value=“${param.hid}”/>
<sql:param value=“${param.sid}”/>
</sql:update>
二、在asp.net(C#)中,使用存儲過程:
1 C#中存儲過程的使用標準版
private void sql_proc()
{
SqlConnection conn=new SqlConnection(“server=.;uid=sa;pwd=1234;database=china”);
string sql=“proc_out”;
SqlCommand comm=new SqlCommand(sql,conn);
//把Command執行類型改為存儲過程方式,默認為Text。
comm.CommandType=CommandType.StoredProcedure;
//傳遞一個輸入參數,需賦值
SqlParameter sp=comm.Parameters.Add(“@uid”,SqlDbType.Int);
sp.Value=10;
//定義一個輸出參數,不需賦值。 Direction用來描述參數的類型
//Direction默認為輸入參數,還有輸出參數和返回值型。
sp=comm.Parameters.Add(“@output”,SqlDbType.VarChar,50);
sp.Direction=ParameterDirection.Output;
//定義過程的返回值參數,過程執行完之後,將把過程的返回值賦值給名為myreturn的Paremeters賦值。
sp=comm.Parameters.Add(“myreturn”,SqlDbType.Int);
sp.Direction=ParameterDirection.ReturnValue;
//使用SqlDataAdapter將自動完成數據庫的打開和關閉過程,並執行相應t-sql語句或存儲過程
//如果存儲過程只是執行相關操作,如級聯刪除或更新,使用SqlCommand的execute方法即可。
SqlDataAdapter da=new SqlDataAdapter(comm);
DataSet ds=new DataSet();
da.Fill(ds);
//在執行完存儲過程之後,可得到輸出參數
string myout=comm.Parameters[“@output”].Value.ToString();
//打印輸出參數:
Response.Write(“打印輸出參數:”+myout);
//打印存儲過程返回值
myout=comm.Parameters[“myreturn”].Value.ToString();
Response.Write(“存儲過程返回值:”+myout);
this.DataGrid1.DataSource=ds;
this.DataGrid1.DataBind();
}
2存儲過程的使用最簡版:
private void sql_jyh()
{
//最簡寫法,把存儲過程當作t-sql語句來使用,語法為:exec過程名參數
SqlConnection conn=new SqlConnection(“server=.;uid=sa;pwd=1234;database=china”);
string sql=“execute proc_out 10,’12’”;
SqlCommand comm=new SqlCommand(sql,conn);
//使用SqlDataAdapter將自動完成數據庫的打開和關閉過程,並執行相應t-sql語句或存儲過程
//如果存儲過程只是執行相關操作,如級聯刪除或更新,使用SqlCommand的execute方法即可。
SqlDataAdapter da=new SqlDataAdapter(comm);
DataSet ds=new DataSet();
da.Fill(ds);
//綁定數據
this.DataGrid1.DataSource=ds;
this.DataGrid1.DataBind();
}
總結,對於SQLServer庫而言,無論用什麼語言,都可以這樣來使用,即當作普通查詢語句。
string sql=“execute proc_out 10,’12’”;
把這個sql作為參數,在java或者C#中均能得到正確的執行。這也是使用存儲過程的最簡方法。