1

我们正在尝试在基于 COM+ 的应用程序中从使用 SQL DMO 转移到 SMO,因为我们正在放弃对 SQL Server 2000 的支持,并在 SQL Server 2005 之外添加对 SQL Server 2008 的支持。

我一直在阅读这方面的内容,并在这个微软论坛上找到了这个特别的俏皮话:

“SMO 仅在 VB/C#.Net 2005 中受支持。它需要 .Net 2.0 框架,而 VB/VC 6 中不可用。”

这是真的吗?一般谷歌搜索和谷歌搜索stackoverflow没有抛出和明确的答案。

是否可以使用 VB6 实现 SQL SMO?

编辑:我使用了 COM Wrapper 来解决这个问题......查看下面的答案以获取更多详细信息。

4

4 回答 4

3

好的,我想出了如何做到这一点。

问题是 VB6 不支持 .Net 2.0,因此我们不能将 SMO 与 VB6 一起使用。

为了解决这个问题,我用 C# 编写了一个 COM 包装器,它使用 SMO 并(主要)一对一地映射我想要从我的 VB 应用程序中获得的那种功能。

基本上,创建一个 C# 项目,根据需要添加 SMO 引用,在类声明上方添加以下行以使其 COM 可见:

[ComVisible(true)]

[GuidAttribute("{guid here}")]

[ClassInterface(ClassInterfaceType.AutoDual)] // <--- Not recommended, but well...

在项目属性的“构建”部分中,确保选中“注册 COM 互操作”框。编译并导入到 VB6 应用程序中,您就可以开始营业了!!

与尝试将任何两个不同的系统组合在一起的情况一样,您需要对在 VB6 应用程序和 C# Wrapper 之间传递的内容进行一些操作......但这并不难。

如果您需要更多信息/详细信息,请发表评论。

于 2008-10-22T21:46:08.373 回答
2

我不知道您可以通过 VB6 访问 SMO 的方法。我同意 G Mastros 关于使用 COM/Interop 方法直接实现 .NET 代码的观点。

要考虑的替代方法是您可以使用 Powershell,执行一个脚本来完成您的 .NET SMO 工作。您仍然有需要 .NET 框架(显然还有 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"
于 2008-10-16T00:53:09.497 回答
0

谢谢你的帖子。它帮助我了解有一个使用 COM Wrapper 从 VB6 使用 SQLSMO 的解决方案。我按照您详细说明的步骤进行操作,但我的解决方案不起作用。我基本上是这样做的:

using System;
using System.Collections.Generic;

使用 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

最后,当我在导入 .tlb 文件并创建这样的对象后运行 VB6 - CreateObject("COMWrapper.Class1") 时,它失败了。它给出“运行时错误...”

请告知我在这里缺少什么...

于 2015-08-13T17:44:55.833 回答
-1

我还没有尝试过,但您可能可以编写 vb.net 代码来与 SQL SMO 交互,然后为 vb.net 代码编写一个 com 包装器。当然,您仍然需要 .net 框架才能使用它。

相反,我建议您从 SQL DMO 和 SQL SMO 迁移。您对 DMO 或 SMO 所做的任何事情都可以在没有它的情况下完成。当然,这并不容易,但在谷歌上搜索替换代码(使用直接 T-SQL 而不是 SQL DMO)将为您提供所需的答案。

于 2008-10-15T21:41:43.703 回答