ظهور رسالة خطأ عند استخدام كائن وقت تشغيل لغة شائعة في SQL Server 2005: "لا يمكن تحميل تجميع التسلسل الذي تم إنشاؤه بشكل حيوي"


الخطأ رقم: 101935 (سقلبودت)

الأعراض


عند استخدام كائن (CLR) وقت تشغيل لغة شائعة في Microsoft SQL Server 2005، قد تتلقى رسالة خطأ مشابهة لما يلي:
جي إس 6522، مستوى 16 حالة 2، السطر الأول
حدث خطأ في.NET Framework أثناء تنفيذ إجراء المعرفة من قبل المستخدم أو التجميع 'اسم الكائن':
System.InvalidOperationException: لا يمكن تحميل تجميع التسلسل الذي تم إنشاؤه بشكل حيوي. في تجميع بعض بيئات الاستضافة وظيفة تحميل مقيدة، جرب استخدام التسلسل الذي تم إنشاؤه مسبقاً. يرجى مراجعة الاستثناء الداخلي للحصول على مزيد من المعلومات. ---> System.IO.FileLoadException: تم تعطيل LoadFrom()، LoadFile()، Load(byte[])، و LoadModule() بالمضيف.
System.IO.FileLoadException:

في System.Reflection.Assembly.nLoadImage (بايت [] راواسيمبلي، راوسيمبولستوري [] بايت، أدلة الإثبات، ستاككراولمارك & ستاكمارك، فينتروسبيكتيون منطقية)
في System.Reflection.Assembly.Load (راواسيمبلي [] بايت بايت [] راوسيمبولستوري، سيكوريتييفيدينسي الدليل)
في Microsoft.CSharp.CSharpCodeGenerator.FromFileBatch (خيارات كومبيليرباراميتيرس، أسماء ملفات [] سلسلة)
في Microsoft.CSharp.CSharpCodeGenerator.FromSourceBatch (خيارات كومبيليرباراميتيرس، مصادر [] سلسلة)
في Microsoft.CSharp.CSharpCodeGenerator.System.CodeDom.Compiler.ICodeCompiler.CompileAssemblyFromSourceBatch (خيارات كومبيليرباراميتيرس، مصادر [] سلسلة)
في System.CodeDom.Compiler.CodeDomProvider.CompileAssemblyFromSource (خيارات كومبيليرباراميتيرس، السلسلة s]
...
System.InvalidOperationException:
في System.Xml.Serialization.Compiler.Compile (التجميع الأصل ns سلسلة، معلمات كومبيليرباراميتيرس، أدلة الإثبات)
في System.Xml.Serialization.TempAssembly.GenerateAssembly (إكسملمابينجس [] XmlMapping، أنواع [] نوع، سلسلة ديفاولتناميسبيس، أدلة الإثبات، معلمات كومبيليرباراميتيرس، الجمعية الجمعية، التجميعات Hashtable)
في System.Xml.Serialization.TempAssembly... المنشئ (إكسملمابينجس [] XmlMapping وأنواع [] نوع، سلسلة ديفاولتناميسبيس، موقع سلسلة وأدلة الإثبات)
في System.Xml.Serialization.XmlSerializer.GenerateTempAssembly (XmlMapping xmlMapping النوع نوع، سلسلة ديفاولتناميسبيس)
في System.Xml.Serialization.XmlSerializer... المنشئ (النوع نوع، سلسلة ديفاولتناميسبيس)
في System.Xml.Serialization.XmlSe...
على سبيل المثال، قد تتلقى رسالة خطأ عند استخدام كائن CLR استدعاء خدمة ويب أو تنفيذ التحويل من الأنواع المعرفة من قبل المستخدم إلى XML داخل SQL Server.

السبب


تحدث هذه المشكلة عند تحويل كائن CLR لنوع البيانات XML. عند حدوث هذا التحويل، يحاول "ويندوز مؤسسة الاتصالات" (سابقا التي أطلق عليها اسم "Indigo") للقيام بما يلي:
  • إنشاء تجميع تسلسل XML جديد.
  • حفظ التجميع على القرص.
  • تحميل التجميع في مجال التطبيق الحالي.
غير أن SQL Server لا يسمح بهذا النوع من الوصول إلى القرص في SQL CLR لأسباب أمنية. ولذلك، تظهر رسالة الخطأ المذكورة في قسم "الأعراض". قد يؤدي العديد من السيناريوهات الكائن CLR يتم تحويله إلى نوع بيانات XML.

