Pokazywanie postów oznaczonych etykietą InstallShield - SQL. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą InstallShield - SQL. Pokaż wszystkie posty

poniedziałek, 17 stycznia 2011

Wykonanie zapytania na bazie MS-SQL w InstallScript

Funkcja wykonuje zapytanie SQL i zwraca wartości z pierwszej kolumny w zmiennej "svWynik"; Funkcja zwraca true/false w przypadku poprawnego/błędnego wykonania zapytania.

function BOOL QuerySQL(sSQL,sServerName, sDBName, sDriver, bTrustedConn, 
sUserName, sUserPwd, svWynik, bLog)
 OBJECT objConn, objRST, pADORecordSetObj,adoCommand; 
 STRING sTekst, sConnString;         
 STRING  szADOConnObjID,szADORecordSetObjID; 
 STRING szError;
 BOOL bReturn;
begin
 bReturn = FALSE;
 
    if (sDriver == "") then sConnString = "Provider=sqloledb;Persist Security Info=False;";
                    else sConnString = "Driver={" + sDriver + "};Persist Security Info=False;";
    endif;
    
    if (bTrustedConn) then
 sConnString = sConnString + "server=" + sServerName + ";";
 sConnString = sConnString + "database=" + sDBName + ";";
 sConnString = sConnString + "Trusted_connection=Yes";
else
 sConnString = sConnString + "server=" + sServerName + ";";
 sConnString = sConnString + "uid=" + sUserName + ";";
 sConnString = sConnString + "pwd=" + sUserPwd + ";";
 sConnString = sConnString + "database=" + sDBName;
endif;
 
    try
 szADOConnObjID = "ADODB.Connection";
 set objConn = CreateObject(szADOConnObjID);         
    
 if (IsObject(objConn)) then 
objConn.ConnectionString = sConnString;
    objConn.Open;                              
    szADORecordSetObjID = "ADODB.Recordset";
    set pADORecordSetObj = CreateObject(szADORecordSetObjID);
    
    pADORecordSetObj.CursorType = 3;    
    pADORecordSetObj.ActiveConnection = objConn;    
    pADORecordSetObj.Open(sSQL);    
 if ((pADORecordSetObj.RecordCount >= 1)||(pADORecordSetObj.RecordCount = -1)) then
    while (!pADORecordSetObj.EOF) 
  svWynik =  pADORecordSetObj(0);
   pADORecordSetObj.MoveNext;          
    endwhile; 
    
 if (StrLength(svWynik)>0) then bReturn = TRUE;
      else bReturn = FALSE;
 endif;  
    
 if ((bLog)&&(!bReturn)) then WriteLog(2," Wynik zapytania jest pusty"); endif;  
 else
 bReturn = FALSE; 
 endif;                                          
    
 set pADORecordSetObj = NOTHING;
 objConn.Close;
   
 else
     if (bLog) then WriteLog(1,"Nie moża utworzyć obiektu połączenia ADODB.Connection do "+sDBName); endif;  
 endif;
  
 set objConn = NOTHING;
 set objRST  = NOTHING;
  
 catch  
    if (bLog) then WriteLog(1,"Błąd wykonania zapytania SQL"); endif;  
 endcatch;
                      
 return (bReturn);
end;   

Usuwanie użytkownika bazy MS-SQL w InstallScript

Funkcja usuwa użytkownika bazy MS-SQL, zwraca true/false w przypadku powodzenia/porażki.
function BOOL DB_DropUser(sUserToDrop, sServerName, sDBName, sDriver, bTrustedConn, 
sUserName, sUserPwd, bLog)
OBJECT objConn, objRST;   
STRING sConnString;  
STRING  szADOConnObjID, sSQL;
BOOL bResult;
begin
    bResult = FALSE;
    if (sDriver == "") then
     sConnString = "Provider=sqloledb;";
    else
     sConnString = "Driver={" + sDriver + "};";
    endif;

 if (bTrustedConn) then
     sConnString = sConnString + "server=" + sServerName + ";";
     sConnString = sConnString + "database=" + sDBName + ";";
     sConnString = sConnString + "Trusted_connection=Yes";
 else
     sConnString = sConnString + "server=" + sServerName + ";";
  sConnString = sConnString + "uid=" + sUserName + ";";   
  sConnString = sConnString + "pwd=" + sUserPwd + ";";
  sConnString = sConnString + "database=" + sDBName;                                        
 endif;   
 
 try
  szADOConnObjID = "ADODB.Connection";
     set objConn = CreateObject(szADOConnObjID);         
    
  if (IsObject(objConn)) then 
   objConn.ConnectionString = sConnString;
   objConn.Open;                            
      
   sSQL = "IF EXISTS (SELECT * FROM sysusers WHERE name='"+sUserToDrop+"') 
