command.Parameters["@" + columname].Value值的问题。

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

...全文
123 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ziyeage 2013-10-21
  • 打赏
  • 举报
回复
自己找到原因了,在于一开始创建paramenters的数列时,字段类型没有分配。
ziyeage 2013-10-21
  • 打赏
  • 举报
回复
引用 4 楼 lyq8376 的回复:
楼主,试了可以的话,就结贴给分吧
按你的办公试了,但问题依旧,测试存储过程时,@培训时间和@培训内容所输出的值都是正确的,是在输出到command.Parameters时输出错误了。
ziyeage 2013-10-19
  • 打赏
  • 举报
回复
休息日,周一上班测试过正常就结贴,不过,在我测试存储过程的时候,@培训时间和@培训内容的输出是正确的。问题出在通过C#的sql语句返回值上。
  • 打赏
  • 举报
回复
楼主,试了可以的话,就结贴给分吧
  • 打赏
  • 举报
回复
set @培训时间=cast(@XmlTest1 as varchar) set @培训内容=cast(@XmlTest2 as varchar) 这两句改成: set @培训时间=cast(@XmlTest1 as varchar(50)) set @培训内容=cast(@XmlTest2 as varchar(50)) 试试
ziyeage 2013-10-18
  • 打赏
  • 举报
回复
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内型。
QuickPai 2013-10-18
  • 打赏
  • 举报
回复
贴出你的存储过程以及调用的C#代码

110,499

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