Avatar billede Max Novice
07. december 2005 - 17:33 Der er 27 kommentarer og
1 løsning

DataRow opfattes som array? System.IndexOutOfRangeException

Hej.
Jeg er ret grøn til ASP.NET, så det er sikkert en ret banal fejl jeg har lavet.
Jeg indlæser en log fil i et string-array, som jeg derefter gerne vil smide over i en DataTable, som til sidst gerne skal vises i et DataGrid.
Følgende fejl opstår:

Cannot find column 1.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.IndexOutOfRangeException: Cannot find column 1.

Source Error:


Line 59:                for (int i = 0; i < strFields.Length; i++)
Line 60:                {
Line 61:                    dr[i] = strFields[i];
Line 62:                    Response.Write("Efter Row er tilføjet");
Line 63:

--

I får lige koden.
Min aspx fil :

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form method="post" runat="server">
        <div>
            <asp:Button ID="btnAabn" runat="server" Text="Åbn log-fil" OnClick="btnAabn_Click" />
            <asp:DataGrid ID="dgLog" runat="server" AutoGenerateColumns="false">
            </asp:DataGrid>
            <br />
        </div>
    </form>
</body>
</html>

--

Min cs fil :

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.IO;
//using System.Data.SqlClient;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void btnAabn_Click(object sender, EventArgs e)
    {
        Response.Write("Start");
        int testest = 0;
        String tmpSti = "c:\\";
        String tmpFil = "ex051207.log";
        TextReader trLogFile = new StreamReader(tmpSti + tmpFil, System.Text.Encoding.Default);
        DataTable dt = new DataTable();
        DataRow dr;
        while (true)
        {
            Response.Write("Efter TextReader er åbnet");
            bool arg = true;
            string[] strFields;
            char[] separators = { ' ' };
            string strLine = trLogFile.ReadLine();
            if (strLine == null) break;
            if (strLine.Substring(0, 1).Equals("#"))
            {
                if (strLine.Substring(0, 8).Equals("#Fields:"))
                {
                    strFields = strLine.Split(separators);
                    for (int i = 0; i < strFields.Length; i++)
                    {
                        if (i > 0)
                        {
                            if (arg) dt.Columns.Add(new DataColumn(strFields[i], typeof(string)));
                            arg = false;
                            Response.Write("Efter columns er tilføjet");
                        }
                    }
                }
            }
            else
            {
                Response.Write("Start på tilføj Rows");
                testest++;
                strFields = strLine.Split(separators);
                dr = dt.NewRow();
                for (int i = 0; i < strFields.Length; i++)
                {
                    dr[i] = strFields[i];
                    Response.Write("Efter Row er tilføjet");
                }
                dt.Rows.Add(dr);
                dt.AcceptChanges();
                Response.Write("Efter accept af tilføjelse");
            }
            DataView dv = new DataView(dt);
            dgLog.DataSource = dv;
            dgLog.DataBind();
            Response.Write("Efter databind");
        }
        trLogFile.Close();
        Response.Write("Efter TextReader er lukket");
        Response.Write("Slut");
    }
}

--

Jeg har kigget på problemet hele dagen, og kan ikke se løsningen.
Håber I kan hjælpe.

Mvh.
/Mnc
Avatar billede dr_chaos Nybegynder
07. december 2005 - 17:38 #1
er du sikker på at der er tilføjet columns til din datatable ?
Avatar billede Max Novice
07. december 2005 - 17:41 #2
Nej. Som sagt : ret grøn til det her.. Hvordan bliver jeg sikker på det?
Avatar billede dr_chaos Nybegynder
07. december 2005 - 17:46 #3
ser du nogensinde denne meddelelse :

Efter columns er tilføjet
Avatar billede Max Novice
07. december 2005 - 17:47 #4
Altså, log-filen bliver indlæst, og indholdet af filen er også sådan, at de forskellige funktioner bliver kørt.
Avatar billede Max Novice
07. december 2005 - 17:48 #5
?
Avatar billede Max Novice
07. december 2005 - 17:49 #6
nåh, undskyld. nej. den viser bare fejlsiden, når jeg klikker på knappen.
Avatar billede dr_chaos Nybegynder
07. december 2005 - 17:51 #7
prøv lige at udkommenterer denne del:
dr[i] = strFields[i];
og kør siden igen.
Avatar billede Max Novice
07. december 2005 - 17:54 #8
Server Error in '/' Application.
--------------------------------------------------------------------------------

A column named 'date' already belongs to this DataTable.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.Data.DuplicateNameException: A column named 'date' already belongs to this DataTable.