BEGIN EXEC dbo.sp_revokedbaccess N'"+sUserToDrop+"' END;";   
   try
    set objRST = objConn.Execute(sSQL);
    bResult = TRUE; //Wykonano
   catch                      
     bResult = FALSE; //Błąd wykonania
     if (bLog) then WriteLog(1," - błąd usuwania loginu \""+sUserToDrop+"\" 
z bazy \""+sDBName+"\""); endif;
   endcatch;
         
         objConn.Close;         
         
  endif;
    
  set objConn = NOTHING;
  set objRST  = NOTHING;
  
 catch  
  if (bLog) then WriteLog(1," - Nie można uzyskać połączenia z bazą 
na użytkownika \""+sUserName+"\""); endif;  
 endcatch;     
 
    return bResult; 
end;

Tworzenie użytkownia bazy MSSQL w InstallScript

Funkcja dodaje użytkownika do bazy danych serwera MS-SQL, zwraca true/false po wykonaniu.

function BOOL DB_CreateUser(sUserToCreate, sUserPwd, sServerName, sDBName, sDriver, 
bTrustedConn, sUserSA, sUserSAPwd,  bLog)
OBJECT objConn, objRST;   
STRING sConnString;  
STRING  szADOConnObjID, sSQL;
BOOL bResult,bResult1;
begin
    bResult = FALSE;
    if (sDriver == "") then
     sConnString = "Provider=sqloledb;";
    else
     sConnString = "Driver={" + sDriver + "};";
    endif;
 if (bTrustedConn) then 
     sConnString = sConnString + "server=" + sServerName + ";";
  sConnString = sConnString + "database=" + sDBName + ";";
  sConnString = sConnString + "Trusted_connection=Yes";
 else  
     sConnString = sConnString + "server=" + sServerName + ";";
  sConnString = sConnString + "uid=" + sUserSA + ";";     
  sConnString = sConnString + "pwd=" + sUserSAPwd + ";";
  sConnString = sConnString + "database=" + sDBName;                                        
 endif;   
 
 try
  szADOConnObjID = "ADODB.Connection";
     set objConn = CreateObject(szADOConnObjID);         
    
  if (IsObject(objConn)) then 
   objConn.ConnectionString = sConnString;
   objConn.Open;                               

   try         
    sSQL = "IF  NOT EXISTS (SELECT * FROM master.dbo.syslogins WHERE 
loginname='"+sUserToCreate+"') \r\n";
    sSQL = sSQL + "BEGIN \r\n";     
          sSQL = sSQL + "EXEC ('CREATE LOGIN "+sUserToCreate+" WITH PASSWORD=N''"+sUserPwd+"'', 
DEFAULT_DATABASE="+sDBName+", CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF') \r\n";          
             sSQL = sSQL + "END ";
    set objRST = objConn.Execute(sSQL);  
          bResult = TRUE; //Wykonano
         catch                                                                                       
          bResult = FALSE; //Nie wykonano                                
         endcatch;   
         
         if !bResult then //Jezeli pierwszy sposob sie nie wykonal to drugi 
         try         
    sSQL = "IF  NOT EXISTS (SELECT * FROM master.dbo.syslogins WHERE 
loginname='"+sUserToCreate+"') \r\n";
    sSQL = sSQL + "BEGIN \r\n";     
    sSQL = sSQL + "EXEC sp_addlogin @loginame = '"+sUserToCreate+"', 
