ADOCommand a T-SQL

0

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

  1. jaką rolę pełni w T-SQL'u konstrukcja N'costam'
  2. dlaczego w ADOCommand trzeba pominąć cudzysłowy, czyli jest wprost <@dbname = costam >
  3. 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

0
  1. N mówi, że przekazujesz nie varchar a nvarchar (lub nchar, ntext)
  2. ado na podstawie przekazanej wartości sam decyduje jakiego typu jest parametr i odpowiednio go przekazuje dalej (np. dodając 'uszy' do stringa)
  3. zamiast ado zainteresuj się freedac
0

dzięki,
zobaczę co to za komponenty freedac

1 użytkowników online, w tym zalogowanych: 0, gości: 1