File temporanei Crystal Report .NET

giovedì 23 febbraio 2006 - 17.41

giacomoD Profilo | Newbie

Salve ragazzi,
c'è qualcuno che conosce in che modo controllare la creazione dei file temporanei (1 file .rpt e 4 file .tmp per ogni report visualizzato) di Crystal Report .NET? I file vengono creati nella cartella "C:\Documents and Settings\NOMEPC\ASPNET\Impostazioni locali\Temp " alla visualizzazione del report in formato PDF e non vengono eliminati alla fine dell'elaborazione.

Oltre al problema delle dimensioni della cartella che aumentano considerevolmente sul server, c'è la questione che non sempre sul server l'applicazione web ha il permesso di andare a scrivere su tale cartella (anzi, mai nel caso di server in hosting!!!), e di conseguenza il report non viene visualizzato, e viene sollevata la seguente eccezzione:
"Error in File C:\DOCUME~1\NOMEPC\ASPNET\IMPOST~1\Temp\temp_cdd732a9-2f15-471e-8130-e724bc3307cf.rpt: Invalid table number."

Apprezzo ogni tipo di consiglio!
Ciao




Giacomo

freeteo Profilo | Guru

ciao,
sinceramente non sono ancora riuscito a cambiare il path dei file temporanei, li prende dal sistema crystal e non c'e' settagio almeno non l'ho trovato.
Per quanto riguarda il problema che non cancella all'uscita parlano proprio qui di questo problema che è stato fixato con service pack:
http://support.businessobjects.com/library/kbase/articles/c2015970.asp

sembra proprio che questa cosa non sia possibile...

cmq sei sicuro che l'utente non abbia accesso alla dir temporanea?
eventualmente hai provato anche mettendo nel web.config "<identity impersonate="true" />"? e specificando delle credenziali ?
Matteo Raumer
MCAD.net ...net addicted :-)
http://blogs.dotnethell.it/freeteo

giacomoD Profilo | Newbie

Ciao freeteo,
grazie al tuo post ho appunto accertato che il problema dei permessi non esiste in questo caso. Infatti senza impersonificazione l'utente NOMEPC\ASPNET ha permessi sufficienti per scrivere in tale cartella (di default), e con impersonificazione l'utente windows anche.

In entrambe i casi i file temporanei vengono scritti nella cartella temporanea, ma quando apro il report dall'applicazione pubblicata sul server di produzione, in questa cartella vengono scritti meno file temporanei di quelli che vengono scritti nellla stessa cartella del server di sviluppo (lanciando l'applicazione pubblicata sul server di sviluppo), e si ha la seguente eccezione:

"Error in File C:\DOCUME~1\NOMEPC\ASPNET\IMPOST~1\Temp\temp_cdd732a9-2f15-471e-8130-e724bc3307cf.rpt: Invalid table number."

Ho notato che il nome del file temp_cdd732a9-2f15-471e-8130-e724bc3307cf.rpt che compare nel messaggio dell'eccezione corrisponde a quello creato nella cartella temporanea. In caso di eccezione però vengono creati 1 file .rpt e 2 file .tmp invece che 1 file .rpt e 5 file .tmp (che vengono creati quando il report viene visualizzato correttamente).

A conferma di tutto ciò sembrerebbe che l'eccezione che viene sollevata non a niente a che vedere con problemi di sicurezza/permessi, ma cosa potrebbe significare??

ciao


Giacomo

freeteo Profilo | Guru

ciao,
"Invalid table number " mi fa pensare che tu da codice dai il datasource ad 1a tabella e questa non ce...prova a controllare questa cosa...

Per settare il datasource alle varie tabelle ti conviene fare 1 foreach dell'insieme mioreport.database.tables e applicare le logoninfo corrette per ognuna...

Matteo Raumer
MCAD ... .net addicted :-)
http://blogs.dotnethell.it/freeteo

giacomoD Profilo | Newbie

