2008-10-15 5 views
1

우리는 COM + 기반 응용 프로그램에서 SQL DMO 사용을 SMO로 전환하려고합니다. SQL Server 2000에 대한 지원을 중단하고 SQL Server 이외에 SQL Server 2008에 대한 지원을 추가하기 때문입니다 2005 년SQL SMO 및 .Net 2.0에 대한 VB6 지원

나는이 주위에 읽기,

는 "SMO는 VB/C# .NET을 2005 년에 지원 this microsoft forum:에이 특정 경구를 발견되었습니다 그것은 닷넷 2.0 프레임 워크 아니다 요구하는 VB/VC 6에서 사용할 수 있습니다. "

사실입니까? 일반적으로 인터넷 검색 및 stackoverflow 인터넷 검색 및 확실한 대답을 포기하지 않았다.

VB6을 사용하여 SQL SMO를 구현할 수 있습니까?

편집 :이 문제를 해결하기 위해 COM 래퍼를 사용했습니다 ... 자세한 내용은 아래에서 내 대답을 확인하십시오.

+0

는이에 대한 해결책을 찾았 ...

Pls는 내가 여기 실종 오전 무엇에 관한 조언 "... 런타임 오류"를 준다? 비슷한 질문을 올리려고했습니다 ... – Taptronic

+1

죄송합니다. 내 의견을 보지 못했습니다 ... 예, 실제로 사실, 나는 그것을 최종 감동으로주고 있습니다. 내가 끝내 자마자 상세한 답변을 게시 할 것입니다. 오늘 언젠가 있어야합니다. – Mostlyharmless

답변

3

가 좋아, 내가 알아 낸 방법 이것을하기 위해.

문제는 VB6에는 .Net 2.0 지원이 없으므로 VB6에서 SMO를 사용할 수 없다는 것입니다.

이 문제를 해결하기 위해 C#에서 SMO를 사용하고 VB에서 제공하는 기능과 일대일 (주로) 매핑하는 COM 래퍼를 작성했습니다.

기본적으로, 필요에 따라 확인하기 위해 클래스 선언 위에 다음 줄을 추가합니다 C# 프로젝트를 만들기 SMO의 참조를 추가 그것은 COM 볼 수 :

[대해 ComVisible (사실)] (

[GuidAttribute " "빌드 섹션에서 확인"

[ClassInterface이 (ClassInterfaceType.AutoDual)] < ---에서, 프로젝트 속성에서

... 음 권장하지만,하지]) "{여기에 GUID} "COM Interop 등록"b 황소가 확인됩니다. 컴파일 및 VB6 응용 프로그램으로 가져 오기 및 당신은 사업에있어!

두 개의 다른 시스템을 함께 해머하는 경우와 마찬가지로 VB6 앱과 C# 래퍼간에 전달해야 할 작업이 일부 있습니다.하지만 너무 어렵지는 않습니다.

더 자세한 정보가 필요하면 의견을 보내주십시오.

+0

아마도 이것이 가장 손쉬운 방법 일 것입니다. Com Interop은 .NET에서 COM 개체를 단순히 노출하는 것으로 간주되기 때문에 재미 있습니다.하지만 다른 방식으로도 작동합니다! 좋은 해결책. –

-1

나는 그것을 시도하지는 않았지만 아마도 SQL SMO와 상호 작용할 vb.net 코드를 작성한 다음 vb.net 코드에 대한 com 래퍼를 작성할 수 있습니다. 물론, 그것을 사용하기 위해서는 여전히 .net 프레임 워크가 필요합니다.

대신 SQL DMO 및 SQL SMO에서 마이그레이션하는 것이 좋습니다. DMO 또는 SMO를 사용하여 수행하는 모든 작업은 DMO 또는 SMO없이 수행 할 수 있습니다. 물론 쉽지는 않을 것이지만 대체 코드 (SQL DMO 대신 T-SQL을 사용)를 사용하면 필요한 답변을 얻을 수 있습니다.

+0

그래서 SMO와 SQL-DMO에서 마이그레이션하는이 제안은 ... 다시 그게 무슨 근거였습니까? 반대의 주장도 가능할 수 있습니다. 예를 들어, SMO가 제공하는 많은 작업은 T-SQL 조작으로 똑같은 일을하는 것과 비교하면 간단합니다. 나는 더 많은 칭의를 듣고 싶다. –

2

VB6를 통해 SMO에 접근 할 수있는 방법을 모르겠습니다. .NET 코드를 직접 구현하기 위해 COM/Interop 방식을 수행하는 것에 대해서는 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" 
+0

와우 ... 답변 주셔서 감사합니다!아침에 그것을 볼 필요가 있습니다. P – Mostlyharmless

+0

비록 매우 상세하고 정확한 것이지만,이 특별한 경우에는 해결책이 적용되지 않습니다. 그러나 나는 가능한 해결책을 찾았습니다. 내가 그것을 작동 시키 자마자 업데이트로 게시 할 것입니다. – Mostlyharmless

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

나는이 같은 객체를 .TLB 파일을 가져 와서 만든 후 VB6을 실행할 때

Microsoft.SqlServer.SqlEnum.dll

• 마지막으로 - CreateObject를 ("COMWrapper.Class1"), 그것은 실패합니다. 그것은

관련 문제