Question

Nous essayons de passer de l'utilisation de SQL DMO à SMO dans notre application COM +, car nous abandonnons la prise en charge de SQL Server 2000 et ajoutons la prise en charge de SQL Server 2008 en plus de SQL Server 2005.

J'ai lu des articles à ce sujet et j'ai trouvé cette information particulière sur ce forum Microsoft:

& "; SMO est uniquement pris en charge dans VB / C # .Net 2005. Il nécessite le Framework .Net 2.0, qui n'est pas disponible dans VB / VC 6. &";

Est-ce vrai? Googler en général et googler stackoverflow n’a pas donné lieu à des réponses définitives.

Est-il possible d'implémenter SQL SMO à l'aide de VB6?

Modifier: j'ai utilisé un wrapper COM pour résoudre ce problème ... consultez ma réponse ci-dessous pour obtenir plus de détails.

Était-ce utile?

La solution

D'accord, j'ai compris comment faire cela.

Le problème était que VB6 n’a pas de support .Net 2.0 et nous ne pouvons donc pas utiliser SMO avec VB6.

Pour contourner ce problème, j’ai écrit un wrapper COM en C # qui utilise SMO et mappe (généralement) un à un avec le type de fonctionnalité que je veux de mon application VB.

En gros, créez un projet C #, ajoutez les références SMO selon vos besoins, ajoutez les lignes suivantes au-dessus de la déclaration de classe pour le rendre visible par COM:

[ComVisible (true)]

[GuidAttribute (" {guid here} "))]

[ClassInterface (ClassInterfaceType.AutoDual)] < --- Non recommandé, mais bon ...

Dans les propriétés du projet, dans le " Construire " section, assurez-vous que la commande & "Registre pour l'interopérabilité COM &"; la case est cochée. Compilez et importez dans l'application VB6 et vous êtes en affaires!

Comme c'est le cas lorsque vous essayez de combiner deux systèmes différents, il y aura quelques manipulations que vous devrez faire avec ce que vous passez entre l'application VB6 et C # Wrapper ... mais ce n'est pas trop difficile.

Veuillez commenter si vous souhaitez plus d'informations / de détails.

Autres conseils

Je ne sais pas comment vous pouvez accéder à SMO via VB6. Je suis d’accord avec G Mastros pour une approche COM / Interop permettant d’implémenter directement du code .NET.

Une alternative à considérer est que vous pouvez passer à Powershell, en exécutant un script qui ferait fonctionner votre SMO .NET. Vous devez toujours utiliser le framework .NET (et Powershell évidemment), mais le travail sera fait. Votre script peut prendre des paramètres pour les informations d'identification, le nom de la base de données, le type de sauvegarde, etc.

Je l’implémente beaucoup chez les clients qui ont SQL Express (pas d’agent SQL pour les sauvegardes, comme MSDE). Je raccorde une tâche planifiée qui appelle le script et gère leurs sauvegardes.

Si utile, voici un script - en grande partie volé mais je l’ai modifié quelque peu:

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

Il peut effectuer des sauvegardes complètes, différentielles et transactionnelles et nommer de manière unique chaque fichier résultant en fonction de la date et de l'heure, en supprimant tous les fichiers de plus d'un certain nombre de jours.

La syntaxe à appeler est la suivante:

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

alors ...

.\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

Pour planifier dans le Planificateur de tâches, transmettez:

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

Merci pour votre message. Cela m'aide à comprendre qu'il existe une solution pour utiliser SQLSMO à partir de VB6 à l'aide de COM Wrapper. J'ai suivi les étapes que vous avez détaillées, mais ma solution ne fonctionne pas. Je le fais essentiellement:

using System;
using System.Collections.Generic;

using System.Text; using System.Runtime.InteropServices; espace de noms WrapperCOM {

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

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



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

}

J'ai également ajouté les références suivantes pour SQLSMO:

& # 8226; Microsoft.SqlServer.ConnectionInfo.dll

& # 8226; Microsoft.SqlServer.Smo.dll

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

& # 8226; Microsoft.SqlServer.SqlEnum.dll

Enfin, lorsque j'exécute le VB6 après avoir importé le fichier .tlb et créé un objet comme celui-ci - CreateObject (& Quot; COMWrapper.Class1 & Quot;)), il échoue. Cela donne & Quot; RunTime Error ... & Quot;

Les conseils de Pls quant à ce qui me manque ici ...

Je ne l'ai pas essayé, mais vous pourriez probablement écrire du code vb.net pour interagir avec SQL SMO, puis écrire un wrapper pour le code vb.net. Bien entendu, vous aurez toujours besoin du framework .net pour l'utiliser.

Au lieu de cela, je vous suggère de migrer hors de SQL DMO et de SQL SMO. Tout ce que vous faites avec DMO ou SMO peut être fait sans cela. Bien sûr, ce ne sera pas facile, mais rechercher du code de remplacement sur Google (en utilisant simplement T-SQL au lieu de SQL DMO) vous fournira les réponses dont vous avez besoin.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top