2008-10-15 110 views
1

我們正試圖從基於COM +的應用程序中使用SQL DMO到SMO,因爲我們正在放棄對SQL Server 2000的支持,並且除了SQL Server之外還添加了對SQL Server 2008的支持2005年VB6對SQL SMO和.Net 2.0的支持

我一直在讀圍繞這一點,並發現this microsoft forum:

「SMO只在VB/C#.NET 2005支持這種特殊的諷刺則需要.NET 2.0框架,這是不可用於VB/VC 6.「

這是真的嗎?一般谷歌搜索和谷歌搜索stackoverflow沒有吐出和明確的答案。

是否有可能使用VB6實現SQL SMO?

編輯:我用COM包裝來解決這個問題...查看我的答案下面的一些更多的細節。

+0

你已經找到了解決這個?我要發佈一個類似的問題... – Taptronic 2008-10-21 14:13:51

+1

對不起沒看到你的評論是的,我反倒,事實上我只是給它最後的潤色。我會盡快發佈詳細的答案。應該是今天的某個時候。 – Mostlyharmless 2008-10-22 21:38:47

回答

3

好吧,我想出如何去做這個。

問題是VB6沒有.Net 2.0支持,因此我們不能在VB6中使用SMO。

要解決這個問題,我寫在C#中的COM包裝,它使用SMO和地圖(大部分)一到一個與我從我的VB應用程序所需要的那種功能。

基本上,創建一個C#項目,添加SMO引用根據需要,添加類聲明之上以下行,使其COM可見:

[標記有ComVisible特性(真)]

[GuidAttribute(」 {這裏GUID}「)]

[ClassInterface(ClassInterfaceType.AutoDual)< ---不推薦,但很齊全

在項目屬性中,在 」建「 部分,確保了「註冊COM Interop」b牛被檢查。編譯並導入到VB6應用程序中,並且您在業務中!

與試圖將任意兩個不同系統錘在一起的情況一樣,您將需要對在VB6應用程序和C#Wrapper之間傳遞的內容進行一些操作......但它並不難。

如果你需要了解更多信息/詳細信息請評論。

-1

我還沒有嘗試過,但你可能會寫vb.net代碼來與SQL SMO交互,然後爲vb.net代碼編寫一個com包​​裝器。當然,你仍然需要.net框架來使用它。

相反,我建議您從SQL DMO和SQL SMO遷移出來。你可以在沒有DMO或SMO的情況下做任何事情。當然,這不是一件容易的事情,但是使用搜索替代代碼(使用直接的T-SQL而不是SQL DMO)將爲您提供所需的答案。

+0

所以這個從SMO和SQL-DMO遷移的建議......它又是什麼基礎?也可以提出相反的論點。例如,與使用直接T-SQL操作完成相同的事情相比,SMO提供的許多任務都是微不足道的。我想聽到更多的理由。 – 2008-10-15 22:15:30

2

我不知道你可以通過VB6到SMO的方式。我同意G Mastros關於使用COM/Interop方法直接實現.NET代碼。

另一種可以考慮的方法是,您可以使用Powershell,執行一個腳本來完成.NET SMO的工作。你仍然有要求.NET框架(和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" 
+0

哇......謝謝你的回答!我需要在早上看一下它,因爲它是有道理的:P – Mostlyharmless 2008-10-16 04:01:56

0

感謝您的文章。它有助於我理解有一種解決方案可以使用COM Wrapper從VB6中使用SQLSMO。我遵循了您詳細描述的步驟,但我的解決方案不起作用。我基本上這樣做:

using System; 
using System.Collections.Generic; 

using 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

最後,當我導入.tlb文件,並創建一個對象像這樣運行後VB6 - 的CreateObject( 「COMWrapper.Class1」),它失敗。它提供了「運行時錯誤...」

請告知,什麼是,我很想念這裏...