-
dataset et excel
Bonjour,
je suis en train de développer une application avec C# .NET 2.0
je doit récupérer des données depuis un fichier excel puis les mettre dans ma base
J'ai utilisé un dataset pour récupérer les lignes de mon fichier excel, ça marche bien mais le problème est que j'utilise de gros fichiers excel (ça peut atteindre plus que 64000 lignes) et mon dataset n'arrive à lire que 14877 lignes puis il m'affiche le message suivant : "L'index et le longueur doivent faire référence à un emplacement situé dans la chaine. Nom du paramètre : length"
j'ai essayé avec un autre fichier excel et le nombre de lignes traitées reste le même.
est ce que je peut redimentionner le dataset ou découper le fichier excel??
est ce que quelq'un peut m'aider svp c'est urgent
-
Le message que tu obtiens indique que l'index que tu utilises pour parcourir ton dataset n'est pas correct.
J'ai utilisé des dataTables contenant plus d'un million de lignes, et il n'y a pas eu de problèmes.
Vérifie que cet index est bien incrémenté.
Sinon, si le problème vient du fichier excel, tu peux essayer de créer une nouvelle feuille quand tu atteins un certain nombre de lignes
-
voila mon code, je ne crois pas qu'il y a un problème avec l'index:
try
{
LireDeExcel excelReader = new LireDeExcel(args[0], reqeuteExcel);
LireDeBD dbReader = new LireDeBD(requeteBD, n);
foreach(DataRow excelDataRow in excelReader.MyDataSet.Tables[0].Rows)
{
int testEqualite=0; //tester si un enregistrement de la table excel existe déja dans la base
string[] ExcelElement = new string[m]; //Contient les valeurs à ajouter dans la base
//Pour éliminer les espaces au début et à la fin des elements extraits du fichier excel
//Puis les mettre dans un tableau
for (int k = 0; k < 3; k++)
{
ExcelElement[k] = excelDataRow[k].ToString().TrimStart(' ').TrimEnd(' ');
}
//Séparer le BIN du numero Client dans le numero de carte
ExcelElement[3] = ExcelElement[2].Substring(6, 10); //numero Client
ExcelElement[2] = ExcelElement[2].Substring(0, 6); //numero bin
for (int k = 4; k < t; k++)
{
ExcelElement[k] = excelDataRow[k-1].ToString().TrimStart(' ').TrimEnd(' ');
}
//Extraire le nom du protocole du nom du magasin
ExcelElement[4] = new Protocole().Exist(ExcelElement[4]);
foreach (DataRow dbDataRow in dbReader.MyDataSet[0].Tables[0].Rows)
{
testEqualite = 0;
for (int i = 0; i < 4; i++)
{
if (ExcelElement[i] == dbDataRow[i].ToString())
{
//si l'enregistrement existe déja, on aura testEgalite=4
testEqualite++;
}
}
if (testEqualite == 4)
{
//Pas besoin de terminer le parcours de la table de la base
break;
}
}
//Si l'enregistrement n'existe pas dans la base
if (!(testEqualite == 4))
{
//Traitement d'ajout de l'enregistrement à la base
AjouterDansBD newRow = new AjouterDansBD(requeteAjout, ExcelElement);
}
}
}
catch (Exception exc)
{
Console.WriteLine(exc.Message);
}
-
et voila la classe qui permet de lire du fichier excel:
class LireDeExcel
{
//Variable de connection au fichier excel
private OleDbConnection con;
public OleDbConnection Con
{
get { return con; }
set { con = value; }
}
//Variable dans laquelle on va enregistrer les données extraites du fichier excel
private DataSet myDataSet;
public DataSet MyDataSet
{
get { return myDataSet; }
set { myDataSet = value; }
}
public LireDeExcel( string fileName, string requete)
{
DataSet ds = new DataSet();
con = new OleDbConnection(
"provider=Microsoft.Jet.OLEDB.4.0;data source= " + fileName + ";Extended Properties=Excel 8.0;");
OleDbDataAdapter myCommand = new OleDbDataAdapter(requete, con);
try
{
myCommand.Fill(ds);
MyDataSet = ds;
}
catch(Exception e)
{
Console.WriteLine(e.ToString());
}
finally
{
con.Close();
}
}
}
-
j'ai trouvé la solution, mon code est correct mais il y avait une erreur dans le format d'une ligne dans le fichier excel (la ligne 14877 ;) )