Pregunta

Estamos tratando de pasar de usar SQL DMO a SMO en nuestra aplicación basada en COM +, ya que estamos dejando de admitir SQL Server 2000 y agregando compatibilidad con SQL Server 2008 además de SQL Server 2005.

He estado leyendo sobre esto, y encontré este comentario en particular en este foro de microsoft:

" SMO solo es compatible con VB / C # .Net 2005. Requiere el Framework .Net 2.0, que no está disponible en VB / VC 6. "

¿Es cierto? Buscar en Google en general y buscar en Google stackoverflow no arrojó respuestas definitivas.

¿Es posible implementar SQL SMO usando VB6?

Editar: Utilicé un COM Wrapper para solucionar esto ... mira mi respuesta a continuación para obtener más detalles.

¿Fue útil?

Solución

Bien, descubrí cómo hacer esto.

El problema era que VB6 no tiene soporte .Net 2.0 y, por lo tanto, no podemos usar SMO con VB6.

Para evitar eso, escribí un contenedor COM en C # que usa SMO y mapas (principalmente) uno a uno con el tipo de funcionalidad que quiero de mi aplicación VB.

Básicamente, cree un proyecto C #, agregue las referencias SMO según sea necesario, agregue las siguientes líneas sobre la declaración de clase para que sea visible COM:

[ComVisible (verdadero)]

[GuidAttribute (" {guid here} ")]

[ClassInterface (ClassInterfaceType.AutoDual)] < --- No recomendado, pero bueno ...

En las propiedades del proyecto, en " Build " sección, asegúrese de que " Registrarse para COM Interop " la casilla está marcada ¡Compile e importe en la aplicación VB6 y estará en el negocio!

Como es el caso al tratar de manipular dos sistemas diferentes, habrá algunas manipulaciones que tendrá que hacer con lo que pasa entre la aplicación VB6 y el Contenedor C # ... pero no es demasiado difícil.

Comente si necesita más información / detalles.

Otros consejos

No sé de qué manera puedes llegar a SMO a través de VB6. Estoy de acuerdo con G Mastros sobre hacer un enfoque COM / Interop para implementar el código .NET directamente.

Una alternativa a tener en cuenta es que podría utilizar Powershell para ejecutar un script que haría funcionar su .NET SMO. Todavía tiene el requisito previo de requerir el marco .NET (y Powershell obviamente), pero podría hacer el trabajo. Su script podría tomar parámetros para credenciales, nombre de la base de datos, tipo de copia de seguridad, etc.

Implemento mucho esto en clientes que tienen SQL Express (sin Agente SQL para copias de seguridad, como MSDE). Conecto una tarea programada que invoca el script y gestiona sus copias de seguridad.

Si es útil, aquí hay un script, en gran parte robado pero lo he modificado un poco:

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

Puede realizar copias de seguridad completas, diferenciales y transaccionales, y nombra de forma exclusiva cada archivo resultante en función de la fecha y la hora, eliminando todos los archivos anteriores a un determinado número de días.

La sintaxis para llamarlo es:

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

entonces ...

.\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 programar en el programador de tareas, pase:

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

Gracias por tu publicación. Me ayuda a entender que hay una solución para usar SQLSMO de VB6 usando COM Wrapper. Seguí los pasos que detallaste, pero mi solución no funciona. Estoy haciendo esto básicamente:

using System;
using System.Collections.Generic;

usando System.Text; usando System.Runtime.InteropServices; espacio de nombres WrapperCOM {

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

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



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

}

También agregué las siguientes referencias para SQLSMO:

& # 8226; Microsoft.SqlServer.ConnectionInfo.dll

& # 8226; Microsoft.SqlServer.Smo.dll

& # 8226; Microsoft.SqlServer.Management.Sdk.Sfc.dll

& # 8226; Microsoft.SqlServer.SqlEnum.dll

Finalmente cuando ejecuto el VB6 después de importar el archivo .tlb y crear un objeto como este: CreateObject (& Quot; COMWrapper.Class1 & Quot;), falla. Da & Quot; Error de tiempo de ejecución ... & Quot;

Pls aconseja sobre lo que me estoy perdiendo aquí ...

No lo he probado, pero probablemente podría escribir el código vb.net para interactuar con SQL SMO, y luego escribir un contenedor com para el código vb.net. Por supuesto, aún necesitará .NET Framework para usarlo.

En cambio, sugeriría que migre fuera de SQL DMO y SQL SMO. Todo lo que hagas con DMO o SMO se puede hacer sin él. Por supuesto, no será fácil, pero buscar en Google el código de reemplazo (usando T-SQL directo en lugar de SQL DMO) le proporcionará las respuestas que necesita.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top