Title: Message
Hi Christophe,

No, it apparently doesn't change anything. I didn't expect so, I was looking for possible side effects. None such seems evident, however.

Just to be very specific, your dt.Rows.Count reflects how many lines were added to dt, not how many were read from your MapInfo table.

Try outputting the value of "jj" to see whether it has the correct value or not. It may be an un-trapped error in the dt.Rows.Add(nr)  statement.

--

Regarding your original question, the question could just as well be whether your data retrieval (e.g. mapinfo.Eval(nom_layer + ".COL" + i.ToString ) is the source of a side effects, rather than whether ColumnInfo() is. It's a more likely scenario in my opinion.

Try removing all data retrieval statements, and see whether the problem persists.

HTH

Best regards / Med venlig hilsen
Lars I. Nielsen
GisPro


Christophe Brabant wrote:
complete code, with datarows added
this changes absolutly nothing to my problem, but of course, with the first version of this code, dt.rows.count will always be 0 !
 
storing the rowid of each row, then fetching this rowid just before fetching the next row, solves the problem
 
the same code directly with MapBasic works fine, without storing and fetching RowId
 
Christophe
 
-----Message d'origine-----
De : [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]] De la part de Christophe Brabant
Envoyé : mercredi 2 août 2006 09:21
À : [email protected]
Objet : [MI-L] Fetch and table cursor position with Integrated Mapping

Hi everyone, still a strange phenomen....
 
Does the ColumnInfo statment affect the current cursor position in a table ?
 
Look at the following sample, written in VB.NET :
 
========================================================================================
 
    Public Sub Test(ByVal nom_layer As String)
        Dim msg As String
        Dim nom_col As String
        Dim dt As DataTable
        Dim nb_cols As Short
        Dim i As Short
        Dim type_col As Short
        Dim col_type As System.Type
        Dim nb_rows As Integer
        Dim j As Integer
        Dim log_val As String
        Dim rowid As Integer        ' **************FOR FIXING BUG***********
        Dim jj As Integer 
        Dim nr As DataRow 
 
        Try
            msg = "TableInfo(" + nom_layer + "," + TAB_INFO_NROWS.ToString + ")"
            jj = mapinfo.eval(msg)
            Console.WriteLine("nb rows into " + nom_layer + " : " + jj.ToString)
 
            mapinfo.Do("Fetch First From " + nom_layer)
 
            jj = 0
            While (mapinfo.Eval("EOT(" + nom_layer + ")") = "F")
                mapinfo.Do("Fetch Next From " + nom_layer)
                jj += 1
            End While
            Console.WriteLine("nb rows processed at EOT : " + jj.ToString)
 
            msg = "TableInfo(" + nom_layer + "," + TAB_INFO_NCOLS.ToString + ")"
            nb_cols = mapinfo.eval(msg)
 
            dt = New DataTable(nom_layer)
 
            For i = 1 To nb_cols
                msg = "ColumnInfo(" + nom_layer + "," + """" + "COL" + i.ToString + """" + "," _
                    + COL_INFO_NAME.ToString + ")"
                nom_col = mapinfo.eval(msg)
 
                msg = "ColumnInfo(" + nom_layer + "," + """" + nom_col + """" + "," _
                    + COL_INFO_TYPE.ToString + ")"
                type_col = mapinfo.eval(msg)
 
                Select Case type_col
                    Case COL_TYPE_CHAR
                        col_type = System.Type.GetType("System.String")
                    Case COL_TYPE_DECIMAL
                        col_type = System.Type.GetType("System.Decimal")
                    Case COL_TYPE_INTEGER
                        col_type = System.Type.GetType("System.Int32")
                    Case COL_TYPE_SMALLINT
                        col_type = System.Type.GetType("System.Int16")
                    Case COL_TYPE_DATE
                        col_type = System.Type.GetType("System.DateTime")
                    Case COL_TYPE_LOGICAL
                        col_type = System.Type.GetType("System.Boolean")
                    Case COL_TYPE_FLOAT
                        col_type = System.Type.GetType("System.Double")
                    Case COL_TYPE_GRAPHIC  ' special column 'Obj' : nothing to do
                        GoTo next_column
                    Case Else               ' unknown type
                        MessageBox.Show("Table " + nom_layer _
                            + " : impossible de déterminer le type de la colonne '" + nom_col + "'.", _
                            "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error)
                End Select
 
                dt.Columns.Add(nom_col, col_type)
 
next_column:
 
            Next
 
            mapinfo.Do("Fetch First From " + nom_layer)
 
            jj = 0
            While (mapinfo.Eval("EOT(" + nom_layer + ")") = "F") 
                nr = dt.NewRow() 
                'rowid = mapinfo.eval(nom_layer + ".RowId")            ' **************FOR FIXING BUG***********
 
                For i = 1 To nb_cols
                    msg = "ColumnInfo(" + nom_layer + "," + """" + "COL" + i.ToString + """" + "," _
                        + COL_INFO_TYPE.ToString + ")"
                    type_col = mapinfo.eval(msg) 
 
                    Select Case type_col
                        Case COL_TYPE_CHAR, COL_TYPE_INTEGER, COL_TYPE_SMALLINT, COL_TYPE_DATE
                            nr(i - 1) = mapinfo.Eval(nom_layer + ".COL" + i.ToString)
                        Case COL_TYPE_LOGICAL
                            log_val = mapinfo.Eval(nom_layer + ".COL" + i.ToString)
                            If log_val = "T" Then
                                nr(i - 1) = True
                            Else
                                nr(i - 1) = False
                            End If
                        Case COL_TYPE_DECIMAL
                            Dim v As String
                            v = mapinfo.Eval(nom_layer + ".COL" + i.ToString)
                            nr(i - 1) = CType(v.Replace("."c, ","c), Decimal)
                        Case COL_TYPE_FLOAT
                            Dim v As String
                            v = mapinfo.Eval(nom_layer + ".COL" + i.ToString)
                            nr(i - 1) = CType(v.Replace("."c, ","c), Double)
                    End Select
 
                Next 
 
                dt.Rows.Add(nr) 
 
                'mapinfo.do("Fetch Rec " + rowid.ToString + " From " + nom_layer)            ' **************FOR FIXING BUG***********
                mapinfo.Do("Fetch Next From " + nom_layer)
 
                jj += 1
            End While
 
            dt.AcceptChanges()
 
            Console.WriteLine("table:" + dt.Rows.Count.ToString)
 
        Catch ex As Exception
            Fonctions_diverses.DisplayException(ex)
        End Try
    End Sub
========================================================================================
 
The output is :
 
nb rows into Monde7 : 252 ==> OK
nb rows processed at EOT : 252 ==> OK
table:133 (for example, or 365, or 411, etc....) ==> should be 252 !
 
========================================================================================
 
ColumnInfo statment, with COL_INFO_TYPE paramater, seems to affect current cursor position into the Monde7 table (world7 in english)
sometimes forward, sometimes backward, and by this way, due to the 'While (mapinfo.Eval("EOT(" + nom_layer + ")") = "F")' _expression_, the number of lines processed is greater or lower than the true value, who is 252 !
 
To fix that, I had to add the two lines marked with **************FOR FIXING BUG*********** in the code.
 
Any idea ?
 
Thank you - Chris

_______________________________________________ MapInfo-L mailing list [email protected] http://www.directionsmag.com/mailman/listinfo/mapinfo-l


_______________________________________________
MapInfo-L mailing list
[email protected]
http://www.directionsmag.com/mailman/listinfo/mapinfo-l

Reply via email to