@passwd = '"+sUserPwd+"', @defdb = '"+sDBName+"' \r\n";                       
             sSQL = sSQL + "END ";
    set objRST = objConn.Execute(sSQL);  
          bResult1 = TRUE; //Wykonano       
          bResult = TRUE;
         catch                                                                                       
          bResult1 = FALSE; //Nie wykonano                                
         endcatch;            
         endif;      
         
         if (!bResult) && (!bResult1) then
          if (bLog) then WriteLog(1,"Błąd dodanie użytkownika \""+sUserToCreate+"\" 
do serwera SQL"); endif;
         endif;         
         objConn.Close;                  
  endif;
    
  set objConn = NOTHING;
  set objRST  = NOTHING;  
 catch  
  if (bLog) then WriteLog(1," - Nie można uzyskać połączenia z bazą 
na użytkownika \""+sUserToCreate+"\""); endif;  
 endcatch;      
    return bResult; 
end;

piątek, 14 stycznia 2011

Pobranie wielkości bazy MSSQL

Funkcja pobiera wielkość bazy odczytując wielkość pliku z serwera MSSQL bazy
function BOOL GetDataBaseSize(sQuery, sValueName, sValue, sServerName, sDBName, sDBFileName, sDriver, bTrustedConn, sUserName, sUserPwd, bLog)
 OBJECT objConn, objRST;     
 STRING  szADOConnObjID;
 STRING sTekst, sConnString;
 BOOL bReturn;
begin
 bReturn = FALSE;  
    if (sDriver == "") then
     sConnString = "Provider=sqloledb;";
    else
     sConnString = "Driver={" + sDriver + "};";
    endif;

 if (bTrustedConn) then
     sConnString = sConnString + "server=" + sServerName + ";";
       sConnString = sConnString + "database=" + sDBName + ";";
     sConnString = sConnString + "Trusted_connection=Yes";
 else

     sConnString = sConnString + "server=" + sServerName + ";";
  sConnString = sConnString + "uid=" + sUserName + ";";
  sConnString = sConnString + "pwd=" + sUserPwd + ";";
  sConnString = sConnString + "database=" + sDBName;
 endif;
 

 szADOConnObjID = "ADODB.Connection";
 set objConn = CreateObject(szADOConnObjID);         
 if (IsObject(objConn)) then 
   objConn.ConnectionString = sConnString;
   objConn.Open;   
   set objRST = objConn.Execute("select sum(size)*8/1024 as size from sysfiles");     
   sValue = objRST(sValueName);                                         
 set objRST = objConn.Execute("select filename from sysfiles where filename like '%.mdf%' ");
 sDBFileName = objRST("filename");                                           
 objConn.Close;   
 bReturn  = TRUE;   
   
 else
     if (bLog) then WriteLog(1,"Nie moża utworzyć obiektu połączenia ADODB.Connection"); endif;  
 endif;
  
  set objConn = NOTHING;
  set objRST  = NOTHING;
 
 return (bReturn);
end;

czwartek, 28 października 2010

Odczyt wersji zdalnego serwera SQL InstallShield

Funkcja odczytuje wersję serwera SQL. Wymaganiem jest podanie użytkownika z dostępem do bazy master serwera.
Parametry:
-sServerName - nazwa serwera zdalnego (z instancją)
-sUserName - nazwa użytkownika
-sUserPwd - hasło użytkownika
- bLog - zapis do pliku log
Wartości zwracane:
-1 - nie udało się pobrać wersji serwera
80 - SQL2000
90 - SQL2005
100 -SQL2008

function int GetRemoteSQLVersion(sServerName, sUserName, sUserPwd,  bLog)
OBJECT objConn, objRST;      
STRING sConnString;  
STRING  szADOConnObjID;
STRING sSQL,szVersion, szVer;
int nResult;
begin
 nResult = -1;

     sConnString = "Driver={SQL Server};Persist Security Info=False;";
     sConnString = sConnString + "server=" + sServerName + ";";
  sConnString = sConnString + "uid=" + sUserName + ";";                                                       
  sConnString = sConnString + "pwd=" + sUserPwd + ";";
  sConnString = sConnString + "database=master"; 
 
  sSQL = "SELECT SERVERPROPERTY('ProductVersion') AS ProductVersion";
 try
  if (bLog) then WriteLog(0,"* Odczyt wersji Serwera SQL..."); endif;
  
  szADOConnObjID = "ADODB.Connection";
     set objConn = CreateObject(szADOConnObjID);         
    
  if (IsObject(objConn)) then 
   objConn.ConnectionString = sConnString;
   //objConn.CommandTimeout = 999999;   
   objConn.Open;                            
         set objRST = objConn.Execute(sSQL);                    
   szVersion = objRST("ProductVersion");   
         if (StrLength(szVersion)>0) then
          StrSub(szVer,szVersion,0,StrFind(szVersion,"."));                    
          switch (szVer)
            case "8" : nResult=80; if (bLog) then WriteLog(1,"- Serwera SQL 2000"); endif;
            case "9" : nResult=90; if (bLog) then WriteLog(1,"- Serwera SQL 2005"); endif;
            case "10": nResult=100;if (bLog) then WriteLog(1,"- Serwera SQL 2008"); endif;
          endswitch;                   
         endif;         
         objConn.Close;         
  endif;
  
  set objConn = NOTHING;    
  set objRST  = NOTHING;
  
 catch  
  if (bLog) then WriteLog(1," - Nie można uzyskać połączenia z bazą master na 
użytkownika \""+sUserName+"\""); endif;    
 endcatch;
 
 return nResult; 
end;

czwartek, 29 października 2009

Ustawienie stałego portu dla wybranej instancji serwera MSSQL 2005

Funkcja pobiera dynamicznie ustawiony Port przez serwer SQL i przypisuje go jako stały

function BOOL SetFixedPortMS(sInstancja,sPort,bLog)
string sKey,sValue,sData,sKatInstancji;
number nResult,nResult1,nResult2,nType,nSize;
BOOL bSET;
begin                      
  Disable(LOGGING);
  bSET=FALSE;
  RegDBSetDefaultRoot( HKEY_LOCAL_MACHINE );  
  sKey="Software\\Microsoft\\Microsoft SQL Server\\"+sInstancja+"\\Setup";
  nType = REGDB_STRING_MULTI;
  nSize = 255;
  if (RegDBKeyExist(sKey)=1) then
     sValue = "SQLPath";
     nResult = RegDBGetKeyValueEx( sKey, sValue, nType, sData, nSize );    
     sKatInstancji = GetWord("" ^ sData,0); 
     sPort = GetDynamicPort(sInstancja,bLog);                              //Pobierz dynamiczny Port
     if (bLog) then WriteLog(1,"Ustawienie stałego portu TCP na nr : "+sPort);  endif;
     sKey = "Software\\Microsoft\\Microsoft SQL Server\\"+sKatInstancji+"\\MSSQLServer\\SuperSocketNetLib\\Tcp\\IPAll";    
     if (RegDBKeyExist(sKey)=1) then
        sValue = "TcpPort";       
        nResult = RegDBSetKeyValueEx ( sKey, sValue, nType, sPort, nSize );       
        sValue = "TcpDynamicPorts";
        nResult1 = RegDBSetKeyValueEx ( sKey, sValue, nType, "", nSize );               
     else                           
        if (bLog) then WriteLog(2,"- nie ustawiono. Brak klucza TCP przy katalogu instancji");    endif;
        bSET = FALSE;  //Nieznaleziono wpisu o kluczu TCP/IP
     endif;  
     //Ustawienie dla pozostalych TCP portow stalych
     sKey = "Software\\Microsoft\\Microsoft SQL Server\\"+sKatInstancji+"\\MSSQLServer\\SuperSocketNetLib\\Tcp\\IP1";    
     if (RegDBKeyExist(sKey)=1) then
        sValue = "TcpPort";              
        RegDBSetKeyValueEx ( sKey, sValue, nType, sPort, nSize );       
        sValue = "TcpDynamicPorts";       
        RegDBSetKeyValueEx ( sKey, sValue, nType, "", nSize );               
     endif;
    
     sKey = "Software\\Microsoft\\Microsoft SQL Server\\"+sKatInstancji+"\\MSSQLServer\\SuperSocketNetLib\\Tcp\\IP2";    
     if (RegDBKeyExist(sKey)=1) then
        sValue = "TcpPort";               
        RegDBSetKeyValueEx ( sKey, sValue, nType, sPort, nSize );       
        sValue = "TcpDynamicPorts";       
        RegDBSetKeyValueEx ( sKey, sValue, nType, "", nSize );               
     endif;
    
     sKey = "Software\\Microsoft\\Microsoft SQL Server\\"+sInstancja+"\\MSSQLServer\\SuperSocketNetLib\\Tcp";    
     if (RegDBKeyExist(sKey)=1) then
        sValue = "TcpPort";        
        nResult2 = RegDBSetKeyValueEx ( sKey, sValue, nType, sPort, nSize );       
     else
        if (bLog) then WriteLog(2,"- nie ustawiono stałego portu. Brak klucza rejestru TCP przy instancji");    endif;
        bSET = FALSE;  //Nieznaleziono wpisu o kluczu TCP/IP
     endif;                                                       
    
     if (nResult=0)&&(nResult1=0)&&(nResult2=0) then
        if (bLog) then WriteLog(2,"- ustawiono stały port na : "+sPort);    endif;
        bSET = TRUE;
     else
       if (bLog) then WriteLog(2,"- wystąpił błąd przy ustawieniu stałego port na : "+sPort);    endif; 
     endif;
    
  else                                
      if (bLog) then WriteLog(2,"- nie ustawiono stałego portu. Brak wpisu o instancji");      endif;
      bSET = FALSE;  //Nieznalezniono wpisu o zainstalowanej Instancji
  endif;                                                                
                  
 Enable(LOGGING);                 
 return bSET;
end;

środa, 28 października 2009

Pobranie dynamicznego numeru portu przydzielonego do instancji MSSQL


function string GetDynamicPort(sInstancja,bLog)
string sKey, sValue, sData;
string sMsg,sKatInstancji, Port;
number nType, nSize, nResult;
begin
Port="";
RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE);
sKey="Software\\Microsoft\\Microsoft SQL Server\\"+sInstancja+"\\Setup";
if (RegDBKeyExist(sKey)=1) then
sValue = "SQLPath";
nResult = RegDBGetKeyValueEx( sKey, sValue, nType, sData, nSize );
sKatInstancji = GetWord("" ^ sData,0);
//Port
sKey = "Software\\Microsoft\\Microsoft SQL Server\\"+sKatInstancji+"\\MSSQLServer\\SuperSocketNetLib\\Tcp\\IPAll";
if (RegDBKeyExist(sKey)=1) then
nType = REGDB_STRING_MULTI;
sValue = "TcpDynamicPorts";
nResult = RegDBGetKeyValueEx( sKey, sValue, nType, sData, nSize );
if( nResult = 0 ) then
if (StrLength(sData)>1) then
Port=sData;
else
if (bLog) then WriteLog(2,"port dynamiczny nie przydzielony do instancji : "+sInstancja); endif;
endif;
endif;
else
if (bLog) then WriteLog(2,"brak klucza rejestru z przydzielonymi portami dynamicznymi"); endif;
endif;
else
if (bLog) then WriteLog(2,"brak klucza rejestru z instancją : "+sInstancja); endif;
endif;
return Port;
end;