لمزيد من المعلومات حول مؤسسة الاتصالات Windows، قم بزيارة موقع شبكة مطوري Microsoft (MSDN) التالي على الويب:قد تظهر رسالة الخطأ المذكورة في قسم "الأعراض" بالطرق التالية:
  • تستخدم التعليمة البرمجية CLR التي تطبق كائنات CLR بشكل صريح فئة XmlSerializer . قد تتضمن كائنات CLR هذه الإجراءات المخزنة والدالات الأنواع المعرفة من قبل المستخدم تجميعات والمشغلات.
  • يمكنك استخدام خدمة ويب في تعليمات برمجية CLR.
  • إرسال أو تلقي كائنات CLR إلى أو من ملقم SQL باستخدام الوصول HTTP/SOAP مباشرة إلى خادم SQL.
  • تحويل الكائن CLR نوع معرف من قبل المستخدم إلى نوع البيانات XML.

الحل


لحل هذه المشكلة، يجب أن تستخدم أداة مولد التسلسل XML (Sgen.exe) لإنشاء تجميع التسلسل XML للتجميع الأصلي يدوياً. ثم تحميل التجميعات إلى قاعدة بيانات SQL Server.

مثال التعليمات البرمجية

على سبيل المثال، قد تحتاج إلى إنشاء دالة CLR بإرجاع بيانات XML باستخدام تجميع الذي يتم إنشاؤه بواسطة مثال التعليمات البرمجية التالي:
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Xml;
using System.Xml.Serialization;
using System.Text;
using System.IO;
public partial class StoredProcedures
{
[Microsoft.SqlServer.Server.SqlFunction]
public static SqlString XMLTest()
{
Person p = new Person();
return new SqlString(p.GetXml());

}
public class Person
{
public String m_FirstName = "Jane";
public String m_LastName = "Dow";

public String GetXml()
{
XmlSerializer ser = new XmlSerializer(typeof(Person));
StringBuilder sb = new StringBuilder();
StringWriter wr = new StringWriter(sb);
ser.Serialize(wr, this);

return sb.ToString();
}

}
}
عندما تقوم باستدعاء الدالة XMLTest في SQL Server إدارة Studio، تتوقع تلقي النتيجة التالية:
<?xml version="1.0" encoding="utf-16"?>
<Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<m_FirstName>Jane</m_FirstName>
<m_LastName>Dow</m_LastName>
</Person>
لإرجاع النتيجة الصحيحة، يجب إنشاء تجميع التسلسل XML للتجميع الأصلي يدوياً. استخدم إحدى الطرق التالية لإنشاء تجميع التسلسل يدوياً.

ملاحظة: تفترض هذه الأساليب تحققت الشروط التالية:
  • قمت بإنشاء قاعدة بيانات دبتيست في مثيل SQL Server 2005.
  • يتم حفظ كافة ملفات المشروع في المجلد C:\CLRTest.

الطريقة الأولى: إنشاء مشروع CLR خادم SQL باستخدام Microsoft Visual Studio 2005

