Pergunta

Estamos tentando mover-se de utilizar o SQL DMO para SMO em nossa aplicação baseada COM +, como estamos fim do suporte para SQL Server 2000 e adicionando suporte para SQL Server 2008, além de SQL Server 2005.

Eu tenho lido ao redor neste, e encontrei este piada particular sobre este microsoft fórum:

"SMO só é suportada no VB / C # .Net 2005. Ele requer o .Net 2.0 Framework, que não está disponível em VB / VC 6."

É verdade? Pesquisando em stackoverflow geral e pesquisando não vomitar e respostas definitivas.

É possível implementar SQL SMO usando VB6?

Editar:. Eu usei um wrapper para contornar este ... confira abaixo a minha resposta para mais alguns detalhes

Foi útil?

Solução

Ok eu descobri como fazer isso.

O problema era que VB6 não tem suporte .Net 2.0 e, portanto, não podemos usar SMO com VB6.

Para contornar isso, eu escrevi um wrapper COM em C # que usa SMO e mapas (principalmente) um-para-um com o tipo de funcionalidade que eu quero de do meu aplicativo VB.

Basicamente, criar um projeto C #, adicionar as referências SMO, conforme necessário, adicione as seguintes linhas acima a declaração de classe para torná-lo visível COM:

[ComVisible (true)]

[GuidAttribute ( "{guid aqui}")]

[ClassInterface (ClassInterfaceType.AutoDual)] <--- Não recomendado, mas bem ...

Nas propriedades do projeto, na seção "Build", verifique se a caixa "Registrar para interoperabilidade" está marcada. Compilar e importação para o aplicativo VB6 e você está no negócio !!

Como é o caso com a tentar martelar quaisquer dois sistemas diferentes juntos, haverá algumas manipulações que você terá de fazer com que você passe entre o aplicativo VB6 eo # Wrapper C ... mas não é muito difícil.

Por favor, comente se você precisar de mais alguma informação / detalhes.

Outras dicas

Eu não sei de uma maneira que você pode começar a SMO via VB6. Eu concordo com o G Mastros sobre fazer uma abordagem COM / Interop para implementar o código .NET diretamente.

Uma alternativa a considerar é que você poderia desembolsar para PowerShell, a execução de um script que iria fazer o seu trabalho .NET SMO. Você ainda tem o pré-requisito de exigir que o .NET framework (e Powershell obviamente), mas seria fazer o trabalho. Seu script pode levar parâmetros para credenciais, nome do banco, tipo de backup, etc.

Eu implementar esta muito em clientes que têm SQL Express (sem agente SQL para backups, como MSDE). I ligar uma tarefa agendada que invoca o script e gerencia seus backups.

Se útil, aqui está um script - em grande parte roubada, mas eu modifiquei-lo um pouco:

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

Ele pode fazer completos, diferenciais e backups transacionais e exclusivamente nomes de cada arquivo resultante com base na data e hora, apagando todos os arquivos mais antigos do que um determinado número de dias.

A sintaxe de chamá-lo é:

.\Backup.ps1 INSTANCENAME DATABASENAME FULL|TRAN|DIFF PATH DAYSTOKEEP

então ...

.\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

Para agendar no Agendador de tarefas, passar em:

powershell c:\temphold\test\backup.ps1 "SQLEXPRESS Northwind DIFF C:\TempHold\Test 30"

Obrigado por seu post. Isso me ajuda a entender que há uma solução para uso SQLSMO de VB6 usando Wrapper COM. Eu segui os passos que você detalhados, mas a minha solução não funciona. Estou fazendo isso basicamente:

using System;
using System.Collections.Generic;

using System.Text; usando System.Runtime.InteropServices; namespace WrapperCOM {

[System.Runtime.InteropServices.ComVisible(true)]

[GuidAttribute("1d93750c-7465-4a3e-88d1-5e538afe7145")]



[ClassInterface(ClassInterfaceType.AutoDual)]
public class Class1
{
    public Class1() { }
}

}

Eu também acrescentou as seguintes referências para SQLSMO:

• Microsoft.SqlServer.ConnectionInfo.dll

• Microsoft.SQLServer.smo.dll

• Microsoft.SqlServer.Management.Sdk.Sfc.dll

• Microsoft.SQLServer.sqlenum.dll

Finalmente, quando eu executar o VB6 depois de importar o arquivo .tlb e criar um objeto como este - CreateObject ( "COMWrapper.Class1"), ele falha. Ele dá "Erro de tempo de ..."

Pls aconselhar sobre o que é que eu estou em falta aqui ...

Eu não tentei isso, mas você poderia provavelmente código vb.net gravação para interagir com SQL SMO, e em seguida, escrever um com invólucro para o código vb.net. Claro, você ainda precisa estrutura .net para usá-lo.

Em vez disso, gostaria de sugerir que você migrar do SQL DMO e SQL SMO. Qualquer coisa que você faz com DMO ou SMO pode ser feito sem ele. Claro, isso não vai ser fácil, mas googling para código de substituição (usando reta T-SQL em vez de SQL DMO) irá fornecer-lhe as respostas que precisa.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top