Problema con SqlConnection

sabato 05 agosto 2006 - 11.21

Carmine Profilo | Junior Member

Salve a tutti,
Allora, mi collego a un server SQLExpress locale così:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Il problema è che al momento di aprire la connessione dice che il file del database è già in uso da un altro processo...
Se riavvio SQLExpress si risolve, ma solo per una volta. Poi quando riprovo ad aprire la connessione in un altra routine dice sempre che il file è già utilizzato da un altro processo.
Che sbaglio? Come risolvo?
Il bello è che non accade sempre ma di solito dopo che uso SQL Management Studio o faccio una qualsiasi modifica al database.

Infine, già che ci sono, perchè questa istruzione:
DataTable1.Rows(0).Item(0)
Mi restituisce il nome della colonna invece di restituirmi il valore del campo associato a quella determinata riga e colonna?
Webmaster di thetotalsite.it
Blog: blog.thetotalsite.it
La nuova community: forum.thetotalsite.it

lbenaglia Profilo | Guru

>Allora, mi collego a un server SQLExpress locale così:
>
>Dim conn As New Data.SqlClient.SqlConnection("Server=.\SQLExpress;AttachDbFilename=h:\programmi\Microsoft
>SQL Server\MSSQL.1\MSSQL\DATA\prove.mdf;Database=provex;Trusted_Connection=Yes;")
>
> conn.Open()
>
>Il problema è che al momento di aprire la connessione dice che
>il file del database è già in uso da un altro processo...

Ciao Carmine,

il comando AttachDbFilename serve per collegare il database all'istanza SQL Express.
Dato che devi semplicemente aprire una connessione ad un database già collegato alla tua istanza, è sufficiente specificare il nome del catalogo (ovvero del database) nel seguente modo:

"Data Source=.\SQLExpress;Initial Catalog=provex;Integrated Security=SSPI;"

- Data Source equivale a Server;
- Initial Catalog è il nome del database;
- Integrated Security=SSPI equivale a Trusted_Connection=Yes

Quando hai dubbi sulle stringhe di connessione fai riferimento al seguente sito:
http://www.connectionstrings.com/

>Infine, già che ci sono, perchè questa istruzione:
>DataTable1.Rows(0).Item(0)
>Mi restituisce il nome della colonna invece di restituirmi il
>valore del campo associato a quella determinata riga e colonna?

Se vuoi recuperare i valori relativi alla prima riga e alla prima colonna di una datatable, utilizza la seguente sintassi:

DataTable1.Rows(0)(0)

(anche se io preferisco sempre specificare il nome della colonna)
Per maggiori info:
http://msdn2.microsoft.com/en-us/library/system.data.datarowcollection.item.aspx

Ciao!

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

Carmine Profilo | Junior Member

Mhm perfetto grazie!
Ora la connessione funziona perfettamente.

Invece il problema della datatable rimane :(
Ma forse sbaglio a caricare i dati nella datatable... io faccio così:

Dim command As New Data.SqlClient.SqlCommand("SELECT * FROM tabella", conn) command.ExecuteNonQuery() DataTable1 = command.ExecuteReader.GetSchemaTable()

Sbaglio?
Webmaster di thetotalsite.it
Blog: blog.thetotalsite.it
La nuova community: forum.thetotalsite.it

lbenaglia Profilo | Guru

>Ma forse sbaglio a caricare i dati nella datatable... io faccio
>così:
>
>
>Dim command As New Data.SqlClient.SqlCommand("SELECT * FROM tabella",
>conn)
> command.ExecuteNonQuery()
> DataTable1 = command.ExecuteReader.GetSchemaTable()
>
>Sbaglio?

MSDN riporta che: "È possibile utilizzare il metodo ExecuteNonQuery per eseguire operazioni di catalogo (ad esempio, eseguire query sulla struttura di un database o creare oggetti del database quali tabelle) oppure modificare i dati contenuti in un database senza utilizzare un oggetto DataSet eseguendo le istruzioni UPDATE, INSERT o DELETE".
http://msdn2.microsoft.com/it-it/library/system.data.sqlclient.sqlcommand.executenonquery.aspx

Quindi, a meno di voler eseguire comandi DML oppure recuperare lo schema di una tabella (esattamente quello che hai fatto tu), il metodo ExecuteNonQuery non è adatto al tuo scopo.
Se intendi ad esempio popolare una lista in una applicazione web, sarebbe consigliabile effettuare una query server side, forward-only ed in sola lettura (il classico cursore firehose).
Il metodo ExecuteReader della classe SqlCommand ti permette di ottenere un oggetto di classe SqlDataReader in grado di eseguire velocissime query su un database.
http://msdn2.microsoft.com/it-it/library/system.data.sqlclient.sqlcommand.executereader.aspx
http://msdn2.microsoft.com/it-it/library/system.data.sqlclient.sqldatareader.aspx

Diversamente se ti occorre cashare lato client un set di dati che vorrai scorrere sia in avanti che in indietro, manipolarlo tramite viste, fare ricerche, aggiornameni, inserimenti, cancellazioni, ecc. è possibile ricorrere ad un DataSet.
Su MSDN troverai tutte le informazioni che ti servono.
http://msdn2.microsoft.com/it-it/library/system.data.sqlclient.sqldataadapter.aspx
http://msdn2.microsoft.com/it-it/library/system.data.dataset.aspx

Ciao!

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

Carmine Profilo | Junior Member

Mhm a me interessa soltanto avere una DataTable con tutto il contenuto della tabella, casomai facendo una piccola query.
Non mi interessa fare cancellazioni ecc... mi serve una roba tipo il fetch_array del PHP.
Ora vedo un pò il datareader allora...

Un ultima domanda: come mai nelle windows forms c'è tutto il bel visual designer per il DataSet e nelle applicazioni web no? Non vorrei creare a mano tutto il dataset...

Webmaster di thetotalsite.it
Blog: blog.thetotalsite.it
La nuova community: forum.thetotalsite.it

Carmine Profilo | Junior Member

Come non detto... penso di aver capito come leggere i dati con l' SqlDataReader.
Il problema è che persiste il fatto di "il file è utilizzatp da un altro processo"... :(
Anche con quell' altra connectionstring...
Fino a poco tempo fa tutto ok e poi
Inoltre se poi riprovo dice: "Cannot open database "provex" requested by the login. The login failed.
Login failed for user 'WORKSTATION\Carmine'."... eppure fino a poco fa andava tutto bene...

Che sbaglio ?
Webmaster di thetotalsite.it
Blog: blog.thetotalsite.it
La nuova community: forum.thetotalsite.it

lbenaglia Profilo | Guru

>Come non detto... penso di aver capito come leggere i dati con
>l' SqlDataReader.
>Il problema è che persiste il fatto di "il file è utilizzatp
>da un altro processo"... :(

Non ne ho idea. La stringa di connessione che ti ho passato è corretta e SQL Server è progettato per gestire fino a 32767 connessioni teoriche, quindi l'errore sta da un'altra parte.
Inoltre SQL Server non è un database file based, quindi quell'errore a prima vista non c'entra con SQL Server.

>Inoltre se poi riprovo dice: "Cannot open database "provex" requested
>by the login. The login failed.
>Login failed for user 'WORKSTATION\Carmine'."... eppure fino
>a poco fa andava tutto bene...
Qua mi sa che stai sbagliando la login.
Sei sicuro di utilizzare una connessione trusted (come riportato nella mia stringa di connessione)?
Dato che la tua prima stringa di connessione referenziava il server con il punto "." suppongo che la connessione sia locale, diversamente devi specificare il nome netbios del server o il suo indirizzo IP. Inoltre dato che stai utilizzando la Windows Authentication la connessione remota funzionerà solo se client e server risiedono nel medesimo dominio, altrimenti sei costretto a ricorrere alla SQL Server Authentication, verificando che l'istanza sia configurata per accettarla e specificando User ID e Password nella stringa di connessione.

>Che sbaglio ?
Con le poche informazioni frammentate che ci stai dando è impossibile mettere a fuoco il problema, se non "sparando nel mucchio"...

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

Carmine Profilo | Junior Member

>Non ne ho idea. La stringa di connessione che ti ho passato è
>corretta e SQL Server è progettato per gestire fino a 32767 connessioni
>teoriche, quindi l'errore sta da un'altra parte.
>Inoltre SQL Server non è un database file based, quindi quell'errore
>a prima vista non c'entra con SQL Server.

Mhm però SQL Express fa uso dei file .mdf... non c'entra nulla?

>Sei sicuro di utilizzare una connessione trusted (come riportato
>nella mia stringa di connessione)?

Si, inoltre il serverSQLExpress è locale e risiede sullo stesso dominio.

>Con le poche informazioni frammentate che ci stai dando è impossibile
>mettere a fuoco il problema, se non "sparando nel mucchio"...

Mhm ditemi cosa devo darvi in più...




Webmaster di thetotalsite.it
Blog: blog.thetotalsite.it
La nuova community: forum.thetotalsite.it

Carmine Profilo | Junior Member

Ce lo fatta.
Alla fine ho usato la connection string proposta dal database explorer di Vs2005, e cioè:

Data Source=.\SQLEXPRESS;AttachDbFilename=H:\Programmi\Microsoft SQL Server\MSSQL.1\MSSQL\Data\prove.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True

:)
Webmaster di thetotalsite.it
Blog: blog.thetotalsite.it
La nuova community: forum.thetotalsite.it
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5