none
SqlDatasource 调存储过程 无法取得Output参数 RRS feed

  • 问题

  • ASPX代码:
        <asp:SqlDataSource ID="SqlDataSource1" runat="server"
            ConnectionString="<%$ ConnectionStrings:... %>" OldValuesParameterFormatString="original_{0}"
            SelectCommand=...
            UpdateCommand=...
            DeleteCommand="Basic_DeleteEmployee"
            DeleteCommandType="StoredProcedure" ondeleted="SqlDataSource1_Deleted" ondeleting="SqlDataSource1_Deleting">
            <SelectParameters>
                ...
            </SelectParameters>
            <DeleteParameters>
                <asp:Parameter Name="original_guid" Type="Object" DefaultValue="" />
                <asp:Parameter Name="errorcode" Direction="InputOutput" Type="Int32" Size="4" DefaultValue="0"/>
                <asp:Parameter Name="errortext" Direction="InputOutput" Type="String" Size="200" DefaultValue=" "/>
            </DeleteParameters>
            <UpdateParameters>
            ....
            </UpdateParameters>
        </asp:SqlDataSource>

    存储过程:
    CREATE PROCEDURE Basic_DeleteEmployee
     @original_guid AS UNIQUEIDENTIFIER,
     @errorcode AS INT = 0 OUTPUT,
     @errortext AS NVARCHAR(2000) = '' OUTPUT
    AS

    Sql 2000监控:
    exec Basic_DeleteEmployee @original_guid = '896817F2-CDAB-457B-AB9A-7817F44C055C', @errorcode = 0, @errortext = N' '

    CS代码中:
    protected void SqlDataSource1_Deleted(object sender, SqlDataSourceStatusEventArgs e)

    用e.Command.Parameters["@errorcode"].Value.ToString() 无法获得返回值

    2010年2月26日 3:35

答案

  • 你好!

    我试下了,默认的设置的确不能获取到返回值。但下面的方法是可以的。

    1 在 DeleteParameters 中去掉参数 errortext 的声明。
    2 在 Deleting 事件中重新声明参数 errortext 


    private void SqlDataSource1_Deleting(Object sender, SqlDataSourceCommandEventArgs e)
    {
        //定义新参数
        System.Data.SqlClient.SqlParameter p = new System.Data.SqlClient.SqlParameter("@errortext", System.Data.SqlDbType.Int);//定义参数
        p.Direction = System.Data.ParameterDirection.Output;  //定义为输出参数      
        e.Command.Parameters.Add(p);//给数据控件添加参数
    }

    知识改变命运,奋斗成就人生!
    2010年2月26日 5:07
    版主

全部回复

  • 这里请教了

    2010年2月26日 3:37
  • 你好!

    我试下了,默认的设置的确不能获取到返回值。但下面的方法是可以的。

    1 在 DeleteParameters 中去掉参数 errortext 的声明。
    2 在 Deleting 事件中重新声明参数 errortext 


    private void SqlDataSource1_Deleting(Object sender, SqlDataSourceCommandEventArgs e)
    {
        //定义新参数
        System.Data.SqlClient.SqlParameter p = new System.Data.SqlClient.SqlParameter("@errortext", System.Data.SqlDbType.Int);//定义参数
        p.Direction = System.Data.ParameterDirection.Output;  //定义为输出参数      
        e.Command.Parameters.Add(p);//给数据控件添加参数
    }

    知识改变命运,奋斗成就人生!
    2010年2月26日 5:07
    版主
  • 可以了,谢谢

    如果可以,希望知道原因

    2010年2月26日 5:35
  • 昏啊,高手再帮帮忙吧

    我把Update 也改成这样,多了几个参数,一个Guid的,几个字符串的,但是出问题:

    不允许从数据类型 sql_variant 到 uniqueidentifier 的隐性转换。请使用 CONVERT 函数来运行此查询。

    Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

    Exception Details: System.Data.SqlClient.SqlException: 不允许从数据类型 sql_variant 到 uniqueidentifier 的隐性转换。请使用 CONVERT 函数来运行此查询。

    Source Error:

    An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

    2010年2月26日 7:56
  • 脑子已经僵了
    2010年2月26日 7:57
  • SQL 的监控

    declare @P1 int
    set @P1=NULL
    declare @P2 nvarchar(200)
    set @P2=NULL
    exec Basic_Employee_Update @original_guid = '896817F2-CDAB-457B-AB9A-7817F44C055C', @deptid = N'0d00bdc8-0da1-4a41-85f4-1e06647ad2cc', @ename = N'Li **', @email = N'aaa', @phoneno = N'13800138000', @inuse = 1, @errorcode = @P1 output, @errortext = @P2 output
    select @P1, @P2
    go


    @original_guid = '896817F2-CDAB-457B-AB9A-7817F44C055C'
    @deptid =         N'0d00bdc8-0da1-4a41-85f4-1e06647ad2cc'

    因为这两个不一样?但这是原始的,没设置过啊
    2010年2月26日 8:02
  • 顶一下..
    2010年2月26日 8:57
  • 了解了,但是还是没有解决

    Updating事件,其实是在真正执行update之前,中间还有一个参数赋值的过程
    我在Updating强行设置了e.Command.Parameters["@..."].DbType = DbType.Guid;
    这次提示Invalid cast from 'System.String' to 'System.Guid'.

    我已经走到头了,没办法了

    2010年2月26日 9:07
  • 你这样吧!

    你在 Updating 中使用 SqlCommand 提交你的命令吧。

    知识改变命运,奋斗成就人生!
    2010年2月27日 4:54
    版主