Source Error:


Line 42:                        if (i > 0)
Line 43:                        {
Line 44:                            if (arg) dt.Columns.Add(new DataColumn(strFields[i], typeof(string)));
Line 45:                            arg = false;
Line 46:                        }


Source File: Default.aspx.cs    Line: 44
Avatar billede dr_chaos Nybegynder
07. december 2005 - 17:58 #9
prøv lige at poste din log fil.
så laver jeg lige noget kode som virker.
Arbejder du i asp.net 1.1 eller 2.0
hvis du bruger visual studio 2005 er det 2.0 eller 1.1
Avatar billede Max Novice
07. december 2005 - 17:59 #10
Logfilen er opbygget således, at der er flere instancer af de linjer, som starter med #

F.eks.

#Fields: date time ip method ...
2005-12-07 18:05:12 12.12.12.12 GET ...
2005-12-07 18:05:12 12.12.12.12 GET ...
2005-12-07 18:05:12 12.12.12.12 GET ...
2005-12-07 18:05:12 12.12.12.12 GET ...
#Fields: date time ip method ...
2005-12-07 18:05:12 12.12.12.12 GET ...
2005-12-07 18:05:12 12.12.12.12 POST ...
2005-12-07 18:05:12 12.12.12.12 POSt ...
2005-12-07 18:05:12 12.12.12.12 GET ...

etc.
Avatar billede Max Novice
07. december 2005 - 18:00 #11
Visual Studio 2005 Express.
.NET 2.0
Avatar billede Max Novice
07. december 2005 - 18:01 #12
Der er dog flere forskellige #-linjer, etc.
Avatar billede Max Novice
07. december 2005 - 18:02 #13
Havde det til at virke inden jeg begyndte at bruge DataTable. Prøvede Response.Write(..)'e det ud på min side, og det virkede fint med hele log-filen..
Avatar billede Max Novice
07. december 2005 - 18:04 #14
Ups, Visual Web Developer 2005 Express mente jeg.. ;)
Avatar billede dr_chaos Nybegynder
07. december 2005 - 18:19 #15
nu virker det :)
Avatar billede dr_chaos Nybegynder
07. december 2005 - 18:19 #16
aspx fil:


<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title></title>
</head>
<body>
    <form id="Form1" method="post" runat="server">
        <div>
            <asp:Button ID="btnAabn" runat="server" Text="Åbn log-fil" OnClick="btnAabn_Click" />
            <asp:DataGrid ID="dgLog" runat="server" AutoGenerateColumns="true">
            </asp:DataGrid>
            <br />
        </div>
    </form>
</body>
</html>
Avatar billede dr_chaos Nybegynder
07. december 2005 - 18:19 #17
codebehind:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.IO;
//using System.Data.SqlClient;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void btnAabn_Click(object sender, EventArgs e)
    {
        Response.Write("Start");
        int testest = 0;
        String tmpSti = "c:\\";
        String tmpFil = "ex051207.log";
        TextReader trLogFile = new StreamReader(tmpSti + tmpFil, System.Text.Encoding.Default);
        DataTable dt = new DataTable();
        DataRow dr;
        while (true)
        {
            Response.Write("Efter TextReader er åbnet");
            bool arg = true;
            string[] strFields;
            char[] separators = { ' ' };
            string strLine = trLogFile.ReadLine();
            if (strLine == null) break;
           
                if (strLine.Substring(0, 8).Equals("#Fields:"))
                {
                    strFields = strLine.Split(separators);
                    for (int i = 0; i < strFields.Length; i++)
                    {
                        if (i > 0)
                        {
                            if(!dt.Columns.Contains(strFields[i]))
                            {
                            dt.Columns.Add(new DataColumn(strFields[i], typeof(string)));
                           
                            //Response.Write("Efter columns er tilføjet");
                            //System.Diagnostics.Debug.WriteLine(strFields[i]);
                            }
                        }
                    }
                }
           
            else
            {
                Response.Write("Start på tilføj Rows");
                testest++;
                strFields = strLine.Split(separators);
                dr = dt.NewRow();
                for (int i = 0; i < strFields.Length; i++)
                {
                    dr[i] = strFields[i];
                    Response.Write("Efter Row er tilføjet");
                }
                dt.Rows.Add(dr);
                dt.AcceptChanges();
                Response.Write("Efter accept af tilføjelse");
            }
         
            Response.Write("Efter databind");
        }
        trLogFile.Close();
        DataView dv = new DataView(dt);
        dgLog.DataSource = dv;
        dgLog.DataBind();
        Response.Write("Efter TextReader er lukket");
        Response.Write("Slut");
    }
}
Avatar billede Max Novice
07. december 2005 - 18:25 #18
Øh, nej. (?)
Avatar billede Max Novice
07. december 2005 - 18:26 #19
Nu siger den bare :

