Frage

Wir versuchen, verwendet SQL DMO zu SMO in unserer COM + basierten Anwendung zu bewegen, wie wir die Unterstützung für SQL Server 2000 und das Hinzufügen von Unterstützung für SQL Server fallen werden 2008 zusätzlich zu SQL Server 2005.

Ich habe auf der Lektüre dieses um und fand diese besondere Bonmot auf das Microsoft-Forum:

"SMO ist nur in VB / C # .Net unterstützt 2005. Es .Net 2.0 Framework erfordert, die in VB / VC 6 ist nicht verfügbar."

Ist es wahr? nicht erbrechen und definitive Antworten im Allgemeinen und googeln Stackoverflow googeln.

Ist es möglich, SQL-SMO mit VB6 zu implementieren?

Edit:. Ich habe COM Wrapper verwendet, dies zu umgehen ... Check für einige weitere Details unten meine Antwort aus

War es hilfreich?

Lösung

Okay, ich herausgefunden, wie dies zu tun.

Das Problem war, dass VB6 keine .NET 2.0-Unterstützung hat und daher können wir SMO nicht mit VB6 verwenden.

um das zu bekommen, schrieb ich einen COM-Wrapper in C #, die verwenden SMO und Karten (meistens) eine Eins-zu-eins mit der Art von Funktionalität, die ich aus meiner VB App möge.

Im Grunde erstellen C # Projekt, fügen Sie die SMO Referenzen je nach Bedarf die folgenden Zeilen oberhalb der Klassendeklaration zu machen COM sichtbar:

[ComVisible (true)]

[GuidAttribute ( "{guid hier}")]

[Classinterface (ClassInterfaceType.AutoDual)] <--- Nicht zu empfehlen, aber gut ...

In den Projekteigenschaften, in dem „Build“ Abschnitt, stellen Sie sicher, dass die „Register für COM-Interop“ aktiviert ist. Kompilieren und Einfuhr in den VB6-App und Sie sind im Geschäft !!

Wie ist der Fall mit dem Versuch zusammen alle zwei verschiedene Systeme zu hämmern, wird es einige Manipulationen, die Sie benötigen mit dem zu tun, was Sie passieren zwischen dem VB6 app und den C # Wrapper ... aber es ist nicht zu hart.

Bitte kommentieren Sie, wenn Sie weitere Informationen / Details benötigen.

Andere Tipps

Ich weiß nicht, von einer Art und Weise Sie SMO über VB6 zu bekommen. Ich würde mit G Mastros zustimmen über einen COM / Interop Ansatz tun direkt .NET-Code zu implementieren.

Eine Alternative zu prüfen ist, dass Sie zu Powershell berappen könnten, einen Skript ausführen, die .NET-SMO Arbeit tun würde. Sie haben noch die Voraussetzung das .NET Framework zu erfordern (und Powershell natürlich), aber es würde den Job zu erledigen. Ihr Skript Parameter für Anmeldeinformationen übernehmen könnte, Datenbankname, Backup-Typ, etc.

das ist eine Menge an Kunden, die SQL Express haben (keine SQL-Agent für Sicherungen, wie MSDE)

I umzusetzen. Ich Haken eine geplante Aufgabe, die das Skript aufruft und verwaltet ihre Backups.

Wenn hilfreich, hier ist ein Skript - weitgehend gestohlen, aber ich habe es etwas geändert:

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

Es kann nicht vollständig, differentiell und Transaktionssicherungen und eindeutigen Namen jede resultierende Datei basierend auf dem Datum und Uhrzeit, das Löschen alle Dateien, die älter als eine bestimmte Anzahl von Tagen.

Die Syntax zu nennen ist:

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

so ...

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

im Taskplaner planen will, passiert in:

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

Vielen Dank für Ihren Beitrag. Es hilft mir zu verstehen, dass es eine Lösung gibt SQLSMO von VB6 COM Wrapper zu verwenden. Ich folgte den Schritten, die Sie detailliert, aber meine Lösung funktioniert nicht. Ich tue dies im Grunde:

using System;
using System.Collections.Generic;

System.Text verwendet wird; Verwendung System.Runtime.InteropServices; Namespace WrapperCOM {

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

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



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

}

Ich habe auch die folgenden Hinweise für SQLSMO:

• Microsoft.SqlServer.ConnectionInfo.dll

• Microsoft.sqlserver.smo.dll

• Microsoft.SqlServer.Management.Sdk.Sfc.dll

• Microsoft.sqlserver.sqlenum.dll

Schließlich, wenn ich die VB6 laufen nach der TLB-Datei zu importieren und ein Objekt wie folgt zu schaffen - Create ( "COMWrapper.Class1"), es funktioniert nicht. Es gibt "Runtime Error ..."

Pls raten, was das ist, ich bin hier fehlt ...

Ich habe es nicht ausprobiert, aber Sie könnten wahrscheinlich vb.net Code zur Interaktion mit SQL SMO, und dann schreiben einen COM-Wrapper für den vb.net Code schreiben. Natürlich, werden Sie noch .net Framework müssen, es zu benutzen.

Stattdessen würde ich vorschlagen, dass Sie bei der Migration weg von SQL DMO und SQL SMO. Alles, was Sie mit DMO oder SMO tun können, ohne es getan werden. Natürlich wird es nicht einfach sein, aber für Ersatzcode googeln Sie liefern die Antworten benötigen Sie (gerade T-SQL anstelle von SQL-DMO verwendet wird).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top