Sushil Dhuriya Ответов: 2

Этот код всегда дает мне ошибку........системы.argumentoutofrangeexception: индекс находился вне допустимого диапазона. Должно быть неотрицательным и меньше размера коллекции.


Stored Procedure..........

USE [myDatabase]
GO
/****** Object:  StoredProcedure [dbo].[sp_main]    Script Date: 28-Jun-16 3:57:04 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER proc [dbo].[sp_main]
(
	@id int = 0,
	@action varchar(50) = NULL,
	@firstname varchar(50) = NULL,
	@lastname varchar(50) = NULL,
	@email varchar(50) = NULL,
	@state varchar(50) = NULL,
	@city varchar(50) = NULL,
	@mob varchar(50) = NULL,
	@dep varchar(50) = NULL,
	@dob date = NULL, 
	@salary int = 0
)
as 
begin

if @action = 'insert'
begin
insert into empDetail values (@firstname, @lastname, @email, @state, @city, @mob, @dep)

declare @empId int
set @empId = SCOPE_IDENTITY()

insert into empDpartment values(@empId, @firstname, @dep, @dob, @salary)
end

if @action = 'delete'
begin

delete from empDetail where id = @id
end 

if @action = 'update'
begin


update empDetail set fname = @firstname, lname = @lastname, email = @email, state = @state, city = @city, mob = @mob, dep = @dep where id = @id

update empDpartment set fname = @firstname, department = @dep, dob = @dob, salary = @salary where empID = @id
end

if @action = 'select'
begin

select * from empDetail 
end
end



Code for deleting data........

protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
        {
            int id = int.Parse(GridView1.DataKeys[e.RowIndex].Value.ToString());
            cmd = new SqlCommand("sp_main", con);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddWithValue("@id", id);
            cmd.Parameters.AddWithValue("@action", "delete");
            con.Open();
            cmd.ExecuteNonQuery();
            con.Close();
        }<b><b><b><b><b><b></b></b></b></b></b></b>


Что я уже пробовал:

Любой может мне помочь....Я понятия не имею, как решить эту ошибку.

ZurdoDev

Нет никакой причины показывать весь sql-код. Ошибка происходит в C#. Вы понимаете, о чем говорит вам ошибка?

Foothill

В вашем блоке кода единственное место, где я могу определить, где используется коллекция, - это GridView1. DataKeys[e.Параметр rowindex]. Проверьте, находится ли индекс строки в данных события в ключах данных. Я подозреваю, что это не так.

jayveebishie

Вы должны научиться использовать точку останова и проверять свой код построчно

2 Ответов

Рейтинг:
2

Karthik_Mahalingam

убедитесь, что GridView разметка имеет DataKeyNames [^]атрибут

DataKeyNames="Id"


Рейтинг:
2

Patrice T

Вы должны научиться использовать отладчик как можно скорее. Вместо того чтобы гадать, что делает ваш код, пришло время увидеть, как он выполняется, и убедиться, что он делает то, что вы ожидаете.

Отладчик позволяет вам следить за выполнением строка за строкой, проверять переменные, и вы увидите, что есть точка, в которой он перестает делать то, что вы ожидаете.
Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]

Когда произойдет ошибка, проверьте коллекцию, и вы увидите, что пытаетесь получить доступ к элементу, который не существует.