Errore su storeprocedure di sistema sp_helpdb

mercoledì 07 gennaio 2009 - 18.08

ysdemarc Profilo | Expert

Mi viene sollevata un eccezione all'esecuzione della storeprocedure di sistema sp_helpdb con sql server 2005.

Dettagli eccezione: System.Data.OleDb.OleDbException: Il nome di oggetto '#spdbdesc' non è valido.

riporto un sunto del codice:

string sql = "sp_helpdb";
string connString = @"Provider=SQLOLEDB.1;Persist Security Info=True;User ID=miauser;Password=miapassword;Initial Catalog=master;Data Source=MIOSERVER\MiaIstanza";

IDbConnection cn = new OleDbConnection(connString);
IDbCommand cm = new OleDbCommand(sql,(OleDbConnection)cn);

cm.CommandType = CommandType.StoredProcedure;

DbDataAdapter da = new OleDbDataAdapter((OleDbCommand)cm);

OleDbCommandBuilder cb = new OleDbCommandBuilder(da);
cb.RefreshSchema();

DataSet ds = new DataSet();

da.FillSchema(ds,SchemaType.Source); //qui si verifica l'eccezione
da.Fill (ds)

ecc....

Premetto che la stessa cosa con sql server 2000 funziona piuttosto bene e che se uso la stessa stringa di connessione per accedere ad una tabella non ho problemi. In pratica sulla machcina dove si trovano i db io ho 3 istanze e qui sto accedendo ad una sola istanza per vedere quali db utente sono presenti.
Con VB6 riesco sia a creare database e tabelle e a leggere, inserire, modificare e cancellare records.

se eseguo la store procedure direttamente da sql server 2005 express non ho problemi..

e allora dov'è l'errore?

sto usando VS .NET 2003 col framework 1.1
Vincenzo
Programmatore sbilenco

alx_81 Profilo | Guru

>Mi viene sollevata un eccezione all'esecuzione della storeprocedure
>di sistema sp_helpdb con sql server 2005.
Per curiosità, hai provato a lanciare la stored procedure usando System.Data.SQLClient? Perchè mi sembra proprio uno strano comportamento..
ho aperto la sp_helpdb sul mio sql (2008 però dovrebbe essere uguale) e la prima cosa che viene eseguita nella sp è la creazione della tabella in questione.
Poi c'è una insert, una update ed una delete su quella tabella. Solo alla fine hai la select.
Stranissimo. Prova cambiando provider e facci sapere
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

ysdemarc Profilo | Expert

ho fatto la prova su un progetto windowsform e usando SqlConnection & C

adesso il messaggio di errore è cambiato in sto modo:

System.Data.SqlClient.SqlException: Il nome di oggetto '#spdbdesc' non è valido.
at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream)
at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.SqlClient.SqlCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.FillSchemaFromCommand(Object data, SchemaType schemaType, IDbCommand command, String srcTable, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.FillSchema(DataSet dataSet, SchemaType schemaType, IDbCommand command, String srcTable, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.FillSchema(DataSet dataSet, SchemaType schemaType)
at ClasseProva.Form1.button2_Click(Object sender, EventArgs e)


Vincenzo
Programmatore sbilenco

ysdemarc Profilo | Expert

la soluzione è togliere FillSchema...

con qualsiasi opzione lo metta da sempre errore..togliendolo e facendo solo la Fill sembra funzionare...

ma quali sono comunementi i vantaggi utillizzando FillSchema o no?
Vincenzo
Programmatore sbilenco

alx_81 Profilo | Guru

>con qualsiasi opzione lo metta da sempre errore..togliendolo
>e facendo solo la Fill sembra funzionare...
La fill aggiunge righe nel datatable del tuo dataset, non so se viene chiamato implicitamente anche il FillSchema (non credo).
Forse la FillSchema non funziona perchè la select fatta dentro la sp_helpdb è su di una temp table e quindi i metadati non sono disponibili.
Ti invito a fare una prova e a farmi sapere. Prova a creare una sp così:
CREATE PROC dbo.proc_Prova AS BEGIN SET NOCOUNT ON; CREATE TABLE #prova (id int, valore char(3)) INSERT INTO #prova SELECT 1, 'UNO' INSERT INTO #prova SELECT 2, 'DUE' INSERT INTO #prova SELECT 3, 'TRE' SELECT id , valore FROM #Prova END

e a chiamare il metodo FillSchema con essa. Se ti dà errore abbiamo scoperto che il problema sono i metadati che non esistono per una temp (Anche reporting services ha problemi simili legati all'utilizzo delle temp).

>ma quali sono comunementi i vantaggi utillizzando FillSchema o no?
Serve per caricare i metadati e le loro caratteristiche. Vantaggi li hai se poi devi sapere se esite ad esempio una PK, o se un campo è autoincrementante, ecc..


--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

ysdemarc Profilo | Expert

che il problema sono i metadati temo che hai ragione..almeno così capisco nel mio scarso inglese da qui: http://bytes.com/groups/ms-sql/626626-sql-server-2005-express-vista-invalid-object-name-spdbdesc

però non riesco a capire perchè con sql server 2000 funzionavano le stesse identiche righe di codice e i problemi sono iniziati solo col 2005...

poi la tua storeprocedure la cambio..anche se di database capisco poco mi piace imparare..e imparo solo se ci sbatto la testa nelle cose..

ciao e grazie mille
Vincenzo
Programmatore sbilenco

alx_81 Profilo | Guru

>poi la tua storeprocedure la cambio..anche se di database capisco
>poco mi piace imparare..e imparo solo se ci sbatto la testa nelle
>cose..
ma hai provato a chiamare il FillSchema con la mia sp? ti dà errore?

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

ysdemarc Profilo | Expert

si.. provando con FillSchema passandogli sia SchemaType.Mapped che SchemaType.Source..

retituisce il seguente errore:

System.Data.SqlClient.SqlException: Il nome di oggetto '#prova' non è valido.

mentre omettendo la FillSchema funziona regolarmente.

e ho avuto lo stesso errore provando sia con sql server 2005 express che con sql server 2000

però ripeto la FillShema per sp_helpdb con sql server 2000 funziona mentre non funziona con sql server 2005 express..

incuriosito ho aperto la storeprocedure sia quella in dotazione col 2000 che quella col 2005

ho visto che cambiano poche righe iniziali e finali..(non chiedetemi riguardo cosa poichè in questo campo sono pressocchè incompetente)
quindi ho copiato la store procedure da sql server 2000 a sql server 2005 express chiamandola proc_Prova2

... e anche la nuova storeprocedure non funziona

non mi viene altro che dire "mistero della fede"

piu si va avanti e meno ci capisco

Vincenzo
Programmatore sbilenco

alx_81 Profilo | Guru

>piu si va avanti e meno ci capisco
l'importante è aver capito almeno dove sta l'errore in 2005.

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

ysdemarc Profilo | Expert

grazie mille comunque

ciaooo
Vincenzo
Programmatore sbilenco
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