Ciao,
la tua indicazione mi ha portato sulla giusta strada.. almeno credo
Controllando bene la creazione delle sorgenti dati del report mi sono accorto che l'istruzione che porta all'errore è quella relativa all'inizializzazione della proporietà Location delle tabelle del report:

For Each t As Table In r.Database.Tables
With crConnectionInfo
.ServerName = server
.DatabaseName = nomeDb
.UserID = userID
.Password = pwd
End With
crTableLogonInfo = t.LogOnInfo
crTableLogonInfo.ConnectionInfo = crConnectionInfo
t.ApplyLogOnInfo(crTableLogonInfo)
t.Location = nomeDbSqlServer & ".dbo." & t.Location.Substring( _
t.Location.LastIndexOf(".") + 1) '<----------- va in errore
Next

In quell'assegnazione imposto, nel caso specifico, il nome del db del server di produzione, al posto di quello predefinito (server di sviluppo). Ho controllato che nel db di produzione esiste sia l'utente dbo (inoltre le SP nell'applicazione usano tale utente e funzionano), sia la tabella che viene impostata come location (è una vista).
Quindi non noto differenze rilevanti per questo caso tra il db di sviluppo, dove tutto funziona, e quello di produzione, dove viene sollevata l'eccezione.
C'è qualcosa che mi sfugge o che non conosco relativa al meccanismo di protezione di SQL Server (circa l'utente dbo) o cos'altro??

ciao
Giacomo

freeteo Profilo | Guru

ciao,
devi provare a debuggare, solo cosi' vedi "al volo" o trascinando nella zona "views" il valore della proprieta "location" della tabella.
Quello che devi fare è di sostituire nella proprieta' location, "tuodatabasedisviluppo" con il nome del nuovo db...
Pero' potrebbe anche essere che non ci sia quel valore,(dipende infatti da che driver hai usato in fase di creazione), allora fai pure a meno di metterlo
Ad ogni modo vai tranquillo che debuggando e guardando passo per passo i valori degli oggetti trovi dove sta l'inghippo

ciao

giacomoD Profilo | Newbie

ciao, scusa il ritardo ma questi giorni ho avuto molto da fare...
Cmq ho capito quello che mi vuoi dire freeteo: forse non sono stato molto chiaro nell'ultimo post, ma volevo dire che debuggando il codice ho notato che il valore della proprietà location viene impostata correttamente, e fino a qui tutto ok. Volevo però far notare che io uso il prefisso "dbo" per specificare il nome della vista che uso come sorgente dati del report, e credo che questo possa povocarmi dei problemi qualora vado a pubblicare il db in altri server SQL, dove magari l'utente "sa" ha una password diversa da quella del mio server SQL...

Infatti facendo alcune prove ho notato, anche se ancora non con la massima chiarezza, che il fulcro del problema è proprio la questione degli utenti di SQL Server.

Vorrei approfondire questo aspetto della sicurezza di SQL server per evitare problemi come questo in futuro: hai (avete) qualche consiglio a proposito e/o qualche indicazione (articoli, post,..)?

Ciao
Giacomo

giacomoD Profilo | Newbie

Provo a riformulare la domanda:
Il fatto di usare il suffisso dbo per indicare i nomi delle Stored Procedures e Viste (es: dbo.nomeSP) può provocare dei problemi (sia con CR.NET che non) in fase di deploy del database su altri db SQL Server (sui quali magari non si ha il permesso di controllare l'utente "sa", come ad esempio un db in hosting)?

E' forse meglio creare un nuovo login personale, creare tutti gli oggetti sotto la proprietà di tale login e poi referenziare tali oggetti con il nome del login come prefisso (in questo modo avrei sempre la possibilità di controllare tale login)?

Forse questo quesito non è molto adatto per questa stanza ma approfitto di questo thread per presentarlo, dato che comunque è ricollegabile al discorso iniziale e, credo, dovrebbe essere un quesito che interessi chiunque sviluppi con SQL Server.

Ciao

Giacomo

Consily Profilo | Newbie

ciao, io ho il tuo stesso problema... hai trovato una soluzione?
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5