none
怎么调用存储过程 RRS feed

  • 问题

  • 我正在学习用VS2005+SQL 2005开发ASP.NET应承程序,使用的是VB语言。遇到一个调用存储过程返回值的问题,请大家帮忙看看:
    前台VB代码:

    Public Shared Function GetLendDateByUsedId(ByVal mUsedId As String) As Date
            Dim myDBConn As New SqlConnection()
            Dim myDBCmd As New SqlCommand()
            Dim dateLendDate As Date
            myDBConn.ConnectionString = SQLServerConnection.ConnectionString
            myDBCmd.Connection = myDBConn
            myDBCmd.CommandType = CommandType.StoredProcedure
            myDBCmd.CommandText = "GetLendDateByUsedId"
            myDBCmd.Parameters.AddWithValue("@UsedId", mUsedId)
            myDBCmd.Parameters.Add("@LendDate", SqlDbType.SmallDateTime)
            myDBCmd.Parameters("@LendDate").Direction = ParameterDirection.ReturnValue
            myDBConn.Open()
            myDBCmd.ExecuteNonQuery()
            dateLendDate = myDBCmd.Parameters("@LendDate").Value
            myDBConn.Close()
            myDBCmd = Nothing
            myDBConn = Nothing
            Return dateLendDate
    End Function
    

    SQL 存储过程:

    SET ANSI_NULLS ON
    SET QUOTED_IDENTIFIER ON
    GO
    
    CREATE PROCEDURE [GetLendDateByUsedId]
    (
     @UsedId char(7),
     @LendDate smalldatetime='2010-1-1' OUTPUT
    )
    AS
    BEGIN
     SET @LendDate = 
     (
      SELECT 开始日期 FROM Used WHERE 使用编号=@UsedId
     )
    END
    
    


    在SQL Server 2005中测试该存储过程,@LendDate得到正确的值,但是Return Value返回值是0
    如果将存储过程该为:

    CREATE PROCEDURE [GetLendDateByUsedId]
    (
     @UsedId char(7),
     @LendDate smalldatetime='2010-1-1' OUTPUT
    )
    AS
    BEGIN
     SET @LendDate = 
     (
      SELECT 开始日期 FROM Used WHERE 使用编号=@UsedId
     )
     RETURN @LendDate
    END
    


    SQL Server 2005报告"不允许从数据类型 smalldatetime 到 int 的隐式转换。"
    执行前台代码也不能得到LendDate正确的值。

    2010年3月5日 3:31

答案

  • Public Shared Function GetLendDateByUsedId(ByVal mUsedId As String) As System.DateTime
        Dim myDBConn As New SqlConnection()
        Dim myDBCmd As New SqlCommand()
        Dim dateLendDate As System.DateTime = Nothing
        myDBConn.ConnectionString = ""
        myDBCmd.Connection = myDBConn
        myDBCmd.CommandType = CommandType.StoredProcedure
        myDBCmd.CommandText = "GetLendDateByUsedId"
        myDBCmd.Parameters.AddWithValue("@UsedId", mUsedId)
        myDBCmd.Parameters.Add("@LendDate", SqlDbType.SmallDateTime)
        myDBCmd.Parameters("@LendDate").Direction = ParameterDirection.Output
        myDBConn.Open()
        myDBCmd.ExecuteNonQuery()
        dateLendDate = DirectCast(myDBCmd.Parameters("@LendDate").Value, DateTime)
        myDBConn.Close()
        myDBCmd = Nothing
        myDBConn = Nothing
        Return dateLendDate
    End Function

    CREATE PROCEDURE [GetLendDateByUsedId] (
           @UsedId CHAR(7)
         , @LendDate SMALLDATETIME = '2010-1-1' OUTPUT)
    AS 
    BEGIN
    SELECT @LendDate = 开始日期
    FROM Used
    WHERE 使用编号 = @UsedId
    IF @LendDate IS NULL 
    SET @LendDate = '2010-1-1'
    END


    知识改变命运,奋斗成就人生!
    • 已标记为答案 123kaca 2010年3月5日 5:08
    2010年3月5日 4:33
    版主

全部回复

  • 你好!
    把sql语句改一下
    CREATE PROCEDURE [GetLendDateByUsedId]
    (
     @UsedId char(7),
     @LendDate smalldatetime='2010-1-1' OUTPUT
    )
    AS
    BEGIN

      SELECT  @LendDate =  开始日期 FROM Used WHERE 使用编号=@UsedId
     RETURN @LendDate
    END
    这样就能得到日期了

    2010年3月5日 3:42
  • 我的目的是希望调用GetLendDateByUsedId函数后,能够从SQL Server 2005数据库Used表中得到一个Date类型的值。能不能改写上面的存储过程,在SQL Server 2005测试中让@LendDate和Return Value返回值是一样的呢?因为我发现在VS2005中调试时,GetLendDateByUsedId函数的返回值其实就是Return Value的返回值,而不是@LendDate。
    2010年3月5日 3:45
  • 你好!
    .net调用存储过程后的返回值就是你设置myDBCmd.Parameters("@LendDate").Direction的值。vb我并不十分熟悉,在c#中存储过程的返回值是ParameterDirection.Output。

    2010年3月5日 4:06
  • 谢谢!
    按照你的回复,我在SQL Serer 2005中修改存储过程[GetLendDateByUsedId],单击“执行”时,返回"不允许从数据类型 smalldatetime 到 int 的隐式转换"错误,修改不成功。
    我猜测:执行SELECT后返回的值可能是受该语句影响的行数,是一个int类型。因为我发现,在SQL Serer 2005中测试存储过程时,每次都有两个结果,一个是"@LendDate,是我需要的值,另一个是Return Value,值为0。

    2010年3月5日 4:23
  • Public Shared Function GetLendDateByUsedId(ByVal mUsedId As String) As System.DateTime
        Dim myDBConn As New SqlConnection()
        Dim myDBCmd As New SqlCommand()
        Dim dateLendDate As System.DateTime = Nothing
        myDBConn.ConnectionString = ""
        myDBCmd.Connection = myDBConn
        myDBCmd.CommandType = CommandType.StoredProcedure
        myDBCmd.CommandText = "GetLendDateByUsedId"
        myDBCmd.Parameters.AddWithValue("@UsedId", mUsedId)
        myDBCmd.Parameters.Add("@LendDate", SqlDbType.SmallDateTime)
        myDBCmd.Parameters("@LendDate").Direction = ParameterDirection.Output
        myDBConn.Open()
        myDBCmd.ExecuteNonQuery()
        dateLendDate = DirectCast(myDBCmd.Parameters("@LendDate").Value, DateTime)
        myDBConn.Close()
        myDBCmd = Nothing
        myDBConn = Nothing
        Return dateLendDate
    End Function

    CREATE PROCEDURE [GetLendDateByUsedId] (
           @UsedId CHAR(7)
         , @LendDate SMALLDATETIME = '2010-1-1' OUTPUT)
    AS 
    BEGIN
    SELECT @LendDate = 开始日期
    FROM Used
    WHERE 使用编号 = @UsedId
    IF @LendDate IS NULL 
    SET @LendDate = '2010-1-1'
    END


    知识改变命运,奋斗成就人生!
    • 已标记为答案 123kaca 2010年3月5日 5:08
    2010年3月5日 4:33
    版主
  • 谢谢二位!
    2010年3月5日 5:08