ADO.NET - 无法获取输出参数

时间:2013-11-22 14:27:19

标签: sql-server ado.net

我的DBA创建了以下存储过程,他坚持认为在SQL Server中调用时工作正常:

CREATE procedure [dbo].[GetParentID]
    @SSHIP_AppID as varchar(50),
    @ParentID as varchar(150) OUTPUT
AS
BEGIN
    SET NOCOUNT ON;
    SELECT @ParentID = a.iBuild_GUID

    FROM dbo.XRef_iBuild_SSHIP as a
    WHERE a.SSHIP_appId = @SSHIP_AppID
    AND a.SSHIP_appId <> ''
END

我创建了以下ADO.NET Wrapper,但是我无法获取输出参数。我一直以“OUTPUT”作为其值:

 private string GetParentId(string appId)
        {
            var connection = new SqlConnection();
            string parentId = String.Empty;
            try
            {
                connection.ConnectionString = "...)
                var command = new SqlCommand("GetParentId", connection);

                command.CommandType = CommandType.StoredProcedure;

                command.Parameters.Add(new SqlParameter("@SSHIP_AppID", appId));

                command.Parameters.Add(new SqlParameter("@ParentID", ParameterDirection.Output));

                connection.Open();

                command.ExecuteNonQuery();

                parentId = (command.Parameters["@ParentId"].Value).ToString();
            }
            catch (Exception ex)
            {
                LogError(appId, ex.ToString(), "Interface12 - Cannot get ParentId", null, 0);
            }
            finally
            {
                connection.Close();
            }
            return parentId;
        }
    }

我做错了什么?

1 个答案:

答案 0 :(得分:1)

new SqlParameter("@ParentID", ParameterDirection.Output)中,第二个参数被视为object value参数,并且显然已转换为字符串。

(在我看来,这种隐式转换是ADO.NET中的一个设计缺陷。它应该为任何未知的输入类型抛出异常。)。

选择更好的过载。