Μήνυμα λάθους όταν χρησιμοποιείτε το αντικείμενο κατά το χρόνο εκτέλεσης κοινής γλώσσας στον SQL Server 2005: "Δεν είναι δυνατή η φόρτωση συγκρότησης σειριοποίησης που δημιουργήθηκε δυναμικά"

Συμπτώματα

Όταν χρησιμοποιείτε το αντικείμενο κοινή γλώσσα χρόνου εκτέλεσης (CLR) του Microsoft SQL Server 2005, ενδέχεται να λάβετε ένα μήνυμα λάθους παρόμοιο με το ακόλουθο:
Msg 6522, επίπεδο 16, κατάσταση 2, γραμμή 1
Παρουσιάστηκε ένα σφάλμα .NET Framework κατά την εκτέλεση του ορίζονται από το χρήστη ρουτίνα ή συγκεντρωτικών αποτελεσμάτων 'Όνομα αντικειμένου':
System.InvalidOperationException: Δεν είναι δυνατή η φόρτωση της συγκρότησης σειριοποίησης που δημιουργήθηκε δυναμικά. Σε ορισμένες τη συγκρότηση περιβάλλοντα φιλοξενίας λειτουργίες φόρτωσης είναι περιορισμένες, μπορείτε να χρησιμοποιήσετε το πρόγραμμα σειριοποίησης που δημιουργήθηκε εκ των προτέρων. Ανατρέξτε στην εσωτερική εξαίρεση για περισσότερες πληροφορίες. ---> System.IO.FileLoadException: LoadFrom(), LoadFile(), Load(byte[]) και LoadModule() έχουν απενεργοποιηθεί από τον κεντρικό υπολογιστή.
System.IO.FileLoadException:

στο System.Reflection.Assembly.nLoadImage (Byte [] rawAssembly, rawSymbolStore Byte [], αποδείξεις αποδεικτικά στοιχεία, StackCrawlMark & stackMark, Boolean fIntrospection)
στο System.Reflection.Assembly.Load (Byte [] rawAssembly, Byte [] rawSymbolStore, securityEvidence αποδεικτικά στοιχεία)
στο Microsoft.CSharp.CSharpCodeGenerator.FromFileBatch (CompilerParameters επιλογές, ονόματα αρχείων [] συμβολοσειρά)
στο Microsoft.CSharp.CSharpCodeGenerator.FromSourceBatch (CompilerParameters επιλογές, συμβολοσειρά προέλευσης [])
στο Microsoft.CSharp.CSharpCodeGenerator.System.CodeDom.Compiler.ICodeCompiler.CompileAssemblyFromSourceBatch (CompilerParameters επιλογές, συμβολοσειρά προέλευσης [])
στο System.CodeDom.Compiler.CodeDomProvider.CompileAssemblyFromSource (CompilerParameters επιλογές, συμβολοσειρά s]
...
System.InvalidOperationException:
στο System.Xml.Serialization.Compiler.Compile (γονική συγκρότηση ns συμβολοσειρά, παράμετροι CompilerParameters, αποδεικτικά στοιχεία αποδεικτικά στοιχεία)
στο System.Xml.Serialization.TempAssembly.GenerateAssembly (XmlMapping xmlMappings [], Τύπος [] είδη, defaultNamespace συμβολοσειρά, αποδεικτικά στοιχεία αποδεικτικά στοιχεία, παράμετροι CompilerParameters, συγκρότηση η συναρμολόγηση, συγκροτήσεις Hashtable)
στο System.Xml.Serialization.TempAssembly... ctor (XmlMapping xmlMappings [], Τύπος [] είδη, defaultNamespace συμβολοσειρά, συμβολοσειρά θέσης, αποδεικτικά στοιχεία αποδεικτικά στοιχεία)
στο System.Xml.Serialization.XmlSerializer.GenerateTempAssembly (XmlMapping xmlMapping, τύπος, defaultNamespace συμβολοσειρά)
στο System.Xml.Serialization.XmlSerializer... ctor (τύπος, defaultNamespace συμβολοσειρά)
στο System.Xml.Serialization.XmlSe...
Για παράδειγμα, ενδέχεται να λάβετε το μήνυμα λάθους, όταν χρησιμοποιείτε ένα αντικείμενο CLR που καλεί μια υπηρεσία Web ή εκτελεί μετατροπή από τους τύπους που ορίζονται από το χρήστη σε XML μέσα σε SQL Server.

Αιτία

