質問

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

これについて読んでいると、このMicrosoftフォーラム:

<!> quot; SMOはVB / C#.Net 2005でのみサポートされています。VB/ VC 6では利用できない.Net 2.0フレームワークが必要です。<!> quot;

本当ですか?一般的なグーグルとグーグルのstackoverflowは、決定的な答えを投げ出さなかった。

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

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

役に立ちましたか?

解決

さて、これを行う方法を見つけました。

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

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

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

[ComVisible(true)]

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

[ClassInterface(ClassInterfaceType.AutoDual)] <!> lt; ---推奨されませんが、まあ...

プロジェクトプロパティの<!> quot; Build <!> quot;セクションで、<!> quot; COM Interop <!> quotに登録してください。ボックスがチェックされています。コンパイルしてVB6アプリにインポートすると、あなたはビジネスになります!!

2つの異なるシステムを一緒に使用しようとする場合と同様に、VB6アプリとC#ラッパーの間でやり取りする必要がある操作がいくつかありますが、それほど難しくありません。

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

他のヒント

VB6を介してSMOにアクセスする方法がわかりません。 .NETコードを直接実装するためのCOM /相互運用アプローチの実行についてG Mastrosに同意します。

検討する代替案は、PowerShellにシェルアウトして、.NET SMOの動作を実行するスクリプトを実行できることです。 .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"

投稿していただきありがとうございます。 COM Wrapperを使用してVB6からSQLSMOを使用するソリューションがあることを理解するのに役立ちます。詳細な手順に従いましたが、解決策が機能しません。私はこれを基本的にやっています:

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に関する次の参照も追加しました:

<!>#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;)、失敗します。 <!> quot; RunTime Error ... <!> quot;

Plsは、ここで何が欠けているかについてアドバイスします...

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

代わりに、SQL DMOおよびSQL SMOから移行することをお勧めします。 DMOまたはSMOで行うことはすべて、DMOなしで実行できます。もちろん、それは簡単ではありませんが、置換コードのグーグル検索(SQL DMOの代わりにストレートT-SQLを使用)が必要な答えを提供します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top