Funkcja sprawdzająca czy polecenie DBCheckDB nie zwraca błedów


function BOOL DBCheckDB (sSQL, sServerName, sDBName, sDriver, bTrustedConn, sUserName, sUserPwd, bLog, szError)
OBJECT objConn, pADORecordSetObj, adoCommand;
STRING sTekst, sConnString;
STRING szADOConnObjID,szADORecordSetObjID;
number nPos;
BOOL bReturn;
begin
bReturn = FALSE;

// Create the connectionstring
if (sDriver == "") then
sConnString = "Provider=sqloledb;";
else
sConnString = "Driver={" + sDriver + "};";
endif;

if (bTrustedConn) then
//ACA_Log_AppendLine(" using Windows Authentication");
sConnString = sConnString + "server=" + sServerName + ";";
sConnString = sConnString + "database=" + sDBName + ";";
sConnString = sConnString + "Trusted_connection=Yes";
else
//ACA_Log_AppendLine(" using SQL Login");
sConnString = sConnString + "server=" + sServerName + ";";
sConnString = sConnString + "uid=" + sUserName + ";";
sConnString = sConnString + "pwd=" + sUserPwd + ";";
sConnString = sConnString + "database=" + sDBName;
endif;

try
szADOConnObjID = "ADODB.Connection";
set objConn = CreateObject(szADOConnObjID);

