2017-02-13 18 views
0

Если у меня есть следующая хранимая процедура, как мне вызвать выбранное значение, aka CourseId в моем коде, чтобы я мог установить его в переменную?Как вызвать выбранное значение из хранимой процедуры

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 метод

public DataSet GetDataSetUsingCmdObj(SqlCommand theCommand) 
{ 
     // Used for stored procedures (Select only) with parameters 
     try 
     { 
      theCommand.Connection = myConnectionSql; 
      SqlDataAdapter myDataAdapter = new SqlDataAdapter(theCommand); 

      DataSet myDataSet = new DataSet(); 
      myDataAdapter.Fill(myDataSet); 

      ds = myDataSet; 
     } 
     catch (Exception e) 
     { 
     } 
     finally 
     { 
      myConnectionSql.Close(); 
     } 

     return ds; 
    } 
+0

Вы что-то пробовали? если не попытаться создать команду с типом команды как StoredProcedure, добавьте необходимые параметры в команду и, наконец, выполните команду. Вернитесь, если вы столкнулись с чем-то неправильным в исполнении. –

+0

@ un-lucky Я попытался это сделать, но он не работал, и я не был уверен, где я ошибся. Я редактировал и добавлял в код, который у меня есть – alex

+0

, вы получаете какое-либо исключение в catch? Надеюсь, что оба значения 'courseNumber', а также' term' являются целыми числами –

ответ

1

FUNCTION Создать вместо хранимой процедуры:

CREATE FUNCTION [dbo].GetCourseIDFromCourseNumber(
@courseNo int, 
@termId int 
) 
RETURNS TABLE 
AS RETURN 
(
    SELECT CourseId 
    FROM Course 
    Where (CourseNumber = @courseNo AND TermId = @termId) 
) 

Теперь вы можете использовать выход в любом запросе, например:

SELECT CourseId 
FROM dbo.GetCourseIDFromCourseNumber(123,1); 

SELECT t.* 
FROM myTable t 
CROSS APPLY dbo.GetCourseIDFromCourseNumber(123,1) c 
WHERE t.CourseId = c.CourseId 
+0

И какая разница для его применения? –

+0

У него не было кода C# в вопросе, когда я написал этот первоначальный ответ. – Serge

0

Я лично хотел бы сохранить возвращаемые значения из хранимой процедуры в DataTable, а не DataSet; однако в этом случае это полностью личное предпочтение. Затем вам нужно будет перебирать данные в строках DataTable.

Пожалуйста, смотрите следующий код:

string courseId; 

DataTable myDataTable = new DataTable(); 
myDataAdapter.Fill(myDataTable); 

foreach (DataRow dr in dt.Rows) 
{ 
    courseId = dr["CourseId"].ToString(); 
} 
0

Поскольку плакат добавлены соответствующие C# код, стало очевидно, что хранимая процедура может быть подходящей.

Если хранимая процедура будет возвращать только одно значение (а не набор данных), то это может быть лучше, чтобы вернуть значение в качестве OUTPUT параметра:

CREATE PROCEDURE [dbo].GetCourseIDFromCourseNumber(
@courseNo int, 
@termId int, 
@courseId int OUTPUT 
) 
AS 
BEGIN 

    SELECT @courseId = CourseId 
    FROM Course 
    Where (CourseNumber = @courseNo AND TermId = @termId) 

END 

Сейчас в C#:

SqlCommand objCommand = new SqlCommand(); 
objCommand.CommandType = CommandType.StoredProcedure; 
objCommand.CommandText = "GetCourseIDFromCourseNumber"; 

objCommand.Parameters.AddWithValue("@courseNo", courseNumber); 
objCommand.Parameters.AddWithValue("@termId", term); 

// 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 
objCommand.ExecuteNonQuery(); 

// Read parameter value 
if(courseIdParam.Value != null) 
{ 
    var courseId = (int)courseIdParam.Value; 
} 
+0

Я обновил свой код на C#. Я попытался выполнить 'objCommand.ExecuteNonQuery():', но получал ошибку, потому что не было никакого соединения. Поэтому я изменил его на то, что мой код в настоящее время, и теперь я получаю сообщение о том, как соединение не закрывается и все еще открыто – alex