سؤال

نحن نحاول الانتقال من استخدام SQL DMO إلى SMO في COM+ على أساس التطبيق ، كما انخفض دعم SQL Server 2000 و إضافة دعم ل SQL Server 2008 بالإضافة إلى SQL Server 2005.

لقد قرأت حول هذا, وجدت هذا الخصوص الساخر على هذا المنتدى مايكروسوفت:

"SMO معتمد فقط في VB/C#.صافي 2005.أنه يتطلب .Net Framework 2.0 التي لا تتوفر في VB/VC 6."

هل هذا صحيح ؟ غوغلينغ في العام غوغلينغ ستاكوفيرفلوو لم أتقيأ و إجابات قاطعة.

هل من الممكن تنفيذ SQL SMO باستخدام VB6?

تحرير:أنا استخدم COM المجمع للالتفاف على هذا...تحقق من بلدي الإجابة أدناه للحصول على المزيد من التفاصيل.

هل كانت مفيدة؟

المحلول

حسنا لقد اكتشفت كيفية القيام بذلك.

المشكلة أن VB6 لا .Net 2.0 الدعم وبالتالي لا نستطيع استخدام SMO مع VB6.

للالتفاف التي كتبت COM المجمع في C# الذي يستخدم SMO و الخرائط (في الغالب) واحد إلى واحد مع هذا النوع من الوظائف أريد من من VB التطبيق.

في الأساس إنشاء مشروع C#, إضافة SMO المراجع حسب الحاجة ، أضف الأسطر التالية فوق الطبقة إعلان لجعله COM مرئية:

[ComVisible(صحيح)]

[GuidAttribute("{guid هنا}")]

[ClassInterface(ClassInterfaceType.AutoDual)] <--- لا ينصح به ولكن...

في خصائص المشروع ، في "بناء" القسم, تأكد من "التسجيل في Interop COM" يتم فحص مربع.ترجمة و الاستيراد في VB6 التطبيق كنت في مجال الأعمال التجارية!!

كما هو الحال مع محاولة المطرقة أي نظامين مختلفين معا ، وسوف يكون هناك بعض التلاعبات سوف تحتاج إلى القيام به مع ما تمر بين VB6 التطبيق و C# Wrapper...ولكن ليس من الصعب جدا.

يرجى التعليق إذا كنت بحاجة إلى أي مزيد من المعلومات/تفاصيل.

نصائح أخرى

أنا لا أعرف الطريقة يمكنك الحصول على SMO عبر VB6.أتفق مع G Mastros عن القيام COM/Interop النهج لتنفيذ .رمز الشبكة مباشرة.

بديل للنظر هو أنه يمكنك أن قذيفة من أصل Powershell تنفيذ البرنامج النصي التي من شأنها أن تفعل .صافي SMO العمل.لا يزال لديك شرط من إلزام .NET framework (و Powershell الواضح) ، ولكن سيكون الحصول على هذه المهمة.البرنامج النصي الخاص بك يمكن أن تأخذ معايير الاعتماد, اسم قاعدة البيانات, نوع النسخ الاحتياطي ، إلخ.

انا تنفيذ هذا الكثير من العملاء الذين لديهم SQL Express (أي عميل SQL من أجل النسخ الاحتياطي مثل MSDE).لقد ربط المهمة المجدولة التي تحتج النصي إدارة النسخ الاحتياطي.

إذا من المفيد هنا هو السيناريو -- إلى حد كبير المسروقة لكني عدلت إلى حد ما:

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"

شكرا على مشاركتك.أنها تساعد لي أن نفهم أن هناك حل استخدام SQLSMO من VB6 باستخدام COM المجمع.أنا اتبعت الخطوات مفصلة ، ولكن الحل لا يعمل .أنا أفعل هذا الأساس:

using System;
using System.Collections.Generic;

باستخدام النظام.النص ؛ باستخدام النظام.وقت التشغيل.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

•Microsoft.SqlServer.SqlEnum.dll

وأخيرا عند تشغيل VB6 بعد استيراد .الملف tlb و خلق كائن مثل هذا - CreateObject("COMWrapper.Class1") ، فإنه فشل.أنه يعطي "خطأ وقت التشغيل..."

الثابتة والمتنقلة تقديم المشورة إلى ما أنا في عداد المفقودين هنا...

أنا لم أجربها لكن يمكنك كتابة vb.net رمز للتفاعل مع SQL SMO ثم كتابة com المجمع عن vb.net التعليمات البرمجية.بالطبع, سوف لا تزال بحاجة إلى .net framework استخدامه.

بدلا من ذلك, وأود أن أقترح عليك أن تهاجر بعيدا عن SQL و SQL DMO SMO.أي شيء يمكنك القيام به مع DMO أو SMO يمكن القيام به دون ذلك.بالطبع هذا لن يكون سهلا, لكن أبحث عن استبدال رمز (باستخدام مستقيم T-SQL بدلا من SQL DMO) سوف توفر لك الإجابات التي تحتاجها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top