if (IsObject(objConn)) then

objConn.ConnectionString = sConnString;
objConn.CommandTimeout = 999999;
objConn.Open;

szADORecordSetObjID = "ADODB.Recordset";
set pADORecordSetObj = CreateObject(szADORecordSetObjID);
pADORecordSetObj.CursorType = 3;
pADORecordSetObj.ActiveConnection = objConn;
pADORecordSetObj.Open(sSQL);
if ((pADORecordSetObj.RecordCount >= 1)||(pADORecordSetObj.RecordCount = -1)) then
while (!pADORecordSetObj.EOF)
szError = pADORecordSetObj(3);
pADORecordSetObj.MoveNext;
endwhile;

if ((StrFind(szError,"found 0 allocation")>0)&&(StrFind(szError,"and 0 consistency")>0)) then
bReturn = TRUE;
else
bReturn = FALSE;
endif;
else
bReturn = FALSE;
endif;

else
if (bLog) then WriteLog(1,"Nie moża utworzyć obiektu połączenia ADODB.Connection do "+sDBName); endif;
endif;

set pADORecordSetObj = NOTHING;
set objConn = NOTHING;


catch
if (bLog) then WriteLog(1,"Błąd wykonania zapytania SQL"); endif;
endcatch;

return (bReturn);

end;

Funkcja sprawdzająca czy na podanym użytkowniku i haśle możliwe jest podłączenie do bazy MSSQL


function BOOL CheckLoginPass(sServerName, sDBName, sDriver, bTrustedConn, sUserName, sUserPwd, bLog, bPatron)
OBJECT objConn;
STRING sConnString;
STRING szADOConnObjID;
BOOL bResult;
begin
bResult = FALSE;
// Create the connectionstring
if (sDriver == "") then
sConnString = "Provider=sqloledb;";
else
sConnString = "Driver={" + sDriver + "};";
endif;

