Поддержка VB6 для SQL SMO и.Net 2.0

Мы пытаемся перейти от использования SQL DMO к SMO в нашем приложении на основе COM+, так как мы отказываемся от поддержки SQL Server 2000 и добавляем поддержку SQL Server 2008 в дополнение к SQL Server 2005.

Я читал об этом, и нашел этот конкретный квик на этом форуме Microsoft:

"SMO поддерживается только в VB/C#.Net 2005. Для этого требуется.Net 2.0 Framework, который недоступен в VB/VC 6."

Это правда? Поиск в гугле в целом и поиск в стеке googling не выкинули и однозначных ответов.

Можно ли реализовать SQL SMO с использованием VB6?

Изменить: я использовал COM Wrapper, чтобы обойти это... проверьте мой ответ ниже для некоторых более подробной информации.

4 ответа

Решение

Хорошо, я понял, как это сделать.

Проблема заключалась в том, что VB6 не поддерживает.Net 2.0, и поэтому мы не можем использовать SMO с VB6.

Чтобы обойти это, я написал оболочку COM на C#, которая использует SMO и сопоставляет (в основном) один-к-одному с той функциональностью, которую я хочу получить от моего приложения VB.

По сути, создайте проект C#, добавьте ссылки SMO ​​по мере необходимости, добавьте следующие строки над объявлением класса, чтобы сделать его видимым для COM:

[ComVisible (истина)]

[GuidAttribute ("{guid here}")]

[ClassInterface (ClassInterfaceType.AutoDual)] <--- Не рекомендуется, но хорошо...

В свойствах проекта в разделе "Сборка" убедитесь, что установлен флажок "Зарегистрироваться для взаимодействия с COM". Скомпилируйте и импортируйте в приложение VB6, и вы в деле!

Как и в случае с попыткой объединить две разные системы, вам понадобятся некоторые манипуляции с тем, что вы передаете между приложением VB6 и C# Wrapper... но это не слишком сложно.

Пожалуйста, прокомментируйте, если вам нужна дополнительная информация / детали.

Я не знаю, как вы можете добраться до SMO через VB6. Я бы согласился с G Mastros о подходе COM/Interop для непосредственной реализации кода.NET.

Альтернативой для рассмотрения является то, что вы могли бы раскошелиться на Powershell, выполнив скрипт, который бы выполнял вашу работу.NET SMO. У вас все еще есть предварительное условие для требования.NET Framework (и, конечно, Powershell), но это сделает работу. Ваш скрипт может принимать параметры для учетных данных, имени базы данных, типа резервной копии и т. Д.

Я часто это реализую на клиентах, у которых есть SQL Express (нет агента SQL для резервного копирования, как MSDE). Я подключаю запланированное задание, которое вызывает скрипт и управляет его резервным копированием.

Если полезно, вот сценарий - в основном украден, но я несколько изменил его:

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

Он может делать полное, разностное и транзакционное резервное копирование и однозначно присваивать имена каждому результирующему файлу на основе даты и времени, удаляя все файлы старше определенного количества дней.

Синтаксис для вызова:

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

так...

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

Чтобы запланировать в планировщике заданий, введите:

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

Спасибо за ваш пост. Это помогает мне понять, что есть решение использовать SQLSMO из VB6 с использованием COM Wrapper. Я выполнил шаги, которые вы подробно описали, но мое решение не работает. Я делаю это в основном:

using System;
using System.Collections.Generic;

использование System.Text; using System.Runtime.InteropServices; namespace WrapperCOM {

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

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



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

}

Я также добавил следующие ссылки для SQLSMO:

• Microsoft.SqlServer.ConnectionInfo.dll

• Microsoft.SqlServer.Smo.dll

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

• Microsoft.SqlServer.SqlEnum.dll

Наконец, когда я запускаю VB6 после импорта файла.tlb и создания подобного объекта - CreateObject("COMWrapper.Class1"), происходит сбой. Это дает "RunTime Error..."

Пожалуйста, посоветуйте, что мне здесь не хватает...

Я не пробовал, но вы могли бы написать код vb.net для взаимодействия с SQL SMO, а затем написать обертку com для кода vb.net. Конечно, вам все равно понадобится.net framework для его использования.

Вместо этого я бы предложил вам перейти от SQL DMO и SQL SMO. Все, что вы делаете с DMO или SMO, может быть сделано без него. Конечно, это будет нелегко, но поиск заменяющего кода (использование прямого T-SQL вместо SQL DMO) даст вам ответы на ваши вопросы.

Другие вопросы по тегам