2014-10-17 4 views
2

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

public List<Issue> Load_Issues() 
{ 
    SqlDataReader Sdr; 
    List<Issue> ObjList = new List<Issue>(); 
    cmd.CommandText = "Get_All_Issue"; 

    try 
    { 
     cmd.Connection = con; 
     cmd.CommandType = CommandType.StoredProcedure; 

     con.Open(); 
     Sdr = cmd.ExecuteReader(); 

     while (Sdr.Read()) 
     { 
      // here I pull out records from database.. 
     } 
    } 
    catch (Exception ex) 
    { 
     throw ex; 
    } 
    finally 
    { 
     con.Close(); 
    } 

    return ObjList; 
} 

Функция Я использую, чтобы связать Gridview следующим

public void Bind_Issues() 
{ 
    gdIssues.DataSource = Bl.Load_Issues()(); 
    gdIssues.DataBind(); 
} 

Моя хранимая процедура не принимает никаких аргументов. Пока страница загружается в первый раз, она отлично работает и привязывает записи к gridview.

У нас есть возможность редактировать записи, поэтому, что происходит после обновления записей, мне нужно снова привязать записи к gridview. Поэтому я снова использую функцию Load_Issues, чтобы сделать это. Но на этот раз он бросает ошибку

Get_All_Issues не имеет параметров и аргументы были поставлены

+3

Вы повторно используете свой экземпляр 'cmd' для других запросов? – petelids

+2

Нужно распоряжаться Sdr btw –

+2

Похоже, что ваш объект 'cmd' существует за пределами функции' Load_Issues' - возможно, вы используете его для логики обновления, и параметры остаются там с этой точки? – Pafka

ответ

2

Вы, скорее всего, снова используя cmd экземпляр в нескольких местах, и вы не очистить параметры, связанные с этим, тем самым создавая исключение, которое вы видите.

Самое простое исправление заключается в том, чтобы не использовать повторно cmd, но если по какой-либо причине вам лучше, просто убедитесь, что вы используете параметры «Очистить» перед тем, как выполнить его.

cmd.Parameters.Clear(); 
+0

, так это обязательно, чтобы очистить параметры в каждый момент, наконец, блок? – user3452210

+1

@ user3452210, если вы повторно используете экземпляр, да, это безопаснее. – walther

2

Попытка не используя глобальные соединения, команды и т.д.: открывать и закрывать их в пределах метода

public List<Issue> Load_Issues() { 
    //TODO: Put actual connection string here 
    using (SqlConnection con = new SqlConnection("Connection String here")) { 
    con.Open(); 

    // Put IDisposable into using 
    using (SqlCommand cmd = new SqlCommand()) { 
     cmd.Connection = con; 
     cmd.CommandText = "Get_All_Issue"; 
     cmd.CommandType = CommandType.StoredProcedure; 

     List<Issue> ObjList = new List<Issue>(); 

     // Put IDisposable into using 
     using (var Sdr = cmd.ExecuteReader()) { 
     while (Sdr.Read()) { 
      //TODO: Pull out records from database into ObjList 
     } 
     } 

     return ObjList; 
    } 
    } 
} 
+0

+1 для 'использования', поэтому важно иметь дело с одноразовыми объектами. – juharr

1

Попробуйте эти

exec 'stored_procedure_name' 
go 

или

alter proc stored_procedure_name 
as 
begin 
    --Block of Statements 
end 
go 

или

create proc stored_procedure_name 
as 
begin 
    --Block of Statements 
end 
go 

Где идти ключевое слово будет решить вашу проблему.

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