30 messaggi dal 21 novembre 2007
Ho un problema per accedere a dei file .dbf utilizzando i driver MS Jet 4.0.

L'errore che visualizzo dalla pagina ASPX (scritta in C#) è il seguente:


System.Data.OleDb.OleDbException - Il modulo di gestione di database Microsoft Jet non è riuscito a trovare l'oggetto 'PLMS_ASSET_LINEE_1.dbf'. Assicurarsi che l'oggetto esista e che il nome e il percorso siano digitati correttamente.

Il modulo di gestione di database Microsoft Jet non è riuscito a trovare l'oggetto 'PLMS_ASSET_LINEE_1.dbf'. Assicurarsi che l'oggetto esista e che il nome e il percorso siano digitati correttamente.


Ho verificato la presenza del file 'PLMS_ASSET_LINEE_1.dbf' nella cartella "C:\CVS\AmProd_WebApp\Am_Dati\plms\migr\backup\d2008.08.26--11.33.22\AM_OPE_100\p2s\ENTE1\PLMS" ed il file esiste.

Grazie in anticipo per i consigli che vorrete darmi.

SCIAUX!!!

SCIAUX!!!
501 messaggi dal 09 giugno 2006
Contributi
Ciao.

Immagino quindi che il problema segnalato nel tuo precedente post non sia stato risolto. Escludendo diritti di lettura/scrittura verso il file inizierei con il verificare se usando il formato "corto" del percorso del file le cose cambiando (il problema sembra essere questo come osservato nei precedenti messaggi).

Dovresti però specificare tutto il percorso nel formato "nome corto" (diciamo tipo DOS) e non la sola parte del nome del file.

Se hai già proveduto ad eseguire questo test allora dovresti postare qualche informazione in più: la parte di codice incriminata, la parte di codice che apre la connessione completa di connection string, lo stack completo dell'eccezione.

Ciao.

.:. Marcello Rutter .:.
30 messaggi dal 21 novembre 2007
Purtroppo non posso accorciare i nomi ne dei file e nemmeno delle directory. La cosa strana è che su un altro pc lo stesso codice funziona regolarmente. Chi lo aveva ha fatto qualcosa a livello di Driver ODBC ma non si ricorda cosa.

Hai qualche idea in merito? Un collega mi diceva di guardare i driver Microsoft Jet 4.1 (io ho la versione 4.0) ma non riesco a trovare nessuna notizia che parli di questa versione.

Comunque grazie mille per l'aiuto che mi darai a prescindere dall'esito.

SCIAUX!!!

SCIAUX!!!
501 messaggi dal 09 giugno 2006
Contributi
Ciao.

Proviamo a ragionare sulla prima ipotesi giusto per poterla escludere. Non hai la necesità di accorciare i nomi dei file nel senso di cambiare nome al file o alle directory per giungere ad esse. Ti è sufficiente convertire il nome del file lungo in nome di file corto. Stranamente che io ricordi .NET non ha una funzione per far questo quindi dobbiamo ricorrere a P/Invoke quindi alle API di Windows. Ti posto una banalissima applicazione (Console, Visual Basic) che dimostra l'uso di tali API.

Imports System.Runtime.InteropServices
Imports System.IO
Imports System.Text