if (bTrustedConn) then
//ACA_Log_AppendLine(" using Windows Authentication");
sConnString = sConnString + "server=" + sServerName + ";";
sConnString = sConnString + "database=" + sDBName + ";";
sConnString = sConnString + "Trusted_connection=Yes";
else
//ACA_Log_AppendLine(" using SQL Login");
sConnString = sConnString + "server=" + sServerName + ";";
sConnString = sConnString + "uid=" + sUserName + ";";
if bPatron then sUserPwd = GetPatronPass(sUserPwd); endif;
sConnString = sConnString + "pwd=" + sUserPwd + ";";
sConnString = sConnString + "database=" + sDBName;
endif;

try
szADOConnObjID = "ADODB.Connection";
set objConn = CreateObject(szADOConnObjID);

if (IsObject(objConn)) then
objConn.ConnectionString = sConnString;
objConn.Open;
bResult = TRUE; //Połączono
objConn.Close;
endif;

set objConn = NOTHING;

catch
if (bLog) then WriteLog(1," - Nie można uzyskać połączenia z bazą na użytkownika \""+sUserName+"\""); endif;
endcatch;

return bResult;
end;

Funkcja sprawdzająca czy podana baza jest w użyciu


function BOOL DatabaseInUse(svServerName, svDatabaseName, svDriver, svUserName, svUserPassword, nWersja)
OBJECT pADOConnObj, pADORecordSetObj;
STRING szADOConnObjID, szADORecordSetObjID, szConnString, szSQL;
BOOL bExists;
begin
bExists = FALSE;
// Create ADO Connection Object to connect to the SQL server
szADOConnObjID = "ADODB.Connection";
set pADOConnObj = CreateObject(szADOConnObjID);

// Create the SQL string to complete the connection
szConnString = "driver={" + svDriver + "};";
szConnString = szConnString + "server=" + svServerName + ";";
szConnString = szConnString + "uid=" + svUserName + ";";
szConnString = szConnString + "pwd=" + svUserPassword + ";";
szConnString = szConnString + "database=master";

// Open the ADO Connection
pADOConnObj.Open(szConnString);

// Create ADO Recordset object for the return
szADORecordSetObjID = "ADODB.Recordset";
set pADORecordSetObj = CreateObject(szADORecordSetObjID);

// Set some ADO Recordset properties
pADORecordSetObj.CursorType = 3;
pADORecordSetObj.ActiveConnection = pADOConnObj;

// Create the SQL string to retrieve the database if it exists
if (nWersja=80) then
szSQL = "select s.name from sysdatabases s, syslocks l where l.dbid=s.dbid and s.name='" + svDatabaseName + "'";
elseif (nWersja>=90) then
szSQL = "select s.name from sys.databases s, sys.syslockinfo l where l.rsc_dbid=s.database_id and s.name='" + svDatabaseName + "'";
endif;

// Use the recordset to see if the database exists
pADORecordSetObj.Open(szSQL);
if (pADORecordSetObj.RecordCount >= 1) then
bExists = TRUE;
endif;

set pADOConnObj = NOTHING;
set pADORecordSetObj = NOTHING;
return bExists;
end;

Funckcja sprawdczająca czy podana nazwa bazy jest zainstalowana na serwerze MSSQL

Funkcja działa poprawnie na serwerze MS-SQL 2000 i nowszym, przy czym parametr nWersja jest oznaczeniem wersji MS-SQL, dla 2000 nWersja = 80, 2005 nWersja=90/91/92/93

function BOOL DoesDatabaseExist(svServerName, svDatabaseName, svDriver, svUserName, svUserPassword, nWersja)
OBJECT pADOConnObj, pADORecordSetObj;
STRING szADOConnObjID, szADORecordSetObjID, szConnString, szSQL;
BOOL bExists;
begin
bExists = FALSE;
// Create ADO Connection Object to connect to the SQL server
szADOConnObjID = "ADODB.Connection";
set pADOConnObj = CreateObject(szADOConnObjID);

// Create the SQL string to complete the connection
szConnString = "driver={" + svDriver + "};";
szConnString = szConnString + "server=" + svServerName + ";";
szConnString = szConnString + "uid=" + svUserName + ";";
szConnString = szConnString + "pwd=" + svUserPassword + ";";
szConnString = szConnString + "database=master";

// Open the ADO Connection
pADOConnObj.Open(szConnString);

// Create ADO Recordset object for the return
szADORecordSetObjID = "ADODB.Recordset";
set pADORecordSetObj = CreateObject(szADORecordSetObjID);

// Set some ADO Recordset properties
pADORecordSetObj.CursorType = 3;
pADORecordSetObj.ActiveConnection = pADOConnObj;

