我们正试图将从使用SQL DMO以测绘,在我们COM+基础的应用程序,因为我们正在下降支持SQL Server2000和加入支持SQL服务器2008年在加到SQL服务器2005年。

我已经阅读周围这一点,并找到这个特别是在讽刺 这microsoft论坛:

"测绘为仅仅支持在VB/C#。净2005年。它需要。网2.0的框架,该框架不是用在VB/VC6."

这是真的吗?谷歌搜索一般和谷歌搜索的计算器并没有扔了和明确的答案。

是否有可能实现SQL测绘使用维生素b6?

编辑:我用了一个COM包装要解决这个...看看我的回答以下一些更多的详细信息。

有帮助吗?

解决方案

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

问题是VB6没有.Net 2.0支持,因此我们不能在VB6上使用SMO。

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

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

[标记有ComVisible特性(真)]

[GuidAttribute(<!> quot; {guid here} <!> quot;)]

[ClassInterface(ClassInterfaceType.AutoDual)] <!> lt; ---不推荐,但是......

在项目属性中,在<!> quot; Build <!>中;部分,确保<!>“注册COM Interop <!>”;框已选中。编译并导入VB6应用程序,您正在开展业务!!

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

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

其他提示

我不知道你可以通过VB6进入SMO的方式。我同意G Mastros关于直接实现.NET代码的COM / Interop方法。

另一个需要考虑的方法是,你可以向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"

感谢您的帖子。它帮助我理解有一个使用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添加了以下引用:

<!>

#8226; Microsoft.SqlServer.ConnectionInfo.dll

<!>

#8226; Microsoft.SqlServer.Smo.dll

<!>

#8226; Microsoft.SqlServer.Management.Sdk.Sfc.dll

<!>

#8226; Microsoft.SqlServer.SqlEnum.dll

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

请告知我在这里失踪的是什么......

我还没有尝试过,但你可以写信vb.net 代码的交互SQL测绘处,然后写一com包装的vb.net 代码。当然,你仍然需要。净框架内使用它。

相反,我会建议你迁移距离SQL DMO和SQL测绘.你做什么与目的地管理组织或测绘可以做到的,没有它。当然,这不会是容易的,但是谷歌上搜索,用于替代码(采用直T-SQL而不是SQL DMO)提供的答案你所需要的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top