Αυτό το ζήτημα παρουσιάζεται όταν ένα αντικείμενο CLR μετατρέπεται σε τύπο δεδομένων XML. Όταν παρουσιαστεί αυτή η μετατροπή, το Windows Communication Foundation (παλαιότερα με την κωδική ονομασία "λουλακί") προσπαθεί να κάνει τα εξής:
  • Δημιουργία νέας συγκρότησης σειριοποίησης XML.
  • Αποθηκεύστε τη συγκρότηση στο δίσκο.
  • Η φόρτωση της συγκρότησης στον τρέχοντα τομέα εφαρμογής.
Ωστόσο, ο SQL Server δεν επιτρέπει για αυτό το είδος της πρόσβασης στο δίσκο με το CLR SQL για λόγους ασφαλείας. Επομένως, θα εμφανιστεί το μήνυμα λάθους που αναφέρεται στην ενότητα "Συμπτώματα". Πολλά σενάρια ενδέχεται να προκαλέσει το αντικείμενο CLR για να μετατραπεί σε τύπο δεδομένων XML.

Για περισσότερες πληροφορίες σχετικά με την υποδομή επικοινωνιών των Windows, επισκεφθείτε την ακόλουθη τοποθεσία του Microsoft Developer Network (MSDN) στο Web:Ενδέχεται να λάβετε το μήνυμα λάθους που αναφέρεται στην ενότητα "Συμπτώματα" στα ακόλουθα σενάρια:
  • Ο κώδικας CLR που υλοποιεί CLR αντικείμενα ρητά χρησιμοποιεί την κλάση XmlSerializer . Αυτά τα αντικείμενα CLR μπορεί να περιλαμβάνει αποθηκευμένες διαδικασίες, συναρτήσεις, τύπους που ορίζονται από το χρήστη, συγκεντρωτικά αποτελέσματα και εναύσματα.
  • Μπορείτε να χρησιμοποιήσετε μια υπηρεσία Web στον κώδικα CLR.
  • Αποστολή ή λήψη CLR αντικειμένων προς ή από τον SQL Server, χρησιμοποιώντας άμεση πρόσβαση HTTP/SOAP με τον SQL Server.
  • Το αντικείμενο 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 Management 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.

Μέθοδος 1: Δημιουργία ενός έργου CLR του SQL Server, χρησιμοποιώντας το Microsoft Visual Studio 2005

Μπορείτε να δημιουργήσετε τη συγκρότηση σειριοποίησης, χρησιμοποιώντας την επιλογή Δημιουργία συμβάντων στο Microsoft Visual Studio 2005. Για να το κάνετε αυτό, ακολουθήστε τα εξής βήματα:
  1. Ξεκινήστε το Visual Studio 2005.
  2. Δημιουργήστε ένα νέο έργο του SQL Server που ονομάζεται MyTest.
  3. Στο παράθυρο διαλόγου Προσθήκη αναφορά βάσης δεδομένων , κάντε κλικ στην αναφορά που συνδέεται με τη βάση δεδομένων ΠΡΕΠΕΙ και, στη συνέχεια, κάντε κλικ στο κουμπί OK.

    Εάν η αναφορά δεν περιλαμβάνεται στη λίστα, πρέπει να δημιουργήσετε μια νέα αναφορά. Για να γίνει αυτό, κάντε κλικ στην επιλογή Προσθήκη νέας αναφοράς.
  4. Στο μενού ' έργο ', κάντε κλικ στη Συνάρτηση ενότητας. Εμφανίζεται το παράθυρο διαλόγου Προσθήκη νέου στοιχείου .
  5. Κάντε κλικ στο κουμπί Προσθήκη για να προσθέσετε ένα νέο αρχείο. Από προεπιλογή, το αρχείο ονομάζεται Function1.cs.

    Σημείωση Λαμβάνετε το μήνυμα λάθους που αναφέρεται στην ενότητα "Συμπτώματα" αν αναπτύξετε το έργο στη βάση δεδομένων και, στη συνέχεια, εκτελέστε την ακόλουθη πρόταση Transact-SQL:
    SELECT [dbTest].[dbo].[XMLTest] ()
    Πρέπει να ακολουθήσετε τα βήματα 6-16 για να επιλύσετε αυτό το ζήτημα.
  6. Προσθέστε τον κώδικα που παρατίθενται στην ενότητα "Παράδειγμα κώδικα" στο αρχείο Function1.cs.
  7. Στο μενού ' έργο ', κάντε κλικ στο κουμπί Ιδιότητες MyTest.
  8. Στο πλαίσιο διαλόγου " MyTest ", κάντε κλικ στο κουμπί του
    Η επιλογή Δημιουργία συμβάντων .
  9. Πληκτρολογήστε την ακόλουθη εντολή στο πλαίσιο μετά τη δημιουργία συμβάντων γραμμής εντολών :
    "C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\sgen.exe" / Force "$(TargetPath)"
    Σημείωση Η επιλογή/force δημιουργεί μια νέα συγκρότηση σειριοποίησης κάθε φορά που τροποποιείτε τη συγκρότηση προέλευσης. Επιπλέον, πρέπει να τροποποιήσετε αυτήν την εντολή, εάν έχετε εγκαταστήσει το Visual Studio 2005 σε άλλο φάκελο.
  10. Στο φάκελο C:\CLRTest, δημιουργήστε δύο αρχείων κειμένου που ονομάζονται Predeployscript.sql και Postdeployscript.sql.
  11. Προσθέστε τις ακόλουθες προτάσεις Transact-SQL στο αρχείο Predeployscript.sql:
    IF EXISTS (SELECT [name] FROM sys.assemblies WHERE [name] = N'MyTest.XmlSerializers') DROP ASSEMBLY [MyTest.XmlSerializers]

  12. Προσθέστε τις ακόλουθες προτάσεις Transact-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. Εκτελέστε την ακόλουθη πρόταση Transact-SQL στο SQL Server Management Studio:
    SELECT [dbTest].[dbo].[XMLTest] ()
    Λαμβάνετε το σωστό αποτέλεσμα.

