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内型。
set @培训时间=cast(@XmlTest1 as varchar) set @培训内容=cast(@XmlTest2 as varchar) 这两句改成: set @培训时间=cast(@XmlTest1 as varchar(50)) set @培训内容=cast(@XmlTest2 as varchar(50)) 试试
(
@培训前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内型。
set @培训内容=cast(@XmlTest2 as varchar)
这两句改成:
set @培训时间=cast(@XmlTest1 as varchar(50))
set @培训内容=cast(@XmlTest2 as varchar(50))
试试
按你的办公试了,但问题依旧,测试存储过程时,@培训时间和@培训内容所输出的值都是正确的,是在输出到command.Parameters时输出错误了。