2013-07-14 2 views
1

У меня есть следующий метод и хранимая процедура.Возврат строки Значение из хранимой процедуры SQL Server

Мой вопрос в том, как вернуть строковое значение из хранимой процедуры для использования в методе addStaffName?

public string addStaffName() 
{ 
     string staffName = string.Empty; 
     string sConnectionString = ConfigurationManager.ConnectionStrings["LGDB"].ToString(); 
     SqlConnection SqlCOn = new SqlConnection(sConnectionString); 
     SqlCommand SqlCmd = new SqlCommand(); 

     SqlCOn.Open(); 
     SqlCmd.Connection = SqlCOn; 
     SqlCmd.CommandType = CommandType.StoredProcedure; 
     SqlCmd.CommandText = "FetchStaffName"; 
     SqlCmd.Parameters.AddWithValue("email", email); 
     //??? 
     return staffName; 
    } 

create procedure fetchStaffName 
    @email varchar(100) 
AS 
begin 
    select (employeeName) 
    from employee 
    where email = @email 
end 

ответ

2

Если вы можете быть уверены в том, что когда-нибудь you'llonly один ряд, один столбец в виде результирующего набора - то вы можете использовать .ExecuteScalar() на вашем SqlCommand так:

string staffName = string.Empty; 

string sConnectionString = ConfigurationManager.ConnectionStrings["LGDB"].ToString(); 

using (SqlConnection sqlCon = new SqlConnection(sConnectionString)) 
using (SqlCommand sqlCmd = new SqlCommand("FetchStaffName", sqlCon) 
{ 
    sqlCmd.CommandType = CommandType.StoredProcedure; 
    sqlCmd.Parameters.AddWithValue("@email", email); 

    sqlCon.Open(); 

    staffName = sqlCmd.ExecuteScalar().ToString(); 

    sqlCon.Close(); 

    return staffName; 
} 

Я также положите использование SqlConnection и SqlCommand в using() { ... } блоки, которые рекомендуются наилучшим образом для всего, что происходит от IDisposable для обеспечения надлежащей утилизации объектов после их использования.

+0

поблагодарить так много, хороший совет, я не могу проголосовать за вас, потому что я здесь новый! – Iatrochemist

+0

, но что, если я хотел получить два столбца в результате хранимой процедуры? – Iatrochemist

+0

@AlirezaX: тогда вам нужно использовать '.ExecuteReader()' и вы вернете 'SqlDataReader'. С этим вы можете читать любое количество столбцов и любое количество строк и вставлять результаты в объекты по вашему выбору. –

1

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

CREATE FUNCTION fetchStaffName (
@email VARCHAR(100) 
) 
RETURNS VARCHAR(?) --Place the length of employeeName field instead of ? symbol. 
BEGIN 
    RETURN (SELECT employeeName FROM employee WHERE email = @email) 
END 

И тогда ваш код .NET превращается в следующее:

using (SqlConnection SqlCOn = new SqlConnection(sConnectionString)) 
{ 
    SqlCommand SqlCmd = new SqlCommand("SELECT fetchStaffName(@email)", SqlCOn); 
    SqlCmd.CommandType = CommandType.Text; 
    SqlCmd.Parameters.AddWithValue("@email", email); 

    SqlCOn.Open(); 
    staffName = (string)SqlCmd.ExecuteScalar(); 
} 

Как вы можете видеть CommandType изменился с StoredProcedure на Text. Я также завернул работу с объектом SqlConnection в конструкцию using, чтобы распределить ресурсы и закрыть автоматически.

+0

спасибо Ивану, что, если я хочу вернуть несколько результатов? – Iatrochemist

+0

Существует несколько способов сделать это. Вы можете использовать хранимую процедуру с несколькими выходными параметрами (немного другой синтаксис .NET и T-SQL). Также вы можете выбрать строку с несколькими столбцами внутри хранимой процедуры, а затем использовать метод ExecuteReader() вашего SqlCommand. Для получения дополнительной информации создайте новый вопрос. – Ivan

+0

спасибо за ответ – Iatrochemist

Смежные вопросы