none
SqlCommand 操作預存程序 RRS feed

  • 問題

  • 在我的預存程序是這麼寫的

    alter PROC SP_T1
    @fProduct varchar(10),
    @newid varchar(10) out
    as
    declare @rowcount int
    select @rowcount= COUNT(*)  from tProduct p
    where p.fProduct =@fProduct
    if @rowcount = 0
    begin
        declare @newfid varchar(10)
        select @newfid=MAX (fId ) from tProduct
        set @newid =  'P'+RIGHT ('000'+ Ltrim(str(cast(SUBSTRING(@newfid ,2,3) AS INT)+1)) ,3)
            insert tProduct (fid,fProduct)values(@newid,@fProduct)
            SELECT * FROM tProduct WHERE fId =@newid
    end   
    ELSE
        set @newid = '已報過'
    go

    若輸入的參數不在查詢中,會新增一筆,但我有預設若存在會由@newid這個out參數傳出訊息。

    在Sql Server 可以運行,若@rowcount = 0(表示要開始新增和查詢)會出現兩個結果出來

    SqlCommand 是否有可以做到ExecuteNonQuery外加可以Reader到資料的功能??

    我程式碼是這麼寫的....

                Dim cmd As New SqlCommand("SP_T1", con)
                cmd.CommandType = CommandType.StoredProcedure
                Dim parm As New SqlParameter("@fProduct", txt)
                Dim outParm As New SqlParameter("@newid", SqlDbType.VarChar, 20)
                cmd.Parameters.Add(parm)
                cmd.Parameters.Add(outParm)
                outParm.Direction = ParameterDirection.Output
                con.Open()

    Part1 --  cmd.ExecuteNonQuery()
                Dim Result = Mid(outParm.Value, 2, 3)
                If IsNumeric(Result) Then
    Part2 --     Dim R As SqlDataReader = cmd.ExecuteReader()
                    GridView1.DataSource = R
                    GridView1.DataBind()
                    Label1.Text = Result
                Else

    我發現Part1做完結果只有顯示輸出參數,Part2會再回去資料庫跑預存程序,當然會回傳"已報過"

    且無任何查詢結果,想問一下是否有方法~可以只做Part1並可以在Part2不需再跑預存程序,且可以一併接收到輸出參數跟查詢結果??

    我知道邏輯就有問題了...若不可行~我在想一下預存程序的設計部分!!

    謝謝

    2011年4月20日 下午 03:00

解答

  • 你只要跑 ExecuteReader 就好,跑完後由 SqlCommand.Parameters 中取出 OUT 輸出的參數值,不用再跑一次。
    小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
    雲端學堂Facebook: http://www.facebook.com/pages/StudyAzurecom-yun-duan-xue-tang/155855707799579
    • 已標示為解答 X.R 2011年4月24日 下午 02:22
    2011年4月21日 上午 12:41
    版主

所有回覆

  • 回傳值用ExecuteScalar 代替 ExecuteNonQuery試試

    SqlCommand.ExecuteScalar 方法


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2011年4月20日 下午 03:03
    版主
  • 你只要跑 ExecuteReader 就好,跑完後由 SqlCommand.Parameters 中取出 OUT 輸出的參數值,不用再跑一次。
    小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
    雲端學堂Facebook: http://www.facebook.com/pages/StudyAzurecom-yun-duan-xue-tang/155855707799579
    • 已標示為解答 X.R 2011年4月24日 下午 02:22
    2011年4月21日 上午 12:41
    版主