// Create the SQL string to retrieve the database if it exists
if (nWersja=80) then
szSQL = "Select name from sysdatabases where name='" + svDatabaseName + "'";
elseif (nWersja>=90) then
szSQL = "Select name from sys.databases where name='" + svDatabaseName + "'";
endif;

// Use the recordset to see if the database exists
pADORecordSetObj.Open(szSQL);
if (pADORecordSetObj.RecordCount = 1) then
bExists = TRUE;
endif;

set pADOConnObj = NOTHING;
return bExists;
end;

wtorek, 27 października 2009

Pobranie ścieżki danych serwera MSSQL

Jeżeli funkcja zwróci TRUE to do zmiennej svPath - zostanie przekazana ścieżka
function BOOL GetMSSQLPath(sServerName, sDBName, svPath, sDriver, bTrustedConn, sUserName, sUserPwd)
 OBJECT objConn, objRST;     
 STRING  szADOConnObjID;
 STRING sTekst, sConnString, sDBFileName;
 BOOL bReturn;
begin
 bReturn = FALSE;
 
 // Create the connectionstring
    if (sDriver == "") then
     sConnString = "Provider=sqloledb;";
    else
     sConnString = "Driver={" + sDriver + "};";
    endif;

 if (bTrustedConn) then
  //ACA_Log_AppendLine("   using Windows Authentication");
     sConnString = sConnString + "server=" + sServerName + ";";
  sConnString = sConnString + "database=" + sDBName + ";";
  sConnString = sConnString + "Trusted_connection=Yes";
 else
  //ACA_Log_AppendLine("   using SQL Login");
     sConnString = sConnString + "server=" + sServerName + ";";
  sConnString = sConnString + "uid=" + sUserName + ";";
  sConnString = sConnString + "pwd=" + sUserPwd + ";";
  sConnString = sConnString + "database=" + sDBName;
 endif;
 
  szADOConnObjID = "ADODB.Connection";
     set objConn = CreateObject(szADOConnObjID);         
 
        if (IsObject(objConn)) then 
  
   objConn.ConnectionString = sConnString;
   objConn.Open;        
   
   set objRST = objConn.Execute("select filename from sysfiles where filename like '%.mdf%' ");
   sDBFileName = objRST("filename");                                           
   ParsePath ( svPath, sDBFileName, PATH );       
   if (StrFind(svPath,"data\\")>0) then
    StrSub(svPath,svPath,0,StrFind(svPath,"data\\"));
   endif;                                        
   
   objConn.Close;   
   bReturn  = TRUE;   
     
  endif;
  
  set objConn = NOTHING;
  set objRST  = NOTHING;
  
 return (bReturn); 
end;

Wykonanie skryptu SQL z pliku

function BOOL ExecuteSQLScript(szFile, sServerName, sDBName, sDriver, bTrustedConn, sUserName, sUserPwd, bLog)
OBJECT objConn, objRST, pADORecordSetObj, adoCommand; 
STRING sConnString, szADOConnObjID, szADORecordSetObjID; 
BOOL bReturn, bOpenCon;
LIST ListaSQL;
INT i;
STRING szLine, szSQL;
begin                                  
 bReturn = TRUE;    
 bOpenCon = FALSE;
 // Create the connectionstring
    if (sDriver == "") then sConnString = "Provider=sqloledb;";
           else sConnString = "Driver={" + sDriver + "};";
    endif;

 if (bTrustedConn) then //ACA_Log_AppendLine("   using Windows Authentication");
     sConnString = sConnString + "server=" + sServerName + ";";
  sConnString = sConnString + "database=" + sDBName + ";";
  sConnString = sConnString + "Trusted_connection=Yes";
 else //ACA_Log_AppendLine("   using SQL Login");
     sConnString = sConnString + "server=" + sServerName + ";";
  sConnString = sConnString + "uid=" + sUserName + ";";
  sConnString = sConnString + "pwd=" + sUserPwd + ";";
  sConnString = sConnString + "database=" + sDBName;
 endif;

 try
  szADOConnObjID = "ADODB.Connection";
     set objConn = CreateObject(szADOConnObjID);         
   
  if (IsObject(objConn)) then 
   objConn.ConnectionString = sConnString;
   objConn.Open;                            
   bOpenCon = TRUE;      //Połączono 
  else
   if (bLog) then WriteLog(1,"Nie moża utworzyć obiektu połączenia ADODB.Connection do "+sDBName); endif;  
  endif;
    
  
 catch             
  bOpenCon = FALSE;
  bReturn = FALSE;
  if (bLog) then WriteLog(1,"Nie uzyskano połączenia z bazą "+sDBName); endif;  
 endcatch;
 
 
