調(diào)用sql server的存儲(chǔ)過程 需要一定的格式,這就像學(xué)刀法,格式就是刀譜,而對(duì)程序語言的理解就是心法,編程序不能只靠刀譜,每次編程都是從例子上拷貝粘貼,也不能只靠心法,否則語法混亂。這是一點(diǎn)編程的理解。
1,首先,需要?jiǎng)?chuàng)建一個(gè)存儲(chǔ)過程,例子如下
create PROCEDURE dbo.ProcessMeetRec_SingleRec
@a int,
@b int output,
@c varchar(5) output
as
if @a = 1
begin
select @c = 'a'
select @b = 9
return -1
end
if @b = 3
begin
select @c = 'b'
return -2
end
begin tran
insert book_user(logname) values('aaa')
if @@error <> 0
begin
--插入簽到記錄失敗
raiserror ('插入簽到記錄失敗',16,1) with seterror
rollback tran
return -9
end
return 1
注意,@b可以作為輸入輸出參數(shù),@a是輸入?yún)?shù),@c是輸出參數(shù)
2 ,定義一個(gè)調(diào)用存儲(chǔ)過程的方法
public bool ProcessMeetRec_SingleRec(int a,ref int b,ref string c)
{
if (!CheckConn())
{
return false;
}
try
{
SqlCommand cmd = new SqlCommand("ProcessMeetRec_SingleRec", _cn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new SqlParameter("@a", SqlDbType.Int));
cmd.Parameters["@a"].Value = a;
cmd.Parameters.Add(new SqlParameter("@b", SqlDbType.Int));
cmd.Parameters["@b"].Direction = ParameterDirection.InputOutput;
cmd.Parameters["@b"].Value = 6;
cmd.Parameters.Add(new SqlParameter("@c", SqlDbType.VarChar, 20));
cmd.Parameters["@c"].Direction = ParameterDirection.Output;
//存儲(chǔ)過程返回值
cmd.Parameters.Add(new SqlParameter("@d", SqlDbType.Int));
cmd.Parameters["@d"].Direction = ParameterDirection.ReturnValue;
cmd.ExecuteNonQuery();
int iRet = (int)cmd.Parameters["@d"].Value;
b = (int)cmd.Parameters["@b"].Value;
c = cmd.Parameters["@c"].Value.ToString();
//返回值-1時(shí)失敗 0成功但記錄無效 1成功記錄有效
if (iRet == -1)
return false;
else
return true;
}
catch (Exception ex)
{
string e = ex.Message;
MessageBox.Show(ex.Message, "");
return false;
}
}
注意,其中把@b作為輸入輸出參數(shù),并且一定要賦值,否則會(huì)出錯(cuò)。其中的參數(shù)@d并沒有在存儲(chǔ)過程中定義,它表示存儲(chǔ)過程中return 語句返回的值。這堆程序開始要記的,對(duì)于記性差的人來說,很是郁悶,但寫多了,慢慢會(huì)記住,仔細(xì)看就行,不用刻意死記硬背。
另外,當(dāng)調(diào)用出錯(cuò)時(shí),比如insert book_user(logname) values('aaa')這句出錯(cuò)的話,存儲(chǔ)過程的 raiserror ('插入簽到記錄失敗',16,1) with seterror 這句會(huì)發(fā)生作用,'插入簽到記錄失敗'這句話會(huì)出現(xiàn)在ex.Message中。
2,在一個(gè)按鈕事件中編程如下
private void btnUse_Click(object sender, EventArgs e)
{
int a =8;
int b = 0;
string c = "";
this.ProcessMeetRec_SingleRec(a, ref b, ref c);
}
注意,因?yàn)锧b是輸入輸出參數(shù),@c是輸出參數(shù),所以要使用ref。