SQL Funktion anlegen über ADO

03/09/2008 - 14:02 von Ronny | Report spam
Hallo liebe Community,

ich versuch in einem kleinen C Programm das Installationsverzeichnis einer
MS-SQL Installtion aus der Datenbank auszulesen. Das klappt auch im großen
und ganzen.

Jetzt habe ich MSSQL neu installiert und das Programm hat an dieser Stelle
immer eine Fehlermeldung geworfen.

Doch zuvor das Script, dass ich verwende um das Verzeichnis auszulesen.


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


Das C Programm stellt an die Datenbank zwei Anfragen. Die erste ist die o.g.
Definition. In der zweiten wird das Verzeichnis abgefragt.


select dataDir = dbo.fn_SQLServerDataDir();


Wie gesagt, das funktioniert auch. Jetzt hatte ich MSSQL neu installiert und
bekam die Fehlermeldung, dass das Objekt "dbo.fn_SQLServerDataDir()" nicht
vorhanden sei. Daraufhin hab ich ein externes Tool zum Zugriff auf die
Datenbank verwendet (EMS SQL Manager) und dort die beiden Anfragen gestellt.
In diesem Tool hat es auf Anhieb geklappt.

Nachdem ich das getan hatte, klappt es nun auch in meinem C-Programm. Ich
schàtze, dass die definierte Funktion irgendwie in MS-SQL gespeichert bleibt
o.à., so dass jetzt in meinem C Programm kein Fehler mehr auftritt. Aber
eigentlich kann ich mir keinen richtigen Reim darauf machen.

Vielleicht hat ja jemand eine Idee. Bin für jede Art von Hilfe dankbar. :-)

MFG,
Ronny
 

Lesen sie die antworten

#1 Elmar Boye
03/09/2008 - 16:57 | Warnen spam
Hallo Ronny,

Ronny schrieb:
ich versuch in einem kleinen C Programm das Installationsverzeichnis
einer MS-SQL Installtion aus der Datenbank auszulesen. Das klappt auch
im großen und ganzen.

Jetzt habe ich MSSQL neu installiert und das Programm hat an dieser
Stelle immer eine Fehlermeldung geworfen.

Doch zuvor das Script, dass ich verwende um das Verzeichnis auszulesen.



Das Problem dürfte àhnlich dem sein, das du vor einigen wochen hattest.

ADO versteht kein "GO", d. h. erkennt es nicht als Trenner für Stapel,
das "verstehen" nur die Dienstprogramme wie osql.
Deswegen mußt Du Deine beiden Befehle aufteilen (am besten ein Array
dafür verwenden).

1.)
if object_id('dbo.fn_SQLServerDataDir') is not null
drop function dbo.fn_SQLServerDataDir



2.)
create function dbo.fn_SQLServerDataDir()
returns nvarchar(4000)
as [...}



Das "go" entfàllt jeweils!

Die beiden Befehle mußt Du einzeln via Execute ausführen,
am besten mit adExecuteNoRecords, da keine sinnvolle Rückgabe kommt:
<URL:http://msdn.microsoft.com/en-us/library/ms681559(VS.85).aspx>

Nachdem ich das getan hatte, klappt es nun auch in meinem C-Programm.



Das weist auf eine mangelnde Fehlerbehandlung hin,
denn vermutlich ist der Anlagecode nie gelaufen.

Ich schàtze, dass die definierte Funktion irgendwie in MS-SQL
gespeichert bleibt o.à., so dass jetzt in meinem C Programm kein Fehler
mehr auftritt.



Eben.

Gruß Elmar

Ähnliche fragen