Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.64/14: Рейтинг темы: голосов - 14, средняя оценка - 4.64
ikll7
5 / 5 / 1
Регистрация: 30.09.2010
Сообщений: 56
1

Удаление строки из GridView используя хранимую процедуру

05.03.2012, 22:04. Просмотров 2644. Ответов 19
Метки нет (Все метки)

Как можно удалить строку из таблицы используя хранимую процедуру?

http://www.cyberforum.ru/attachment....1&d=1330970279


Так выглядит хранимая процедура

SQL
1
2
3
4
5
ALTER PROCEDURE DelEmployee
@EmployeeID INT
AS
DELETE FROM Employed WHERE EmployeeID=@EmployeeID
RETURN

Так, удаление из грида

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e) 
        {
          
   
            cn = new SqlConnection(conStr);
            cn.Open();
            delCmd = new SqlCommand("DelEmployee",cn);
            delCmd.CommandType = CommandType.StoredProcedure;
            delCmd.Parameters.Add("@EmployeeID",SqlDbType.Int);
            
           
          delCmd.Parameters.Add("@EmployeeID", SqlDbType.Int).Value = Convert.ToInt32((GridView1.Rows[e.RowIndex].Cells[1]).ToString());
 
 
            delCmd.ExecuteNonQuery();
            
        }
При нажатии на удалить выскакивает эксепшен

Input string was not in a correct format.
0
Изображения
 
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.03.2012, 22:04
Ответы с готовыми решениями:

Сохранить изменения, сделанные в DataGridView, в БД, используя хранимую процедуру
Есть DataGridView. Они берутся из БД без всяких заморочек. В DataGridView вводятся данные. Их...

Реализация select запроса используя хранимую процедуру - sql server
Здравствуйте в программе на с# имеется запрос такого типа: private void button1_Click(object...

