Member 12644036 Ответов: 2

C# импорт excel в базу данных - что означает исключение system.indexoutofrangeexception?


Привет! когда я запускаю ниже код, он показывает ошибку типа "необработанное исключение типа' System.IndexOutOfRangeException ' произошло в System.Data.dll
Дополнительная информация: не удается найти столбец 2."

Может ли кто-нибудь помочь мне найти решение ?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.OleDb;
using System.IO;
using Excel;
using System.Data.Sql;

namespace ProjectTrackingExcel
{
public partial class Form2 : Form
    { 
 private void button3_Click(object sender, EventArgs e)
        {
            OpenFileDialog op = new OpenFileDialog();
            op.Filter = "Excel filters|*.xls;*.xlsx;*.xlxm|Excel2003*xlsx)|*.xlsx";
            if (op.ShowDialog() == DialogResult.Cancel)
                return;

            FileStream strm = File.Open(op.FileName,FileMode.Open,FileAccess.Read); 
            IExcelDataReader exceldata ExcelReaderFactory.CreateBinaryReader(strm);

            DataSet result = exceldata.AsDataSet();

            DataClasses1DataContext con = new DataClasses1DataContext();

            foreach (DataTable table in result.Tables) {

                foreach (DataRow dr in table.Rows){
                   
                  Proj addTable = new Proj (){
                  
                   id = Convert.ToString(dr[0]),
                   name = Convert.ToString(dr[1]),
                   city = Convert.ToString(dr[2]),
                   gender = Convert.ToString(dr[3])
                  
                  };

                  con.Projs.InsertOnSubmit(addTable)  
                }
                 }
                    con.SubmitChanges();
                    exceldata.Close();
                    strm.Close();

            MessageBox.Show("Data Successfully added to the database");

            }    
        }
}


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

Я также сослался на некоторые решения вашего сайта. Но все же возникает та же проблема.

2 Ответов

Рейтинг:
2

OriginalGriff

"Индекс вне диапазона" означает именно это: вы пытаетесь получить доступ к элементу массива, используя значение индекса, которое больше максимального значения Индекса.
Если вы объявите массив целых чисел:

int[] ints = new int[3];

Затем вы можете получить к нему доступ с помощью индекса:
int a = ints[0];
int b = ints[1];
int c = ints[2];
Но если вы попытаетесь использовать отрицательное число или значение больше двух, вы получите ошибку "индекс вне диапазона", потому что в этом значении индекса нет элемента.

Ваш код использует "магические числа" - что, как правило, плохая идея - и почти наверняка именно эта строка вызывает проблему:
city = Convert.ToString(dr[2]),
Поскольку информация о добавлении говорит, что это" столбец 2", он не может найти.
Я бы начал с использования отладчика, чтобы узнать, что находится в DataReader: поместите точку останова в строку
Proj addTable = new Proj ()
И запустите свое приложение в отладчике.
Когда он достигнет этой линии, он остановится и позволит вам точно посмотреть, что находится в переменных.
Посмотрите на свои данные: вероятно, это как - то связано с проблемой-и вам нужны фактические данные, которые он читает, чтобы точно определить, что происходит.

Извините, но мы не можем сделать ничего из этого для вас: у нас нет ваших файлов данных, поэтому мы не можем дублировать вашу проблему здесь!


Рейтинг:
2

Suvendu Shekhar Giri

Ваша проблема, похоже, заключается в следующем фрагменте кода-

Proj addTable = new Proj (){

id = Convert.ToString(dr[0]),
name = Convert.ToString(dr[1]),
city = Convert.ToString(dr[2]),
gender = Convert.ToString(dr[3])

};


Прежде чем пытаться получить доступ к столбцу строки данных, проверьте, действительно ли этот поток данных существует.
Вы можете проверить что-то вроде-
int noOfCols = dr.Table.Columns.Count;


Для обходного пути вы можете сделать следующее-
Proj addTable = new Proj (){

id = dr.Table.Columns.Count>0 ? Convert.ToString(dr[0]) : String.Empty,
name = dr.Table.Columns.Count>1 ? Convert.ToString(dr[1]) : String.Empty,
city = dr.Table.Columns.Count>2 ? Convert.ToString(dr[2]) : String.Empty,
gender = dr.Table.Columns.Count>3 ? Convert.ToString(dr[3]) : String.Empty

};


Примечание: Я не тестировал этот код и могу содержать синтаксические ошибки.

Надеюсь, это поможет :)


Karthik_Mahalingam

5! для обходного пути

Suvendu Shekhar Giri

Спасибо :)