30 messaggi dal 21 novembre 2007
Ciao, questa è la connectionstring completa:

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\CVS\AmProd_WebApp\Am_Dati\plms\migr\backup\d2008.09.01--09.25.18\AM_OPE_101\p2s\ENTE1\PLMS\;Extended Properties=dBase III

Questo è il codice dove va in errore:

public EntityImport getAssetLinee(EntityImport entity)
{
DbConnection conn = null;
DbDataReader reader = null;
DbCommand cmd;

string filename = "PLMS_ASSET_LINEE_" + entity.AmEnte.ID_ENTE.ToString() + ".dbf";

try
{
FileInfo fi = new FileInfo(_pathDbf + "\\" + filename);
if (!fi.Exists)
throw new Exception("Errore in scrittura: file non trovato " + filename);

string sql = "select * from " + filename;
conn = _oleFactory.CreateConnection();
conn.Open();
cmd = _oleFactory.CreateCommand(sql, conn);
reader = cmd.ExecuteReader();

if (reader.HasRows)
{
if (entity == null) entity = new EntityImport();
if (entity.AmAsset == null) entity.AmAsset = new ArrayList();
while (reader.Read())
{
entity.AmAsset.Add(setMigAssetLinee(reader));
}
}
}
catch (Exception ex)
{
throw new PLMSException(ex);
}
finally
{
if (reader != null)
reader.Close();
if (conn != null)
conn.Close();
}

return entity;
}


L'errore viene dato all'istruzione "reader = cmd.ExecuteReader();". Il bello è che il test "if (!fi.Exists)" restituisce true con questi dati:

_pathDbf - C:\CVS\AmProd_WebApp\Am_Dati\plms\migr\backup\d2008.09.01--09.25.18\AM_OPE_101\p2s\ENTE1\PLMS\

filename - PLMS_ASSET_LINEE_1.dbf


Questo è tutto, fammi sapere se hai qualche idea.

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

Siccome non ho esempi concreti simili al tuo caso ho cercato di riprodurne uno. Nel mio PC riesco a simulare qualcosa di simle al tuo problema cercando di aprire un file .dbf (ne ho preso uno da Microsoft Office) il cui percorso contenga nomi lunghi e caratteri particolari (esempio il "." nella directory).

Sono riuscito a risolvere il problema cambiando l'istruzione SQL e forse questa soluzione funziona anche per te. Ecco la riga corretta:

string sql = "select * from [" + filename + "]";


Ho provato usando il nome di file lungo e il nome di file corto e funziona in entrambi i casi. Senza l'uso delle parentesi quadre, invece, ottengo la stessa tua eccezione.

Spero funzioni anche per te.

Ciao.

.:. Marcello Rutter .:.
30 messaggi dal 21 novembre 2007
Ciao mrdev, ho fatto la modifica che mi hai detto tu aggiungendo le parentesi quadre ma il risultato è lo stesso.

Per una verifica ho copiato il contenuto della variabile "_pathDbf" e poi ho aggiunto il "filename" copiando il tutto su clipboard e poi ho incollato il tutto su "start\esegui" e... magia, si è aperto il file .dbf

C'è qualcos'altro sotto, ma a quanto pare a te non si verifica. Forse hai qualcosa istallato che io non ho (driver ODBC o altro).

SCIAUX!!!
501 messaggi dal 09 giugno 2006
Contributi
Non credo o almeno non qualcosa che abbia installato io volontariamente (considera che uso Windows Vista, VS 2008,).

L'altra ipotesi potrebbe essere dovuta al fatto che la pagina ASPX non ha diritti di lettura/scrittura sulla directory dei dati (il semplice FileExists non è sufficiente per determinare tale condizione). In questo caso dovresti ricorrere alle CAS (Code Access Security, vedi http://msdn.microsoft.com/en-us/library/930b76w0(VS.80).aspx o anche questo http://www.devx.com/vb2themax/Article/19886/1954). Ma per non complicarci troppo la vita potresti banalmente provare ad aprire il file usando un oggetto FileStream (sempre che tu non abbia già la certezza matematica di possedere i diritti richiesti).