Добавление строки через хранимую процедуру
Есть таб в БД: ДАТА(тип date), IP(тип nvarchar(50)), ПК(тип nvarchar(50)), СОБЫТИЕ(тип...

Удаление выбранной строки в GridView sql
как организовать удаление выбранной строки из грида? бд HeidiSQL подключен кодом без database....

Запрос по массиву в хранимую процедуру
Доброго времени суток Столкнулся с проблемой. В БД 2 таблицы: Кредиторы и Договора. Связь -...

19
_katon_
385 / 241 / 20
Регистрация: 03.10.2011
Сообщений: 1,003
05.03.2012, 22:14 2
А чего так? И зачем процедура? И как ты удаляешь записи? Выделяешь запись и нажимаешь delete?
0
ikll7
5 / 5 / 1
Регистрация: 30.09.2010
Сообщений: 56
05.03.2012, 22:22  [ТС] 3
Задание такое, что надо через процедуры. Другие 2 процедуры(добавление и вывод в грид работают).
Записи удаляю по нажатию на Delete. Тоесть на каждой строке есть кнопка Delete(как на скрине)

Добавил так <asp:CommandField ShowDeleteButton="True" HeaderText="#"/>
0
_katon_
385 / 241 / 20
Регистрация: 03.10.2011
Сообщений: 1,003
05.03.2012, 22:35 4
А расскажи подробнее про ошибку? В какой момент она срабатывает и какой у нее текст. Это у тебя обработчик ссылки? На какой строке валится ошибка?
0
ikll7
5 / 5 / 1
Регистрация: 30.09.2010
Сообщений: 56
05.03.2012, 22:44  [ТС] 5
Тут по конструкции
C#
1
delCmd = new SqlCommand("ИМЯ ПРОЦЕДУРЫ",cn);

C#
1
delCmd = new SqlCommand("EXEC DelEmployee @EmployeeID", cn);
Так пишет, что такой процедуры нет.


------------------------
Вот так писал добавление


C#
1
2
3
4
5
6
7
8
addCmd = new SqlCommand();
                addCmd.Connection = cn;
                addCmd.CommandType = CommandType.StoredProcedure;
                addCmd.CommandText = "InsEmployee";
 
                FirstName = new SqlParameter("@FirstName", SqlDbType.VarChar);
                addCmd.Parameters.Add(FirstName);
                FirstName.Value = FirstNameTB.Text;
0
_katon_
385 / 241 / 20
Регистрация: 03.10.2011
Сообщений: 1,003
05.03.2012, 23:14 6
Да! по конструкции ты прав! Просто насколько я помню, чтобы так писать надо, чтобы процедура существовала в Dataset (а точнее в datatableadapter). У тебя я так понимаю там сейчас только таблицы? Если процедуры нету, то ее надо добавить.

Добавлено через 13 минут
Странно все должно работать! Так на какой строчке у тебя ошибка валится?
delCmd.ExecuteNonQuery()?? тут? а у тебя есть права на ее запуск?

Добавлено через 1 минуту
Стоп! Если пишет, что такой процедуры нет значит ее нет в БД! посмотри действительно ли процедура сохранилась в нужную тебе БД.

Добавлено через 1 минуту
если процедура есть, то скопируй ее название с сервера тебя может подвести русский символ в названии процедуры!
1
ikll7
5 / 5 / 1
Регистрация: 30.09.2010
Сообщений: 56
05.03.2012, 23:29  [ТС] 7
C#
1
2
3
SqlDataAdapter adapter = new SqlDataAdapter("DelEmployee", cn);
            DataSet ds = new DataSet("DelEmployee");
            DataTable EmpTable = ds.Tables["EmployeeID"];
Не, чето не так, буду думать дальше. Если так написать то выбрасывает

Procedure or function 'InsEmployee' expects parameter '@FirstName', which was not supplied.

Который относится к другой процедуре.

Не заметил мессаг. Так то что до этого про адаптер написано не нужно?
0
_katon_
385 / 241 / 20
Регистрация: 03.10.2011
Сообщений: 1,003
05.03.2012, 23:36 8
Не про адаптор это другая тема! Я так работал с ХП на типизированном датасете (там вызвал ХП как метод адаптора)! А месагу выбрасывате потому, что не определил параметры входные для ХП.
Проверил есть-ли ХП на сервере?
0
ikll7
5 / 5 / 1
Регистрация: 30.09.2010
Сообщений: 56
05.03.2012, 23:42  [ТС] 9
да, есть

Вообще, хранимая процедура работает. Если нажать Execute, предлагается ввести Value. Когда вводим Value Удаляется строка из таблицы и бд соответствующая номеру.
0
_katon_
385 / 241 / 20
Регистрация: 03.10.2011
Сообщений: 1,003
05.03.2012, 23:47 10
Копировал название? Выложи код, который юзаешь сейчас!
0
ikll7
5 / 5 / 1
Регистрация: 30.09.2010
Сообщений: 56
05.03.2012, 23:50  [ТС] 11
C#
1
2
3
4
5
6
7
8
9
10
11
12
 cn = new SqlConnection(conStr);
            cn.Open();
            delCmd = new SqlCommand("DelEmployee", cn);
            delCmd.CommandType = CommandType.StoredProcedure;
            delCmd.Parameters.Add("@EmployeeID",SqlDbType.Int);
 
            delCmd = new SqlCommand("EXEC DelEmployee @EmployeeID", cn);
 
 
         //delCmd.Parameters.Add("@EmployeeID", SqlDbType.Int).Value = Convert.ToInt32((GridView1.Rows[e.RowIndex].Cells[1]).ToString());
           
            delCmd.ExecuteNonQuery();
Must declare the scalar variable "@EmployeeID".


О, Уже лучше

Если убрать @ то

C#
1
delCmd = new SqlCommand("EXEC spDelEmployee EmployeeID", cn);

delCmd.ExecuteNonQuery(); бросает Error converting data type nvarchar to int.
0
_katon_
385 / 241 / 20
Регистрация: 03.10.2011
Сообщений: 1,003
06.03.2012, 00:01 12
Верни все как было у тебя там была более правильная мысль! Извини я тебя на вечер глядя сбил с истинного пути(( Сделай точно так же как для Inserta и как вывалится ошибка скажи на какой строке и полный текст ошибки.

Must declare the scalar variable "@EmployeeID". означает что не объявлена переменная.))
0
ikll7
5 / 5 / 1
Регистрация: 30.09.2010
Сообщений: 56
06.03.2012, 00:07  [ТС] 13
Ладно, все равно спасибо, завтра продолжу копать)
0
_katon_
385 / 241 / 20
Регистрация: 03.10.2011
Сообщений: 1,003
06.03.2012, 00:11 14
Ок! пиши завтра - голова будет более свежая - разберемся!
0
nio
5969 / 3375 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
06.03.2012, 10:15 15
посмотрел изначальный код, с виду все нормально, за исключением нескольких моментов.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e) 
        {
            cn = new SqlConnection(conStr);
            cn.Open();
            delCmd = new SqlCommand("DelEmployee",cn);
            delCmd.CommandType = CommandType.StoredProcedure;
            //почему-то дважды добавляется праметр
            //delCmd.Parameters.Add("@EmployeeID",SqlDbType.Int);
            
           //убедись отладчиком, что в id есть значение на момент удаления
           //лучше указывать имя столбца, а не индекс
           object id = GridView1.Rows[e.RowIndex].Cells["EmployeeID"];
 
           //с конвертами ты меня убил. Почему сразу не перегонять в int?
           delCmd.Parameters.Add("@EmployeeID", SqlDbType.Int).Value = Convert.ToInt32(id);
 
            delCmd.ExecuteNonQuery();
            cn.Close();//соединение нужно закрывать            
        }
