Vorgang ist für geschlossenes Objekt nicht zugelassen

25/07/2008 - 14:00 von Ronny | Report spam
Hallo werte Community,

ich versuche mit ADO auf eine MS-SQL 2005 Instanz zu zugreifen. Und zwar
möchte ich das Verzeichnis auslesen, wo die Datenbank installiert ist. Es
klappt wenn ich ein externes QueryTool nehme, aber nicht im Quelltext
(Script ist das gleiche).

ADODB::_RecordsetPtr records = NULL;

string strSQL2(
"--
***************************************************************************
\
***************************************************************************
\
if object_id('dbo.fn_SQLServerDataDir') is not null \
drop function dbo.fn_SQLServerDataDir \
go \
create function dbo.fn_SQLServerDataDir() \
returns nvarchar(4000) \
as \
begin \
declare @rc int, \
@dir nvarchar(4000) \
exec @rc = master.dbo.xp_instance_regread
N'HKEY_LOCAL_MACHINE',N'Software\Microsoft\MSSQLServer\MSSQLServer',N'DefaultData',
@dir output, 'no_output' \
if (@dir is null) \
begin \
exec @rc = master.dbo.xp_instance_regread
N'HKEY_LOCAL_MACHINE',N'Software\Microsoft\MSSQLServer\Setup',N'SQLDataRoot',
@dir output, 'no_output' \
select @dir = @dir + N'\Data' \
end \
return @dir \
end \
go \

select dataDir = dbo.fn_SQLServerDataDir() \
go ");

records = myDB->connection->Execute(strSQL2.c_str(), NULL, NULL);

records->MoveFirst(); // Hier kommt der Fehler: Vorgang ist für ein
geschlossenes Objekt nicht zugelassen


Für einfache Anweisungen klappt das wunderbar, aber in diesem Fall
(mehrfache Anweisungen mit GO) nicht.
Bin gerade etwas am Ende mit meinem Latein...hab ich was übersehen?

Besten Dank,
Ronny
 

Lesen sie die antworten

#1 Ronny
25/07/2008 - 14:06 | Warnen spam
Noch ein kurzer Nachtrag.

Ich hab die letzte SELECT-Anweisung in ein eigenes Execute gesteckt und nun
funktioniert es manchmal und manchmal nicht...

// strSQL2 jetzt ohne das letzte SELECT
records = myDB->connection->Execute(strSQL2.c_str(), NULL, NULL);
records = myDB->connection->Execute("select dataDir =
dbo.fn_SQLServerDataDir();", NULL, NULL);
records->MoveFirst();

Ein richtiges System dahinter kann ich leider noch nicht entdecken.

Danke und
MFG,
Ronny

Ähnliche fragen