Μέθοδος 2: Δημιουργία ενός έργου SQL CLR στο παράθυρο γραμμή εντολών Visual Studio

  1. Εντοπίστε το φάκελο C:\CLRTest.
  2. Δημιουργήστε ένα αρχείο κειμένου που ονομάζεται MyTest.cs.
  3. Προσθέστε τον κώδικα που παρατίθενται στην ενότητα "Παράδειγμα κώδικα" στο αρχείο MyTest.cs.
  4. Ανοίξτε το παράθυρο του Visual Studio 2005 γραμμή εντολών.
  5. Πληκτρολογήστε CD C:\CLRTestκαι, στη συνέχεια, πιέστε το πλήκτρο ENTER.
  6. Πληκτρολογήστε csc /t:library MyTest.csκαι, στη συνέχεια, πιέστε το πλήκτρο ENTER.
  7. Πληκτρολογήστε/Force sgen.exe MyTest.dllκαι, στη συνέχεια, πιέστε το πλήκτρο ENTER.
  8. Εκτελέστε τις ακόλουθες προτάσεις Transact-SQL στο SQL Server Management Studio:
    USE dbTestGO
    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. Εκτελέστε την ακόλουθη πρόταση Transact-SQL στο SQL Server Management Studio:
    SELECT [dbTest].[dbo].[XMLTest] ()
    Λαμβάνετε το σωστό αποτέλεσμα.

Εάν χρησιμοποιείτε μια κύρια συγκρότηση που αναφέρεται σε άλλα σύνολα, πρέπει να παράγουν συγκροτήσεων σειριοποίησης XML για όλες οι συγκροτήσεις που αναφέρονται από το κύριο συγκρότησης. Στη συνέχεια, πρέπει να φορτώσετε αυτών των συγκροτήσεων σειριοποίησης XML στη βάση δεδομένων του SQL Server, χρησιμοποιώντας την εντολή ΔΗΜΙΟΥΡΓΊΑ ΣΥΓΚΡΌΤΗΣΗΣ.

Κατάσταση

Αυτή η συμπεριφορά οφείλεται στη σχεδίαση.

Αναφορές

Για περισσότερες πληροφορίες σχετικά με τη σειριοποίηση XML από το CLR αντικειμένων βάσης δεδομένων, επισκεφθείτε την ακόλουθη τοποθεσία MSDN στο Web:Για περισσότερες πληροφορίες σχετικά με το εργαλείο γεννήτρια πρόγραμμα σειριοποίησης XML, επισκεφθείτε την ακόλουθη τοποθεσία MSDN στο Web:
Ιδιότητες

Αναγνωριστικό άρθρου: 913668 - Τελευταία αναθεώρηση: 17 Ιαν 2017 - Αναθεώρηση: 1

Σχόλια