1

SQL Server 2000のサポートを終了し、SQLServer2005に加えてSQLServer2008のサポートを追加するため、COM+ベースのアプリケーションでSQLDMOの使用からSMOに移行しようとしています。

私はこれについて読んでいて、このマイクロソフトフォーラムでこの特定のquipを見つけました:

「SMOはVB/C#.Net2005でのみサポートされています。VB/VC6では使用できない.Net2.0Frameworkが必要です。」

それは本当ですか?一般的なグーグルとグーグルスタックオーバーフローは、決定的な答えを投げ出しませんでした。

VB6を使用してSQLSMOを実装することは可能ですか?

編集:これを回避するためにCOMラッパーを使用しました...詳細については、以下の回答を確認してください。

4

4 に答える 4

3

さて、私はこれを行う方法を考え出しました。

問題は、VB6 が .Net 2.0 をサポートしていないため、VB6 で SMO を使用できないことでした。

これを回避するために、SMO を使用する C# で COM ラッパーを作成し、(ほとんどの場合) VB アプリから必要な機能を 1 対 1 でマップします。

基本的に、C# プロジェクトを作成し、必要に応じて SMO 参照を追加し、クラス宣言の上に次の行を追加して、COM が見えるようにします。

[ComVisible(true)]

[GuidAttribute("{guid here}")]

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

プロジェクトのプロパティの [ビルド] セクションで、[COM 相互運用に登録] ボックスがオンになっていることを確認します。コンパイルして VB6 アプリにインポートすれば、すぐに始められます!!

2 つの異なるシステムを組み合わせようとする場合と同様に、VB6 アプリと C# ラッパーの間で渡すものを操作する必要がありますが、それほど難しくはありません。

さらに情報/詳細が必要な場合はコメントしてください。

于 2008-10-22T21:46:08.373 に答える
2

VB6 経由で SMO にアクセスする方法がわかりません。.NET コードを直接実装するための COM/Interop アプローチについては、G Mastros に同意します。

別の方法として、.NET SMO の作業を実行するスクリプトを実行して、Powershell にシェル アウトすることもできます。.NET フレームワーク (および明らかに Powershell) を要求するという前提条件はまだありますが、それで仕事は完了します。スクリプトは、資格情報、データベース名、バックアップの種類などのパラメーターを受け取ることができます。

私はこれを、SQL Express を使用しているクライアント (MSDE などのバックアップ用の SQL エージェントがない) に多く実装しています。スクリプトを呼び出してバックアップを管理するスケジュールされたタスクを接続します。

役立つ場合は、スクリプトを次に示します。大部分は盗用されていますが、多少変更しています。

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 に答える
-1

試したことはありませんが、おそらく vb.net コードを記述して SQL SMO とやり取りし、vb.net コードの com ラッパーを記述できます。もちろん、それを使用するには .net フレームワークが必要です。

代わりに、SQL DMO と SQL SMO から移行することをお勧めします。DMO や SMO で行うことはすべて、DMO なしで行うことができます。もちろん、簡単ではありませんが、代わりのコード (SQL DMO の代わりに直接的な T-SQL を使用) をグーグルで検索すると、必要な答えが得られます。

于 2008-10-15T21:41:43.703 に答える