Nel frattempo ti posto il codice completo dell'esempio che ho usato per tentare di simulare il tuo caso (Application Console in C#). Sostituendo i vari percorsi potresti usare questo codice per verificare se da te funziona o meno.

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Data;
using System.Data.OleDb;
using System.Data.Common;
using System.Runtime.InteropServices;

namespace ConsoleApplication1
{
    class Program
    {
        static string _pathDbf = @"C:\???\???\???\???\dbf.1_2";
        static string cnnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0}\\;Extended Properties=dBase III";

        static void Main(string[] args)
        {
            Console.WriteLine("Letto valore: {0}", getItem());
            Console.ReadLine();
        }

        static public String getItem()
        {
            OleDbConnection conn = null;
            DbDataReader reader = null;
            OleDbCommand cmd;

            string filename = "CUSTOMER_12345678-1.25.DBF";
            string firstField = null;

            try
            {
                bool simulaErrore = false;
                string fullPathFull, fullPathShort;

                fullPathFull = Path.Combine(_pathDbf, filename);

                if (simulaErrore)
                {
                    fullPathShort = fullPathFull;
                }
                else
                {
                    // Ottengo il nome del file in versione SHORT
                    fullPathShort = FSHelper.ToShortPath(fullPathFull);
                    // Riassegno i valori nel formato "short" alle rispettive variabili
                    _pathDbf = FSHelper.ToShortPath(_pathDbf);
                    // Notare l'uso delle p.quadre "[" e "]".
                    // In teoria usando le quadre il nome del file funziona anche nel formato lungo
                    filename = "[" + Path.GetFileName(fullPathShort) + "]";
                }

                cnnStr = string.Format(cnnStr, _pathDbf);
                FileInfo fi = new FileInfo(fullPathShort);
                if (!fi.Exists)
                    throw new Exception("Errore in scrittura: file non trovato " + filename);

                // Specifico il nome del file tra parentesi quadre.
                string sql = "select * from " + filename;
                conn = new OleDbConnection(cnnStr);
                conn.Open();
                cmd = new OleDbCommand(sql, conn);
                reader = cmd.ExecuteReader();

                if (reader.Read())
                {
                    firstField = Convert.ToString(reader.GetValue(0));
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
            finally
            {
                if (reader != null)
                    reader.Close();
                if (conn != null)
                    conn.Close();
            }

            return firstField;
        }

    }

    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();
        }

    }
}


Ciao.

.:. Marcello Rutter .:.
30 messaggi dal 21 novembre 2007
Windows Vista dovrebbe avere i driver odbc più aggiornati rispetto a Windows XP SP2 che utilizzo io. Adesso ho quasi la certezza che sia quello il problema.

Le pagine hanno gli stessi diritti di accesso a tutte le directory lo testimonia il fatto che lo stesso codice (lo stesso progetto) su un altro pc funziona egregiamente.

Se hai qualche altra idea....

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

Scusa ma sono stato un po' preso. Volevo fare una prova su una macchina XP ma non sono ancora riuscito a tirarla sù. Se puoi/vuoi aspettare proverò nei prossimi giorni.

Intanto se il problema fosse di versione dei driver ODBC potresti provare ad installare qualche service pack di Jet Engine (es. SP8 che trovi qui http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=2deddec4-350e-4cd0-a12a-d7f70a153156).

Forse l'installazione di qualche prodotto Office potrebbe implicitamente risolvere il problema.

Nel frattempo sto approfondendo il tuo caso: ti posto ancora in caso di novità.

Alla prossima.

Ciao.

.:. Marcello Rutter .:.
501 messaggi dal 09 giugno 2006
Contributi
Ciao.

Ho fatto qualche altra prova su un PC con XP Pro SP2, Office 2000: il risultato è lo stesso ossia senza le "[]" solleva l'eccezione, usandole tutto va bene.

Per il momento non mi viene in mente altro che non abbia già scritto ma farò qualche ulteriore test giusto per capire l'origine del problema.

Ciao.

.:. Marcello Rutter .:.
30 messaggi dal 21 novembre 2007
Ciao, Scusa se non mi sono fatto sentire nemmeno io ma questi giorni non ho avuto tempo. Appena posso provo con i service pack che mi hai suggerito e poi ti faccio sapere.

Ciao e grazie dell'aiuto che mi dai.

SCIAUX!!!

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.