討論區快速選單
知識庫快速選單
討論區最近新進100則主題 最紅的App開發語言:Kotlin
[ 回上頁 ] [ 討論區發言規則 ]
如何傳入參數執行預儲程序並擷取傳回的值?
更改我的閱讀文章字型大小
作者 : jimshih(Juice)
[ 貼文 9 | 人氣 919 | 評價 0 | 評價/貼文 0 | 送出評價 1 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/10/6 下午 12:12:54
各位大大好, 小弟是個ADO新手
有爬過相關的文, 但還是找不到個正確的寫法

我的寫法如下:
using (SqlConnection cn = new SqlConnection(ConfigurationSettings.AppSettings["ConnStr"].ToString()))
{
     SqlCommand sqlcmd = cn.CreateCommand();
     sqlcmd.CommandText = "Exec Insert_MsgData @MsgTxt";
     SqlParameter[] _params = null;

     _params = new SqlParameter[2];
     _params[0] = new SqlParameter("@MsgTxt", SqlDbType.Text);
     _params[1] = new SqlParameter("@MsgID", SqlDbType.Int);
     _params[1].Direction = ParameterDirection.ReturnValue;

     _params[0].Value = System.Web.HttpUtility.HtmlEncode(MsgTxt);
     cn.Open();
}

之後我就不曉得要怎寫了 :(
我這樣寫之後遇到幾個問題
1. 我要如何把 SqlParameter 參數陣列掛在 sqlcmd 下以讓參數傳入?
2. 我該如何取得由預儲程序中取得傳回值? (傳回的值會是插入的主鍵值)

已經查了一天了(昨天下午查到今天下午), MSDN文件也翻了, google 也查了
還是不會寫啊~~ (泣...)

沒辦法, 只好上來請教求教了
謝謝大家~

作者 : regionbbs(小朱)技術副站長 VB.Net曠世奇才SQL Server 7/2K卓越專家.Net Framework優秀好手C#曠世奇才ASP.Net一代宗師ADO.Net卓越專家貼文超過6000則人氣指數超過70000點
[ 貼文 6372 | 人氣 82299 | 評價 36440 | 評價/貼文 5.72 | 送出評價 59 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人jimshih註記此篇回應為最佳解答 2009/10/6 下午 08:53:54
我不知道你 stored procedure 長怎樣,依你寫的程式碼,可能是:

CREATE PROC Insert_MsgData
(
    @MsgTxt nvarchar(1000)
)
AS
BEGIN
...
    RETURN @msgID
END

若是上列的程序,那你的呼叫就是:

using (SqlConnection cn = new SqlConnection("..."))
{
     SqlCommand cmd = new SqlCommand(cn);
     cmd.CommandText = "Insert_MsgData";
     cmd.CommandType = CommandType.StoredProcedure;

     SqlParameter param = new SqlParameter();
     param.Name = "@MsgTxt";
     param.Value = MsgTxt;
     cmd.Parameters.Add(param);
    
     param = new SqlParameter();
     param.Name = "@ret";
     param.Direction = ParameterDirection.ReturnValue;
     param.Value = DBNull.Value;
     cmd.Parameters.Add(param);

     cn.Open();
     cmd.ExecuteNonQuery();
     cn.Close();

     object retValue = cmd.Parameters["@ret"].Value;
}
作者 : jimshih(Juice)
[ 貼文 9 | 人氣 919 | 評價 0 | 評價/貼文 0 | 送出評價 1 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/10/7 上午 11:34:35
哇~! 太感謝了~ 版主我愛你~~ >//////< (不過我是男的喔.. XD)
我早上在測試你給的寫法, 後來把程式稍微改了一下
因為我用的是.NET 3.5 版, 版主的寫法似乎不是 3.5版的....

預儲程序:
CREATE PROCEDURE [dbo].[Insert_MsgData]
  @MsgTxt text
AS
  declare @MsgID int
BEGIN
SET NOCOUNT ON;

   Insert into TestMsg (tMsgText)
     values (@MsgTxt)
    
    Select @MsgID = @@identity
    
    return @MsgID
END

============================
.NET 3.5 for C#:

     int result = 0;
     using (cn = new SqlConnection(ConStr))
     {
     SqlCommand sqlcmd = new SqlCommand();
     sqlcmd.Connection = cn;
     sqlcmd.CommandText = "Insert_MsgData";
     sqlcmd.CommandType = CommandType.StoredProcedure;

     sqlcmd.Parameters.Add("@MsgTxt", SqlDbType.Text);
     sqlcmd.Parameters.Add("@MsgID", SqlDbType.Int);
     sqlcmd.Parameters["@MsgID"].Direction = ParameterDirection.ReturnValue;

     sqlcmd.Parameters["@MsgTxt"].Value = MsgTxt;

     cn.Open();
     sqlcmd.ExecuteNonQuery();

     result = (int) sqlcmd.Parameters["@MsgID"].Value;
     cn.Close();
     }

這樣確定資料有插入, 且傳回主鍵值了
謝謝小朱版主~~~ m(_ _)m (叩首)
作者 : regionbbs(小朱)技術副站長 VB.Net曠世奇才SQL Server 7/2K卓越專家.Net Framework優秀好手C#曠世奇才ASP.Net一代宗師ADO.Net卓越專家貼文超過6000則人氣指數超過70000點
[ 貼文 6372 | 人氣 82299 | 評價 36440 | 評價/貼文 5.72 | 送出評價 59 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/10/7 下午 05:37:07
兩個寫法差不多啦...ADO.NET 自從 2.0 後就沒有再改變了,.NET 3.5 上的是 ADO.NET Entity Framework,但它也是基於 .NET 2.0 上的 ORM 實作。
 板主 : 小朱
 > ADO.NET - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - ADO.NET - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
ADO.NET
1 小朱 1520 
2 識丁 280 
3 吳馨琳 270 
4 小台 180 
5 Snaking 140 
6 mark 140 
7 好說 120 
8 ammon 100 
9 toyboy 70 
10 再見男人 50 
ADO.NET
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2018 程式設計俱樂部 http://www.programmer-club.com.tw/
3.515625E-02