يمكنك إنشاء تجميع التسلسل باستخدام الخيار أحداث البناء في Microsoft Visual Studio 2005. للقيام بذلك، اتبع الخطوات التالية:
  1. بدء تشغيل Visual Studio 2005.
  2. إنشاء مشروع خادم SQL جديد يسمى MyTest.
  3. في مربع الحوار إضافة مرجع قاعدة بيانات ، انقر فوق المرجع الذي يتصل بقاعدة بيانات دبتيست ، ومن ثم انقر فوق موافق.

    إذا كان المرجع غير موجود في القائمة، يجب إنشاء مرجع جديد. للقيام بذلك، انقر فوق إضافة مرجع جديد.
  4. من القائمة مشروع ، انقر فوق إضافة دالة. يظهر مربع الحوار إضافة عنصر جديد .
  5. انقر فوق إضافة لإضافة ملف جديد. بشكل افتراضي، يسمى الملف Function1.cs.

    ملاحظة: تظهر رسالة الخطأ المذكورة في قسم "الأعراض" إذا نشر المشروع إلى قاعدة البيانات، ثم قم بتشغيل عبارة SQL للعمليات التالية:
    SELECT [dbTest].[dbo].[XMLTest] ()
    يجب اتباع الخطوات 6-16 لحل هذه المشكلة.
  6. أضف التعليمات البرمجية المسردة في القسم "مثال التعليمات البرمجية" للملف Function1.cs.
  7. من القائمة مشروع ، انقر فوق خصائص MyTest.
  8. في مربع الحوار MyTest ، انقر فوق
    خيار إنشاء أحداث .
  9. اكتب الأمر التالي في المربع بعد بناء الحدث سطر الأوامر :
    "C:\Program 8\SDK\v2.0\Bin\sgen.exe مايكروسوفت Visual Studio"/فرض "$(TargetPath)"
    ملاحظة: الخيار /فرض إنشاء تجميع تسلسل جديد كل مرة يتم تعديل تجميع المصدر. بالإضافة إلى ذلك، يجب تعديل هذا الأمر إذا قمت بتثبيت Visual Studio 2005 في مجلد آخر.
  10. في المجلد C:\CLRTest، إنشاء ملفين نصيين تسمى Predeployscript.sql و Postdeployscript.sql.
  11. إضافة عبارات SQL للعمليات التالية إلى ملف Predeployscript.sql:
    IF EXISTS (SELECT [name] FROM sys.assemblies WHERE [name] = N'MyTest.XmlSerializers') 
    DROP ASSEMBLY [MyTest.XmlSerializers]
  12. إضافة عبارات SQL للعمليات التالية إلى ملف Postdeployscript.sql:
    CREATE ASSEMBLY [MyTest.XmlSerializers] from
    'C:\CLRTest\MyTest\MyTest\bin\Debug\MyTest.XmlSerializers.dll'
    WITH permission_set = SAFE
  13. من القائمة مشروع ، انقر فوق إضافة عنصر موجود.
  14. في مربع الحوار إضافة عنصر موجود ، حدد موقع المجلد C:\CLRTest، ومن ثم انقر فوق "كافة الملفات" (*. *)في قائمة أنواع الملفات .
  15. في المربع اسم الملف ، اكتب
    Postdeployscript.sql ؛ Predeployscript.sql، ثم انقر فوق
    OK.
  16. في بنية القائمة، انقر فوق نشر MyTest.
  17. قم بتشغيل عبارة SQL للعمليات التالية في Studio إدارة ملقم SQL:
    SELECT [dbTest].[dbo].[XMLTest] ()
    تظهر النتيجة الصحيحة.

الطريقة الثانية: إنشاء مشروع SQL CLR في نافذة موجه الأوامر Visual Studio

  1. حدد موقع المجلد C:\CLRTest.
  2. قم بإنشاء ملف نصي يدعى MyTest.cs.
  3. أضف التعليمات البرمجية المسردة في القسم "مثال التعليمات البرمجية" للملف MyTest.cs.
  4. افتح نافذة موجه الأوامر Visual Studio 2005.
  5. اكتب C:\CLRTest مؤتمر نزع السلاحومن ثم اضغط ENTER.
  6. اكتب csc/t:library MyTest.csومن ثم اضغط ENTER.
  7. اكتب sgen.exe/force MyTest.dllومن ثم اضغط ENTER.
  8. تشغيل عبارات SQL للعمليات التالية في Studio إدارة ملقم SQL:
    USE dbTest
    GO
    CREATE ASSEMBLY [MyTest] from 'C:\CLRTest\MyTest.dll'
    GO
    CREATE ASSEMBLY [MyTest.XmlSerializers.dll] from 'C:\CLRTest\MyTest.XmlSerializers.dll'
    GO

    CREATE FUNCTION XMLTest()
    RETURNS nvarchar (max)
    AS
    EXTERNAL NAME MyTest.StoredProcedures.XMLTest
    GO
  9. قم بتشغيل عبارة SQL للعمليات التالية في Studio إدارة ملقم SQL:
    SELECT [dbTest].[dbo].[XMLTest] ()
    تظهر النتيجة الصحيحة.

إذا كنت تستخدم تجميع رئيسي الذي يشير إلى تجميعات أخرى, يجب إنشاء تجميعات التسلسل XML لكافة التجميعات التي يتم الرجوع إليها بواسطة التجميع الرئيسي. ثم، يجب تحميل تجميعات التسلسل XML هذه في قاعدة بيانات SQL Server باستخدام العبارة "إنشاء التجميع".

الحالة


يعتبر هذا السلوك حسب التصميم.

المراجع


لمزيد من المعلومات حول إنشاء تسلسل XML من CLR كائنات قاعدة البيانات، قم بزيارة موقع Msdn التالي:لمزيد من المعلومات حول أداة مولد التسلسل XML، قم بزيارة موقع Msdn التالي: