C# 如何从存储过程调用选定值
如果我有以下存储过程,如何在代码中调用所选的值,以便将其设置为变量C# 如何从存储过程调用选定值,c#,sql-server,select,stored-procedures,C#,Sql Server,Select,Stored Procedures,如果我有以下存储过程,如何在代码中调用所选的值,以便将其设置为变量 CREATE PROCEDURE [dbo].GetCourseIDFromCourseNumber( @courseNo int, @termId int, @courseId int OUTPUT ) AS BEGIN SELECT @courseId = CourseId FROM Course Where (CourseNumber = @courseNo AND TermId = @termId) 结束 C代
CREATE PROCEDURE [dbo].GetCourseIDFromCourseNumber(
@courseNo int,
@termId int,
@courseId int OUTPUT
)
AS
BEGIN
SELECT @courseId = CourseId
FROM Course
Where (CourseNumber = @courseNo AND TermId = @termId)
结束
C代码
objCommand.CommandType = CommandType.StoredProcedure;
objCommand.CommandText = "GetCourseIDFromCourseNumber";
objCommand.Parameters.AddWithValue("@courseNo", courseNumber);
objCommand.Parameters.AddWithValue("@termId", term);
objCommand.Parameters.AddWithValue("@section", section);
//Create an Output parameter to store value from stored procedure
SqlParameter courseIdParam = new SqlParameter("@courseId", SqlDbType.Int);
courseIdParam.Direction = ParameterDirection.Output;
objCommand.Parameters.Add(courseIdParam);
//execute stored procedure
DBConnect objDB = new DBConnect();
SqlConnection connect = objDB.GetConnection();
connect.Open();
objCommand.ExecuteNonQuery();
connect.Close();
//read parameter value
if (courseIdParam.Value != null)
{
var courseId = (int)courseIdParam.Value;
Session["Course"] = courseId;
}
GetDataSet方法
创建函数而不是存储过程:
创建函数[dbo]。GetCourseIDFromCourseNumber
@库塞诺国际酒店,
@termId int
返回表
作为回报
选择CourseId
当然
其中CourseNumber=@courseNo和TermId=@TermId
您现在可以在任何查询中使用输出,例如:
选择CourseId
来自dbo.GetCourseIDFromCourseNumber123,1;
选择t*
来自MyT表
交叉应用dbo.GetCourseIDFromCourseNumber123,1 c
其中t.CourseId=c.CourseId
我个人喜欢将存储过程返回的值存储到DataTable而不是DataSet中;然而,在这种情况下,这完全是个人偏好。然后需要遍历DataTable行中的数据 请参阅以下代码:
string courseId;
DataTable myDataTable = new DataTable();
myDataAdapter.Fill(myDataTable);
foreach (DataRow dr in dt.Rows)
{
courseId = dr["CourseId"].ToString();
}
由于海报添加了相关的C代码,很明显存储过程可能是合适的 如果存储过程只返回一个值而不是一个数据集,则最好将该值作为输出参数返回: 创建过程[dbo].GetCourseIDFromCourseNumber @库塞诺国际酒店, @termId int, @courseId int输出 像 开始 选择@courseId=courseId 当然 其中CourseNumber=@courseNo和TermId=@TermId 终止 现在在C中: SqlCommand objCommand=新的SqlCommand; objCommand.CommandType=CommandType.StoredProcess; objCommand.CommandText=GetCourseIDFromCourseNumber; objCommand.Parameters。AddWithValue@courseNo,课程编号; objCommand.Parameters。AddWithValue@termId学期 //创建输出参数以存储存储过程中的值 SqlParameter courseIdParam=newSqlParameter@courseId,SqlDbType.Int; courseIdParam.Direction=ParameterDirection.Output; objCommand.Parameters.AddcourseIdParam; //执行存储过程 objCommand.ExecuteNonQuery; //读取参数值 ifcourseIdParam.Value!=无效的 { var courseId=intcourseIdParam.Value; }
你试过什么吗?如果不尝试创建命令类型为StoredProcedure的命令,请将所需参数添加到该命令,并最终执行该命令。如果你在执行过程中遇到任何错误,请回来。@我尝试过这样做并不幸运,但它不起作用,我也不确定我错在哪里了。我在我的代码中编辑和添加了catch中是否有任何异常?希望这两个值和术语都是相同的integers@un-幸运的是,没有任何例外。只是会话没有设置为超出您应该签出并停止使用的范围。AddWithValue-它可能会导致意外和令人惊讶的结果…他的应用程序会有什么不同?在我编写此初始答案时,他没有问题中的所有C代码。我更新了我的C代码。我尝试执行objCommand.ExecuteNonQuery:但由于没有连接而出错。因此,我将其更改为当前代码,现在我得到了一个关于连接如何未关闭且仍处于打开状态的错误
string courseId;
DataTable myDataTable = new DataTable();
myDataAdapter.Fill(myDataTable);
foreach (DataRow dr in dt.Rows)
{
courseId = dr["CourseId"].ToString();
}