Cannot find column 0.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.IndexOutOfRangeException: Cannot find column 0.

Source Error:


Line 62:                for (int i = 0; i < strFields.Length; i++)
Line 63:                {
Line 64:                    dr[i] = strFields[i];
Line 65:                    Response.Write("Efter Row er tilføjet");
Line 66:                }


Source File: Default.aspx.cs    Line: 64
Avatar billede Max Novice
07. december 2005 - 18:28 #20
Kan jeg evt. sende dig den rigtige log-fil på en eller anden måde?
Avatar billede dr_chaos Nybegynder
07. december 2005 - 18:28 #21
prøv lige at sende mig hele din log fil.
til super_transhans@hotmail.com
Avatar billede dr_chaos Nybegynder
07. december 2005 - 18:28 #22
:)
Avatar billede Max Novice
07. december 2005 - 18:30 #23
.. det kan godt være det ikke har noget med det at gøre, men nogle strenge i hver linje kan godt være ens.. der kan f.eks. være 3 strenge, der alle tre er et minustegn.
Avatar billede Max Novice
07. december 2005 - 18:30 #24
kommer her.
Avatar billede Max Novice
07. december 2005 - 18:42 #25
Har du modtaget den?
Avatar billede dr_chaos Nybegynder
07. december 2005 - 18:43 #26
ja
ny codebehind fil:

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.IO;
using System.Text.RegularExpressions;
//using System.Data.SqlClient;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
     
    }

    protected void btnAabn_Click(object sender, EventArgs e)
    {
        Response.Write("Start");
        int testest = 0;
        String tmpSti = "c:\\";
        String tmpFil = "ex051207.log";
        TextReader trLogFile = new StreamReader(tmpSti + tmpFil, System.Text.Encoding.Default);
        DataTable dt = new DataTable();
        DataRow dr;
        while (true)
        {
            string[] strFields;
            char[] separators = { ' ' };
            string strLine = trLogFile.ReadLine();
            if (strLine == null) break;
            if (strLine.Substring(0, 1).Equals("#"))
            {
                if (strLine.Substring(0, 8).Equals("#Fields:"))
                {
                    strFields = strLine.Split(separators);
                    for (int i = 0; i < strFields.Length; i++)
                    {
                        if (i > 0)
                        {
                            if (!dt.Columns.Contains(strFields[i]) && !string.IsNullOrEmpty(strFields[i]))
                            {
                                dt.Columns.Add(new DataColumn(strFields[i], typeof(string)));

                                //Response.Write("Efter columns er tilføjet");
                                //System.Diagnostics.Debug.WriteLine(strFields[i]);
                            }
                        }
                    }
                }
            }
            else
            {
                //Response.Write("Start på tilføj Rows");
                testest++;
                strFields = strLine.Split(separators);
                dr = dt.NewRow();
                for (int i = 0; i < strFields.Length; i++)
                {
                    dr[i] = strFields[i];
                    //Response.Write("Efter Row er tilføjet");
                }
                dt.Rows.Add(dr);
                //
              // Response.Write("Efter accept af tilføjelse");
            }
         
            //Response.Write("Efter databind");
        }
        dt.AcceptChanges();
        trLogFile.Close();
        DataView dv = new DataView(dt);
        dgLog.DataSource = dv;
        dgLog.DataBind();
        //Response.Write("Efter TextReader er lukket");
        //Response.Write("Slut");
    }
}
Avatar billede Max Novice
07. december 2005 - 18:51 #27
Lækkert! :)
Kigger lige lidt på de ændringer du har lavet. Smid et svar, så falder der nogle meget velfortjente points!

Mange tak for hjælpen.
Avatar billede dr_chaos Nybegynder
07. december 2005 - 19:04 #28
svar :)
glad for at det virker.
jeg brugte
if (!dt.Columns.Contains(strFields[i]) && !string.IsNullOrEmpty(strFields[i]))
for at den ikke skulle tilføje en column der allerede eksisterer og for at den ikke skal tilføje en column i tilfælde af en tom streng.

derudover flyttede jeg data bind til gridviewet ned så alt data er bundet til datatable før det ligges i gridviewet.

Derudover er er autgeneratecolumns sat til true.
tror ikke jeg lavede så meget andet.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester