写了个存储过程。需返回一个字符串,存储过程调试时,返回值是对的,如返回值为sdfsd,但当从command.Parameters["@" + columname].Value中取得返回值时,就变成了单单一个s,后面的dfsd都没有了,这是怎么回事呢?

解决方案 »

  1.   

    ALTER PROCEDURE dbo.StoredProcedure1
    (
    @培训前11 int=0 OUTPUT,
    @培训前12 int=0 output,
    @培训前13 int=0 output, @培训后71 int=0 OUTPUT,
    @培训后72 int=0 output,
    @培训时间 char(50)='   ' output,
    @培训内容 char(50)='' output,
    @课程编号 nvarchar(50)

    )

    AS
    begin
    DECLARE @XmlTest1 xml;
    DECLARE @XmlTest2 xml;
    set @XmlTest1=(select top 1 心得.query('//学习心得/培训时间/text()') as 培训时间 from 学习心得表 where 课程编号=@课程编号 order by id)
    set @XmlTest2=(select top 1 心得.query('//学习心得/培训内容/text()') as 培训时间 from 学习心得表 where 课程编号=@课程编号 order by id)
    set @培训时间=cast(@XmlTest1 as varchar)
    set @培训内容=cast(@XmlTest2 as varchar) SELECT @培训前11=COUNT(心得) FROM 学习心得表 WHERE (心得.exist('//学习心得/培训前1[text()[1]="愿意"]') = 1) and 课程编号=@课程编号
    SELECT @培训前12=COUNT(心得)  FROM 学习心得表 WHERE (心得.exist('//学习心得/培训前1[text()[1]="一般"]') = 1) and 课程编号=@课程编号
    SELECT @培训前13=COUNT(心得)  FROM 学习心得表 WHERE (心得.exist('//学习心得/培训前1[text()[1]="不愿意"]') = 1) and 课程编号=@课程编号
    end
    RETURN
    存储过程如上,有省略,返回出现问题的在
    @培训时间 char(50)='   ' output,
    @培训内容 char(50)='' output,
    这两个值,存储过程调式中返回值正确。 /// <summary>
            /// 构建 SqlCommand 对象(用来返回一个结果集,而不是一个整数值)
            /// </summary>
            /// <param name="connection">数据库连接</param>
            /// <param name="storedProcName">存储过程名</param>
            /// <param name="parameters">存储过程参数</param>
            /// <returns>SqlCommand</returns>
            private static SqlCommand BuildQueryCommand(SqlConnection connection, string storedProcName, IDataParameter[] parameters)
            {
                SqlCommand command = new SqlCommand(storedProcName, connection);
                command.CommandType = CommandType.StoredProcedure;
                foreach (SqlParameter parameter in parameters)
                {
                    if (parameter != null)
                    {
                        // 检查未分配值的输出参数,将其分配以DBNull.Value.
                        if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) &&
                            (parameter.Value == null))
                        {
                            parameter.Value = DBNull.Value;
                        }
                        command.Parameters.Add(parameter);
                    }
                }            return command;
            }        /// <summary>
            /// 执行存储过程,返回Output输出参数值        
            /// </summary>
            /// <param name="storedProcName">存储过程名</param>
            /// <param name="parameters">存储过程参数</param>
            /// <returns>object</returns>
            public static DataTable RunProcedure1(string storedProcName, IDataParameter[] paramenters,DataTable dt)
            {
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    connection.Open();
                    SqlCommand command = BuildQueryCommand(connection, storedProcName, paramenters);
                    command.ExecuteNonQuery();
                    DataRow Rows = dt.NewRow();
                    for (int i = 0; i < dt.Columns.Count; i++)
                    {
                        string columname = dt.Columns[i].ColumnName;
                        Rows[columname] = command.Parameters["@" + columname].Value;
                    }
                    dt.Rows.Add(Rows);
                    //object obj = command.Parameters["@培训前11"].Value; //@Output_Value和具体的存储过程参数对应
                    if ((Object.Equals(dt, null)) || (Object.Equals(dt, System.DBNull.Value)))
                    {
                        return null;
                    }
                    else
                    {
                        return dt;
                    }
                }
            }这个是调用存储过程的代码,在其中Rows[columname] = command.Parameters["@" + columname].Value;这一句时出现问题。在datatable中,培训时间、培训内容两列都是string内型。
      

  2.   

    set @培训时间=cast(@XmlTest1 as varchar)
        set @培训内容=cast(@XmlTest2 as varchar)
    这两句改成:
    set @培训时间=cast(@XmlTest1 as varchar(50))
        set @培训内容=cast(@XmlTest2 as varchar(50))
    试试
      

  3.   

    休息日,周一上班测试过正常就结贴,不过,在我测试存储过程的时候,@培训时间和@培训内容的输出是正确的。问题出在通过C#的sql语句返回值上。
      

  4.   


    按你的办公试了,但问题依旧,测试存储过程时,@培训时间和@培训内容所输出的值都是正确的,是在输出到command.Parameters时输出错误了。
      

  5.   

    自己找到原因了,在于一开始创建paramenters的数列时,字段类型没有分配。