Module Module1

    Sub Main()

        Dim inputPath As String

        Console.Write("Specificare il percorso completo del file: ")
        inputPath = Console.ReadLine()

        Console.WriteLine("Il percorso:")
        Console.WriteLine(inputPath)
        Console.WriteLine("corrisponde a:")
        Console.WriteLine(FSHelper.ToShortPath(inputPath))
        Console.ReadLine()

    End Sub

    Public Class FSHelper

        <DllImport("kernel32.dll", CharSet:=CharSet.Auto, SetLastError:=True)> _
        Public Shared Function GetShortPathName( _
            <MarshalAs(UnmanagedType.LPTStr)> ByVal path As String, _
            <MarshalAs(UnmanagedType.LPTStr)> ByVal shortPath As StringBuilder, _
            ByVal shortPathLength As Integer) As Integer
        End Function

        <DllImport("kernel32.dll", CharSet:=CharSet.Auto, SetLastError:=True)> _
        Public Shared Function GetLongPathName( _
            <MarshalAs(UnmanagedType.LPTStr)> ByVal path As String, _
            <MarshalAs(UnmanagedType.LPTStr)> ByVal longPath As StringBuilder, _
            ByVal shortPathLength As Integer) As Integer
        End Function

        Public Shared Function ToLongPath(ByVal inPath As String) As String

            Dim sb As New StringBuilder(1024)
            Dim i As Integer = GetLongPathName(inPath, sb, sb.Capacity)
            'i = Marshal.GetLastWin32Error()
            Return sb.ToString()

        End Function

        Public Shared Function ToShortPath(ByVal inPath As String) As String

            Dim sb As New StringBuilder(1024)
            Dim i As Integer = GetShortPathName(inPath, sb, sb.Capacity)
            Return sb.ToString()

        End Function

    End Class

End Module


Quindi dovrai convertire la classe FSHelper in C# e usare il metodo ToShortPath per ottenere la versione "corta" del percorso. Se hai dubbi sulla conversione del codice in C# ti posso postare l'esempio in tale linguaggio.

Se con questa prova possiamo escludere che si tratti del problema dei nomi di file 8+3 allora ci concentreremo su altri argomenti.

Alla prossima. Ciao.

.:. Marcello Rutter .:.
30 messaggi dal 21 novembre 2007
Se mi potessi dare l'esempio della classe FSHelper in C# te ne sarei immensamente grato: non conosco il VisualBasic.

SCIAUX!!!
501 messaggi dal 09 giugno 2006
Contributi
Eccola (nota che non è una traduzione letterale del precedente esempio ma un esempio del tutto simile scritto per C#).

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            String inputPath;

            Console.WriteLine("Specificare il percorso completo del file: ");
            inputPath = Console.ReadLine();

            Console.WriteLine("Il percorso:");
            Console.WriteLine(inputPath);
            Console.WriteLine("corrisponde a:");
            Console.WriteLine(FSHelper.ToShortPath(inputPath));
            Console.ReadLine();
        }
    }

    class FSHelper
    {
        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        static extern uint GetShortPathName(
           [MarshalAs(UnmanagedType.LPTStr)] string lpszLongPath,
           [MarshalAs(UnmanagedType.LPTStr)] StringBuilder lpszShortPath,
           uint cchBuffer);

        [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        static extern uint GetLongPathName(
            [MarshalAs(UnmanagedType.LPTStr)] string lpszShortPath,
            [MarshalAs(UnmanagedType.LPTStr), Out] StringBuilder lpszLongPath,
            uint cchBuffer);


        public static string ToLongPath(string shortName)
        {
            uint bufferSize = 256;
            StringBuilder longNameBuffer = new StringBuilder((int)bufferSize);

            uint result = GetLongPathName(shortName, longNameBuffer, bufferSize);

            return longNameBuffer.ToString();
        }


        public static string ToShortPath(string longName)
        {
            uint bufferSize = 256;
            StringBuilder shortNameBuffer = new StringBuilder((int)bufferSize);

            uint result = GetShortPathName(longName, shortNameBuffer, bufferSize);

            return shortNameBuffer.ToString();
        }
    
    }

}


L'occasione è buona per segnalarti una risorsa da aggiungere ai preferiti quando si parla di P/Invoke: http://www.pinvoke.net.

Ciao.

.:. Marcello Rutter .:.
30 messaggi dal 21 novembre 2007
Ciao, ho provato la strada dello shortpath ma non funziona. Ho avuto la conferma da un'altro mio collega che sul pc dove il codice funziona (è identico al mio) erano stati istallati dei Driver ODBC che risolvevano questo problema ma purtroppo nessuno si ricorda quali.

Qualche idea?

SCIAUX!!!
501 messaggi dal 09 giugno 2006
Contributi
Ciao.

Puoi postare la connection string e precisare in quale punto del codice si verifica il problema?

Ciao.

.:. Marcello Rutter .:.

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.