Поддержка VB6 для SQL SMO и .Net 2.0 - PullRequest
1 голос
/ 16 октября 2008

Мы пытаемся перейти от использования 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."

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

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

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

Ответы [ 4 ]

3 голосов
/ 23 октября 2008

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

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

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

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

[ComVisible (истина)]

[GuidAttribute ("{guid here}")]

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

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

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

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

2 голосов
/ 16 октября 2008

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

Альтернативой для рассмотрения является то, что вы можете использовать Shell для 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"
0 голосов
/ 13 августа 2015

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

using System;
using System.Collections.Generic;

с использованием System.Text; using System.Runtime.InteropServices; пространство имен 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 ...»

Просьба сообщить, что мне здесь не хватает ...

0 голосов
/ 16 октября 2008

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

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

...