witam,
proszę o wyjaśnie następującej sytuacji
używam MSSQL2005, skrypt odłącznia bazy wygenerowany przez MSSQL SMSE wygląda tak
USE [master]
GO
EXEC master.dbo.sp_detach_db @dbname = N'dupa', @keepfulltextindexfile=N'true'
GO
można również użyć tylko
EXEC master.dbo.sp_detach_db @dbname = N'dupa', @keepfulltextindexfile=N'true'
i wszystko oczywiście działa jak należy
teraz chcę wykonać taką operację z poziomu Delphi (D5) przez ADOCommand
procedure JakasTam;
begin
{[ciach]}
comm_txt := 'EXEC master.dbo.sp_detach_db @dbname = N''dupa'', @keepfulltextindexfile=N''true''';
ADOCom1.Parameters.Clear;
ADOCom1.CommandText := comm_txt;
ADOCom1.Prepared;
ADOCom1.Execute;
end;
no i dalej wszstko działa należycie,
schody zaczynają się gdy chcę zparametryzować wykonanie
procedure JakasTam;
begin
{[ciach]}
comm_txt := 'EXEC master.dbo.sp_detach_db @dbname = N:nazwa, @keepfulltextindexfile=N''true''';
ADOCom1.Parameters.Clear;
ADOCom1.CommandText := comm_txt;
ADOCom1.Parameters.ParamByName('nazwa').Value := '''dupa''';
ADOCom1.Prepared;
ADOCom1.Execute;
end;
pojawia się błąd
The database 'N@P1' does not exist. Supply a valid database name. To see available databases, use sys.databases
nie pomaga zmiana na (bo to de facto to samo)
ADOCom1.Parameters.ParamValues['nazwa'] := QuotedStr('dupa');
co generuje taki sam błąd
więc próbuję dalej
procedure JakasTam;
begin
{[ciach]}
comm_txt := 'EXEC master.dbo.sp_detach_db @dbname = :nazwa, @keepfulltextindexfile=N''true''';
ADOCom1.Parameters.Clear;
ADOCom1.CommandText := comm_txt;
ADOCom1.Parameters.ParamValues['nazwa'] := QuotedStr('dupa');
ADOCom1.Prepared;
ADOCom1.Execute;
end;
myślę mam cię, jest dobrze ale nie do końca bo dalej błąd
The database dupa
does not exist. Supply a valid database name. To see available databases, use sys.databases
więc dochodzę do ostatecznego, działającego rozwiązania, zmieniam string nazwy i to ...
procedure JakasTam;
begin
{[ciach]}
comm_txt := 'EXEC master.dbo.sp_detach_db @dbname = :nazwa, @keepfulltextindexfile=N''true''';
ADOCom1.Parameters.Clear;
ADOCom1.CommandText := comm_txt;
ADOCom1.Parameters.ParamValues['nazwa'] := 'dupa';
ADOCom1.Prepared;
ADOCom1.Execute;
end;
DZIAŁA
ponieważ będę wykorzystywał taką konstrukcję do innych EXECUTE, mam następujące pytania
- jaką rolę pełni w T-SQL'u konstrukcja N'costam'
- dlaczego w ADOCommand trzeba pominąć cudzysłowy, czyli jest wprost <@dbname = costam >
- jak postąpić gdy string, np. ścieżka dostępu do przyłączanej bazy zawiera spacje, np.:
( FILENAME = N'D:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\dupa.mdf' )
dzięki