2008-10-15 3 views
1

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

Я читал вокруг на этом, и нашел эту особую остроту на this microsoft forum:

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

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

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

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

+0

Вы нашли решение этой проблемы? Я собирался опубликовать аналогичный вопрос ... – Taptronic 2008-10-21 14:13:51

+1

Извините, не видел твой комментарий ... Да, у меня на самом деле, инфакт, я просто даю ему последние штрихи. Постарайте подробный ответ, как только я закончу. должно быть когда-то сегодня. – Mostlyharmless 2008-10-22 21:38:47

ответ

3

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

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

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

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

[ComVisible (истина)]

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

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

в свойствах проекта, в разделе "Построить", убедитесь в том, «Регистрация для COM-взаимодействия» b ox проверяется. Скомпилируйте и импортируйте в приложение VB6, и вы в бизнесе!

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

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

-1

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

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

+0

Итак, это предложение о переносе от SMO и SQL-DMO ... какова была его основа? Можно было бы сделать противоположный аргумент. Например, многие задачи, предлагаемые SMO, тривиализованы по сравнению с выполнением одних и тех же операций с прямой манипуляцией T-SQL. Я хотел бы услышать больше оправдания. – 2008-10-15 22:15:30

2

Я не знаю, как вы можете добраться до 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" 
+0

Вау ... спасибо за ответ!Мне нужно будет посмотреть на это утром, чтобы это имело смысл: P – Mostlyharmless 2008-10-16 04:01:56

0

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

using System; 
using System.Collections.Generic; 

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

Pls советуют, как к тому, что, что я здесь отсутствует ...

Смежные вопросы