1
ikll7
5 / 5 / 1
Регистрация: 30.09.2010
Сообщений: 56
06.03.2012, 18:00  [ТС] 16
C#
1
object id = GridView1.Rows[e.RowIndex].Cells["EmployeeID"];
Уже на этом месте в error list Error: Argument 1: cannot convert from 'string' to 'int' и Error 2

The best overloaded method match for 'System.Web.UI.WebControls.TableCellCollection.this[int]' has some invalid arguments
----------------------------------------
Если поставить например 0
C#
1
object id = GridView1.Rows[e.RowIndex].Cells[0];
, то при нажатии на Delete :

Unable to cast object of type 'System.Web.UI.WebControls.DataControlFieldCell' to type 'System.IConvertible'.

-----------------------------------------------------
Если так:
C#
1
2
3
4
   Employed em=new Employed();
                 object id = GridView1.Rows[e.RowIndex].Cells[em.EmployeeID];
 
                 delCmd.Parameters.Add("@EmployeeID", SqlDbType.Int).Value = Convert.ToInt32(id);
Unable to cast object of type 'System.Web.UI.WebControls.DataControlFieldCell' to type 'System.IConvertible'.

Добавлено через 3 минуты
но вот так что-то уже есть думаю
C#
1
object id = GridView1.Rows[e.RowIndex].Cells[em.EmployeeID].Text.ToString();

тогда тут
C#
1
  delCmd.Parameters.Add("@EmployeeID", SqlDbType.Int).Value = Convert.ToInt32(id);
Input string was not in a correct format.


Посмотрел, в таком случае в id находится имя
0
_katon_
385 / 241 / 20
Регистрация: 03.10.2011
Сообщений: 1,003
06.03.2012, 18:09 17
Не из той колонки берется ключевое поле! Какие там колонки вообще в гриде?
0
ikll7
5 / 5 / 1
Регистрация: 30.09.2010
Сообщений: 56
06.03.2012, 18:13  [ТС] 18
EmployeeID, FirstName, LastName, Salary. Может это потому, что Employee ID, я не вывожу в грид?
0
_katon_
385 / 241 / 20
Регистрация: 03.10.2011
Сообщений: 1,003
06.03.2012, 18:21 19
Да именно из-за этого! Добавь его в грид и в свойство Visible укажи false если не хочешь, чтобы оно отображалось.

Добавлено через 4 минуты
еще надо delCmd.Parameters.Add("@EmployeeID", SqlDbType.Int).Value = Convert.ToInt32(id.ToString());

Добавлено через 45 секунд
или id сразу сохранять в string.
1
ikll7
5 / 5 / 1
Регистрация: 30.09.2010
Сообщений: 56
06.03.2012, 18:21  [ТС] 20
Еееееее Все работает!!!!!))


конечный результат


C#
1
2
3
4
5
6
7
8
9
10
11
12
protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e) 
        {
            cn = new SqlConnection(conStr);
            cn.Open();
            delCmd = new SqlCommand("DelEmployee",cn);
            delCmd.CommandType = CommandType.StoredProcedure;
            Employed em=new Employed();
            object id = GridView1.Rows[e.RowIndex].Cells[em.EmployeeID].Text.ToString();
 
            delCmd.Parameters.Add("@EmployeeID", SqlDbType.Int).Value = Convert.ToInt32(id);
            delCmd.ExecuteNonQuery();      
        }

_katon_ , nio большое спасибо за помощь))
0
06.03.2012, 18:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.03.2012, 18:21

Передача табличного типа в хранимую процедуру
В бд есть свой самопальный тип TableType который реализует простенький словарик CREATE TYPE...

Передача в хранимую процедуру множества объектов
здравствуйте Есть List&lt;Class&gt; из 1000 объектов каждый объект нужно внести в базу Insert into и...

Как правильно вызвать хранимую процедуру
Кто знает как корректно вызвать хранимую процедуру в коде C#???


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru