【问题标题】:Getting return value from dynamic sql from stored procedure (SQL Server and C# ADO.NET)?从存储过程(SQL Server 和 C# ADO.NET)获取动态 sql 的返回值?
【发布时间】:2013-03-03 02:21:11
【问题描述】:

我创建了一个存储过程来从动态 sql 中获取返回值。我得到以下异常:

String[1]:Size 属性的大小为 0 无效。

我的进程:

CREATE proc [dbo].[Review_Get_PrePopValue](@sqlQuery nvarchar(500), @display nvarchar(200) OUTPUT)
as

EXEC sp_executesql @sqlQuery,   
    @display OUTPUT 

我的代码:

public string GetAnswerValue(string contentSQL, string parameter, string parameterValue)
{
    string sqlstatement = contentSQL.Replace(parameter, parameterValue);

    using (var conn = new SqlConnection(_connectionString))
    {
        string prePopValue;
        SqlCommand comm = new SqlCommand();
        comm.Connection = conn;
        comm.CommandType = CommandType.StoredProcedure;
        comm.CommandText = "Review_Get_PrePopValue";

        comm.Parameters.Add(new SqlParameter("@sqlQuery", SqlDbType.NVarChar)).Value = sqlstatement; 
        comm.Parameters.Add(new SqlParameter
        {
            Direction = ParameterDirection.Output,
            ParameterName = "@display",
            SqlDbType = SqlDbType.NVarChar
        });

        conn.Open();
        comm.ExecuteNonQuery();

        prePopValue = comm.Parameters["@display"].Value.ToString();
        return prePopValue;
    }
}

我的sql字符串:

Select @display = Grant_Number From GMIS_Grants where grant_id=1

【问题讨论】:

  • 这是您在此处创建的一条非常有趣的 SQL 注入路径。

标签: sql-server-2008 stored-procedures ado.net sp-executesql


【解决方案1】:

Direction = ParameterDirection.Output, ParameterName = "@display", Size = 200, SqlDbType = SqlDbType.NVarChar

需要设置nvarchar的大小

【讨论】:

    【解决方案2】:

    来自 MSDN

    对于双向和输出参数,以及返回值,你必须设置Size的值。

    另外,在你的 SP 末尾添加这个。

    SELECT @display;
    

    【讨论】:

    • 你是什么意思,这是不是错了:“@display nvarchar(200) OUTPUT”?
    • 我说的是 .NET 代码。看到您没有指定第二个参数的值。你应该在那里发送一些东西,即使是一个空字符串,就像第一个参数一样。
    • 它的@display 是一个输出,我如何给它赋值?为什么?
    • 知道了,Direction = ParameterDirection.Output,ParameterName = "@display",Size = 200,SqlDbType = SqlDbType.NVarChar
    • 需要设置nvarchar的大小
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-11
    • 1970-01-01
    • 2010-11-23
    • 2015-10-06
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多