110,499
社区成员
发帖
与我相关
我的任务
分享
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内型。