Domanda

Stiamo cercando di passare dall'uso di SQL DMO a SMO nella nostra applicazione basata su COM +, poiché stiamo abbandonando il supporto per SQL Server 2000 e aggiungendo il supporto per SQL Server 2008 oltre a SQL Server 2005.

Ho letto tutto questo e ho trovato questa particolare battuta su questo forum di microsoft:

" SMO è supportato solo in VB / C # .Net 2005. Richiede il .Net 2.0 Framework, che non è disponibile in VB / VC 6. "

È vero? Googling in generale e googling stackoverflow non hanno generato risposte definitive.

È possibile implementare SQL SMO utilizzando VB6?

Modifica: ho usato un wrapper COM per aggirare questo ... controlla la mia risposta qui sotto per ulteriori dettagli.

È stato utile?

Soluzione

Okay, ho capito come fare.

Il problema era che VB6 non ha supporto .Net 2.0 e quindi non possiamo usare SMO con VB6.

Per ovviare a questo, ho scritto un wrapper COM in C # che utilizza SMO e mappa (principalmente) uno a uno con il tipo di funzionalità che desidero dalla mia app VB.

Fondamentalmente, crea un progetto C #, aggiungi i riferimenti SMO secondo necessità, aggiungi le seguenti righe sopra la dichiarazione di classe per renderlo visibile COM:

[ComVisible (true)]

[GuidAttribute (" {guid here} ")]

[ClassInterface (ClassInterfaceType.AutoDual)] < --- Non raccomandato, ma bene ...

Nelle proprietà del progetto, tra " Build " sezione, assicurarsi che il " Registrati per COM Interop " la casella è selezionata. Compila e importa nell'app VB6 e sei in affari !!

Come nel caso del tentativo di martellare insieme due sistemi diversi, ci saranno alcune manipolazioni che dovrai fare con ciò che passi tra l'app VB6 e il wrapper C # ... ma non è troppo difficile.

Commenta se hai bisogno di ulteriori informazioni / dettagli.

Altri suggerimenti

Non so come si possa arrivare a SMO tramite VB6. Concordo con G Mastros sull'approccio COM / Interop per implementare direttamente il codice .NET.

Un'alternativa da considerare è che potresti sborsare su Powershell, eseguendo uno script che farebbe funzionare il tuo SMO .NET. Hai ancora il prerequisito per richiedere il framework .NET (e Powershell ovviamente), ma farebbe il suo lavoro. Lo script potrebbe assumere parametri per credenziali, nome del database, tipo di backup, ecc.

Lo implemento molto sui client che hanno SQL Express (nessun SQL Agent per i backup, come MSDE). Collego un'attività pianificata che richiama lo script e gestisce i loro backup.

Se utile, ecco uno script - in gran parte rubato ma l'ho modificato in qualche modo:

param (
  [string] $ServerName,
  [string] $DatabaseName,
  [string] $Backuptype,
  [string] $BackupPath,
  [int] $NumDays
)
Get-ChildItem $BackupPath | where {$_.LastWriteTime -le (Get-Date).AddDays(-$NumDays)} | remove-item
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo") | out-null
[System.IO.Directory]::CreateDirectory($BackupPath) | out-null
$srv=New-Object "Microsoft.SqlServer.Management.Smo.Server" "$servername"
$bck=new-object "Microsoft.SqlServer.Management.Smo.Backup"

if ($Backuptype -eq "FULL") 
{
$bck.Action = 'Database' 
$extenstion=".BAK" 
$text1="Full Backup"
}

if ($Backuptype -eq "TRAN") 
{
$bck.Action = 'Log' 
$bck.LogTruncation = 2
$extenstion=".TRN" 
$text1="Transactional Log Backup"
}

if ($Backuptype -eq "DIFF") 
{ 
$bck.Incremental = 1 
$extenstion=".DIFF"  
$text1="Differential Backup"
}

$fil=new-object "Microsoft.SqlServer.Management.Smo.BackupDeviceItem"
$fil.DeviceType='File'
$fil.Name=[System.IO.Path]::Combine($BackupPath, $DatabaseName+ "_"+ [DateTime]::Now.ToString("yyyy_MM_dd_HH_mm")+$extenstion)
$bck.Devices.Add($fil)
$bck.Database=$DatabaseName
$bck.SqlBackup($srv)
write-host $text1 of $Databasename done

Può eseguire backup completi, differenziali e transazionali e nominare in modo univoco ciascun file risultante in base alla data e all'ora, eliminando tutti i file più vecchi di un certo numero di giorni.

La sintassi per chiamarla è:

.\Backup.ps1 INSTANCENAME DATABASENAME FULL|TRAN|DIFF PATH DAYSTOKEEP

così ...

.\Backup.ps1 SQLEXPRESS Northwind FULL C:\TempHold\Test 30
.\Backup.ps1 SQLEXPRESS Northwind TRAN C:\TempHold\Test 30
.\Backup.ps1 SQLEXPRESS Northwind DIFF C:\TempHold\Test 30

Per pianificare in Utilità di pianificazione, passare:

powershell c:\temphold\test\backup.ps1 "SQLEXPRESS Northwind DIFF C:\TempHold\Test 30"

Grazie per il tuo post. Mi aiuta a capire che esiste una soluzione per usare SQLSMO da VB6 usando COM Wrapper. Ho seguito i passaggi dettagliati, ma la mia soluzione non funziona. Lo sto facendo sostanzialmente:

using System;
using System.Collections.Generic;

utilizzando System.Text; utilizzando System.Runtime.InteropServices; spazio dei nomi WrapperCOM {

[System.Runtime.InteropServices.ComVisible(true)]

[GuidAttribute("1d93750c-7465-4a3e-88d1-5e538afe7145")]



[ClassInterface(ClassInterfaceType.AutoDual)]
public class Class1
{
    public Class1() { }
}

}

Ho anche aggiunto i seguenti riferimenti per SQLSMO:

&

# 8226; Microsoft.SqlServer.ConnectionInfo.dll

&

# 8226; Microsoft.SqlServer.Smo.dll

&

# 8226; Microsoft.SqlServer.Management.Sdk.Sfc.dll

&

# 8226; Microsoft.sqlserver.sqlenum.dll

Finalmente quando eseguo il VB6 dopo aver importato il file .tlb e aver creato un oggetto come questo - CreateObject (& Quot; COMWrapper.Class1 & Quot;), non riesce. Fornisce & Quot; Errore RunTime ... & Quot;

Vi prego di sapere cosa mi sto perdendo qui ...

Non l'ho provato, ma probabilmente potresti scrivere il codice vb.net per interagire con SQL SMO, quindi scrivere un wrapper com per il codice vb.net. Ovviamente, avrai ancora bisogno di .net framework per usarlo.

Invece, suggerirei di migrare da SQL DMO e SQL SMO. Tutto ciò che fai con DMO o SMO può essere fatto senza di esso. Certo, non sarà facile, ma cercare su Google il codice sostitutivo (usando direttamente T-SQL anziché SQL DMO) ti fornirà le risposte di cui hai bisogno.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top