2015-11-18 5 views
1

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

Что я здесь делаю неправильно?

C#

string eventName = TextBoxEventName.Text; 
    string location = TextBoxLocation.Text; 
    string city = TextBoxCity.Text; 
    string state = DropDownListState2.SelectedValue; 
    string description = TextBoxDescription.Text; 

    string eventSelected = DropDownListEvents.SelectedValue; 

    using (SqlConnection sqlConn = new SqlConnection(ConfigurationManager.ConnectionStrings["Events2"].ConnectionString)) 
    { using (var command = sqlConn.CreateCommand()) 
     { 

      command.CommandType = System.Data.CommandType.StoredProcedure; 
      command.CommandText = "spGetEvent"; 

      command.Parameters.Add("@EventId", SqlDbType.Int).Value = eventSelected; 

      using (var reader = command.ExecuteReader()) 
      { 
       while (reader.Read()) 
       { 

        command.Parameters.Add("@EventName", SqlDbType.NVarChar, 255).Value = eventName; 
        command.Parameters.Add("@Location", SqlDbType.NVarChar, 255).Value = location; 
        command.Parameters.Add("@City", SqlDbType.NVarChar, 30).Value = city; 
        command.Parameters.Add("@State", SqlDbType.NVarChar, 2).Value = state; 
        command.Parameters.Add("@Description", SqlDbType.NVarChar, -1).Value = description; 
       } 
      } 

Часть моей хранимой процедуры

PROCEDURE [dbo].[spGetEvent] 
     @EventId int, 
     @EventName nvarchar(255), 
     @Location nvarchar(255), 
     @City nvarchar(30), 
     @State nvarchar(2), 
     @Description nvarchar(max) 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    -- Insert statements for procedure here 
    SELECT * 
    FROM Event 
    WHERE EventId = @EventId AND 
    EventName = @EventName AND 
    Location = @Location AND 
    City = @City AND 
    State = @State AND 
    Description = @Description 
END 

ответ

2

Вы выполняете команду перед установкой всех параметров.

using (SqlConnection sqlConn = new SqlConnection(ConfigurationManager.ConnectionStrings["Events2"].ConnectionString)) 
{ using (var command = sqlConn.CreateCommand()) 
    { 

     command.CommandType = System.Data.CommandType.StoredProcedure; 
     command.CommandText = "spGetEvent"; 

     command.Parameters.Add("@EventId", SqlDbType.Int).Value = eventSelected; 

     using (var reader = command.ExecuteReader()) 
     { 
      if(reader.Read()) 
      { 
       eventName.Text = reader["EventName"].ToString(); 
       location.Text = reader["Location"].ToString(); 
       city.Text = reader["City"].ToString(); 
       state.Text = reader["State"].ToString(); 
       description.Text = reader["Description"].ToString(); 
      } 
     } 
    } 
} 

Изменить ваше ХП принять только EventId в качестве параметра:

PROCEDURE [dbo].[spGetEvent] 
     @EventId int 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    -- Insert statements for procedure here 
    SELECT * 
    FROM Event 
    WHERE EventId = @EventId 
END 
+0

Спасибо. Хорошо, когда я ввел код, где вы добавили комментарий, он все еще не работает. Я попытался что-то вроде этого: 'location = reader [" @ Location "]. ToString();' – RockOn

+1

Удалить символ @, получить доступ к нему как 'reader [" Location "]' – Harsh

+0

Я добавил точки останова. В нем указано, что EventName, Location и т. Д. Пустые. Он тянет идентификатор, хотя. Я думаю, что я закодировал что-то не так на моей хранимой процедуре ...? – RockOn