if (bOpenCon) then  //Jezeli połączono to odczytaj plik i wykonaj skrypty

 szSQL = "";
 ListaSQL = ListCreate(STRINGLIST);
 if Is(FILE_EXISTS,szFile) then                  
               
  ListReadFromFile(ListaSQL,szFile);                           //Odczytanie pliku do listy
  ListSetIndex(ListaSQL,LISTFIRST);
  for i = 0 to ListCount(ListaSQL)-1 
      ListCurrentString(ListaSQL, szLine);                     //linia po linii 
      if StrLength(szLine)>0 then
       if (StrLength(szLine)=2)&&(StrFind(szLine,"GO")>=0) then 
        //Wykonanie skryptu
        try
            set objRST = objConn.Execute(szSQL);      
            if (bLog) then 
             WriteLog(1,"- SQL: \""+szSQL+"\"");             
            endif; 
           catch             
            if (bLog) then 
             WriteLog(1,"- Błąd wykonania SQL: ");
             WriteLog(2,"\""+szSQL+"\"");
            endif;                       
            bReturn = FALSE;
           endcatch;                         
          
           szSQL = "";
       else
          //dopisywanie linii do postaci sql
          if StrLength(szSQL)>0 then szSQL = szSQL + " " + szLine; 
                          else szSQL = szLine;
          endif;      
       endif;    
      endif; //StrLength = 0; 
   
   ListSetIndex(ListaSQL,LISTNEXT);   
  endfor;
 
 else  
  if (bLog) then WriteLog(1,"- brak pliku skryptu SQL"); endif;
 endif;                
 
 ListDestroy(ListaSQL);
 set objConn = NOTHING;
 set objRST  = NOTHING;
 
 endif; //bOpen - połączono; 
 
 return bReturn;
 
end;

ExecuteSQL

Wykonanie zapytania SQL lub procedury
function BOOL ExecuteSQL(sSQL, sServerName, sDBName, sDriver, bTrustedConn, sUserName, sUserPwd, bLog, bQuery)
 OBJECT objConn, objRST, pADORecordSetObj,adoCommand; 
 STRING sTekst, sConnString;         
 STRING  szADOConnObjID,szADORecordSetObjID; 
 STRING szError;
BOOL bReturn;
begin
 bReturn = FALSE;
 
 // Create the connectionstring
    if (sDriver == "") then
     sConnString = "Provider=sqloledb;";
    else
     sConnString = "Driver={" + sDriver + "};";
    endif;

 if (bTrustedConn) then
  //ACA_Log_AppendLine("   using Windows Authentication");
     sConnString = sConnString + "server=" + sServerName + ";";
  sConnString = sConnString + "database=" + sDBName + ";";
  sConnString = sConnString + "Trusted_connection=Yes";
 else
  //ACA_Log_AppendLine("   using SQL Login");
     sConnString = sConnString + "server=" + sServerName + ";";
  sConnString = sConnString + "uid=" + sUserName + ";";
  sConnString = sConnString + "pwd=" + sUserPwd + ";";
  sConnString = sConnString + "database=" + sDBName;
 endif;
 
 try
  szADOConnObjID = "ADODB.Connection";
     set objConn = CreateObject(szADOConnObjID);         
    
  if (IsObject(objConn)) then 
 
   objConn.ConnectionString = sConnString;
   objConn.Open;                          
  
   if (!bQuery) then  //Jeżeli to Execute SQL a nie Query   
    set objRST = objConn.Execute(sSQL);      
    bReturn  = TRUE;
   else      
    // Create ADO Recordset object for the return         
    
    szADORecordSetObjID = "ADODB.Recordset";
    set pADORecordSetObj = CreateObject(szADORecordSetObjID);
    
    pADORecordSetObj.CursorType = 3;    
    pADORecordSetObj.ActiveConnection = objConn;    
    pADORecordSetObj.Open(sSQL);    
    if ((pADORecordSetObj.RecordCount >= 1)||(pADORecordSetObj.RecordCount = -1)) then
     bReturn = TRUE;
    else
      bReturn = FALSE; 
    endif;             
    
    set pADORecordSetObj = NOTHING;
   endif;
  else
   if (bLog) then WriteLog(1,"Nie moża utworzyć obiektu połączenia ADODB.Connection do "+sDBName); endif;  
  endif;
  
  set objConn = NOTHING;
  set objRST  = NOTHING;
  
 catch  
  if (bLog) then WriteLog(1,"Błąd wykonania zapytania SQL"); endif;  
 endcatch;
 
 return (bReturn);
end;