Вопрос

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

Я кое-что почитал по этому поводу и нашел эту конкретную остроту по этот форум Microsoft:

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

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

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

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

Это было полезно?

Решение

Ладно, я понял, как это сделать.

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

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

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

[ComVisible(истина)]

[GuidAttribute("{guid здесь}")]

[Интерфейс класса (ClassInterfaceType.AutoDual)] <--- Не рекомендуется, но неплохо...

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

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

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

Другие советы

Я не знаю способа, которым вы можете добраться до SMO через VB6.Я бы согласился с G Mastros о применении подхода COM / Interop для реализации.СЕТЕВОЙ код напрямую.

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

Я часто внедряю это на клиентах, у которых есть SQL Express (нет SQL Agent для резервного копирования, например 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-оболочки.Я выполнил описанные вами шаги, но мое решение не работает.Я делаю это в основном:

using System;
using System.Collections.Generic;

использование System.Text;использование System.Runtime.Службы взаимодействия;пространство имен 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"), происходит сбой.Это выдает "Ошибку времени выполнения ..."

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top