Sign in with Microsoft
Sign in or create an account.

Bug #: 101935 (SQLBUDT)

Gejala

Ketika Anda menggunakan bahasa runtime (CLR) objek yang umum di Microsoft SQL Server 2005, Anda mungkin menerima pesan galat yang mirip berikut ini:

Pesan status 6522, tingkat 16, 2, baris 1
Terjadi galat .NET Framework selama pelaksanaan ditetapkan pengguna rutin atau agregat 'Namaobyek':
System.InvalidOperationException: Tidak dapat memuat rakitan serialisasi dinamis. Di beberapa lingkungan hosting perakitan beban fungsionalitas terbatas, pertimbangkan untuk menggunakan serializer pra-dihasilkan. Silakan lihat bagian pengecualian untuk informasi lebih lanjut. ---> System.IO.FileLoadException: LoadFrom(), LoadFile(), Load(byte[]) dan LoadModule() telah dinonaktifkan oleh tuan rumah.
System.IO.FileLoadException:

di System.Reflection.Assembly.nLoadImage (rawAssembly Byte [], Byte [] rawSymbolStore, bukti bukti, StackCrawlMark & stackMark, Boolean fIntrospection)
di System.Reflection.Assembly.Load (rawAssembly Byte [], Byte [] rawSymbolStore, bukti securityEvidence)
di Microsoft.CSharp.CSharpCodeGenerator.FromFileBatch (CompilerParameters opsi, String] nama file)
di Microsoft.CSharp.CSharpCodeGenerator.FromSourceBatch (CompilerParameters opsi, String] sumber)
di Microsoft.CSharp.CSharpCodeGenerator.System.CodeDom.Compiler.ICodeCompiler.CompileAssemblyFromSourceBatch (CompilerParameters opsi, String] sumber)
di System.CodeDom.Compiler.CodeDomProvider.CompileAssemblyFromSource (CompilerParameters opsi, String] s
...
System.InvalidOperationException:
di System.Xml.Serialization.Compiler.Compile (rakitan induk String ns, parameter CompilerParameters, bukti bukti)
di System.Xml.Serialization.TempAssembly.GenerateAssembly (XmlMapping] xmlMappings jenis] jenis String defaultNamespace, bukti bukti, parameter CompilerParameters, rakitan rakitan, Hashtable rakitan)
di System.Xml.Serialization.TempAssembly. ctor (XmlMapping] xmlMappings jenis] jenis String defaultNamespace, String lokasi, bukti bukti)
di System.Xml.Serialization.XmlSerializer.GenerateTempAssembly (XmlMapping xmlMapping, jenis jenis String defaultNamespace)
di System.Xml.Serialization.XmlSerializer. ctor (tipe tipe, String defaultNamespace)
di System.Xml.Serialization.XmlSe...

Misalnya, Anda mungkin menerima pesan galat ketika Anda menggunakan objek CLR yang memanggil layanan Web atau melakukan konversi dari jenis ditentukan pengguna XML dalam SQL Server.

Penyebab

Masalah ini terjadi ketika objek CLR dikonversi ke jenis data XML. Jika pengubahan ini terjadi, dasar komunikasi Windows (sebelumnya kode-bernama "Indigo") mencoba untuk melakukan hal berikut ini:

  • Menghasilkan rakitan serialisasi XML baru.

  • Simpan perakitan ke disk.

  • Beban perakitan ke domain aplikasi saat ini.

Namun, SQL Server tidak mengizinkan untuk jenis akses disk CLR SQL untuk alasan keamanan. Oleh karena itu, Anda menerima pesan galat yang disebutkan di bagian "gejala". Beberapa skenario dapat menyebabkan objek CLR akan diubah untuk jenis data XML.

Untuk informasi selengkapnya tentang dasar komunikasi Windows, kunjungi situs Web Microsoft Developer Network (MSDN) berikut:

http://msdn2.microsoft.com/en-us/library/ms735119.aspxAnda mungkin menerima pesan galat yang disebutkan di bagian "Gejala" dalam skenario berikut:

  • Kode CLR yang menerapkan CLR objek secara eksplisit menggunakan kelas XmlSerializer . Objek CLR ini mungkin mencakup prosedur yang tersimpan, fungsi, jenis ditentukan pengguna, agregat dan memicu.

  • Anda menggunakan layanan Web dalam kode CLR.

  • Mengirim atau menerima objek CLR ke atau dari SQL Server dengan menggunakan akses HTTP SOAP langsung ke SQL Server.

  • Objek CLR mengkonversi jenis yang ditetapkan pengguna ke jenis data XML.

Pemecahan masalah

Untuk mengatasi masalah ini, Anda harus menggunakan alat XML Serializer Generator (Sgen.exe) untuk membuat rakitan serialisasi XML untuk rakitan asli secara manual. Kemudian, memuat rakitan ke pangkalan data SQL Server.

Contoh kode

Misalnya, Anda dapat membuat CLR fungsi yang mengembalikan XML data dengan menggunakan rakitan yang dibuat oleh kode contoh berikut:

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();
}

}
}

Ketika Anda memanggil fungsi XMLTest di SQL Server Management Studio, Anda mengharapkan untuk menerima hasil berikut ini:

<?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>

Untuk mengembalikan hasil yang benar, Anda harus secara manual membuat rakitan serialisasi XML untuk rakitan asli. Gunakan salah satu dari metode berikut untuk membuat rakitan serialisasi secara manual.

Catatan Metode ini mengasumsikan bahwa kondisi berikut ini benar:

  • Anda telah menciptakan dbTest database dalam contoh SQL Server 2005.

  • Berkas proyek disimpan di C:\CLRTest folder.

Metode 1: Membangun proyek SQL Server CLR menggunakan Microsoft Visual Studio 2005

Anda dapat membuat rakitan serialisasi menggunakan opsi Membangun peristiwa di Microsoft Visual Studio 2005. Untuk melakukannya, ikuti langkah-langkah berikut:

  1. Mulai Visual Studio 2005.

  2. Membuat proyek SQL Server baru yang bernama MyTest.

  3. Di kotak dialog Tambah pangkalan data referensi , klik referensi yang tersambung ke pangkalan data dbTest , dan kemudian klik OK.

    Jika referensi bukan dalam daftar, Anda harus membuat rujukan baru. Untuk melakukannya, klik Add rujukan baru.

  4. Pada Project menu, klik Add User-Defined fungsi. Ditampilkan kotak dialog Tambah Item baru .

  5. Klik Tambah untuk menambahkan berkas baru. Secara asali, berkas bernama Function1.cs.

    Catatan Anda menerima pesan galat yang disebutkan di bagian "Gejala" jika Anda menyebarkan proyek ke pangkalan data dan kemudian jalankan pernyataan Transact-SQL berikut ini:

    SELECT [dbTest].[dbo].[XMLTest] ()

    Anda harus mengikuti langkah-langkah 6-16 untuk menyelesaikan masalah ini.

  6. Tambahkan kode yang tercantum di bagian "Contoh kode" untuk berkas Function1.cs.

  7. Pada Project menu, klik Properti MyTest.

  8. Di kotak dialog MyTest , klik
    Opsi Membangun peristiwa .

  9. Ketik perintah berikut di kotak pasca membangun baris perintah peristiwa :

    "C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\sgen.exe" / Force "$(TargetPath)"Catatan Opsi/force menghasilkan rakitan serialisasi baru setiap kali Anda mengubah sumber perakitan. Selain itu, Anda harus mengubah perintah ini jika Anda menginstal Visual Studio 2005 dalam folder lain.

  10. Di C:\CLRTest folder, membuat dua berkas teks yang bernama Predeployscript.sql dan Postdeployscript.sql.

  11. Tambahkan pernyataan Transact-SQL berikut ini ke berkas Predeployscript.sql:

    IF EXISTS (SELECT [name] FROM sys.assemblies WHERE [name] = N'MyTest.XmlSerializers') 
    DROP ASSEMBLY [MyTest.XmlSerializers]
  12. Tambahkan pernyataan Transact-SQL berikut ini ke berkas Postdeployscript.sql:

    CREATE ASSEMBLY [MyTest.XmlSerializers] from
    'C:\CLRTest\MyTest\MyTest\bin\Debug\MyTest.XmlSerializers.dll'
    WITH permission_set = SAFE
  13. Proyek menu, klik Add Item yang ada.

  14. Di kotak dialog Tambah Item yang ada , temukan C:\CLRTest folder, dan kemudian klik semua file (*. *)dalam daftar file tipe .

  15. Di kotak nama berkas , ketik
    Postdeployscript.sql; Predeployscript.SQL, kemudian klik
    OK.

  16. Membangun menu, klik Menyebarkan MyTest.

  17. Jalankan pernyataan Transact-SQL berikut ini di SQL Server Management Studio:

    SELECT [dbTest].[dbo].[XMLTest] ()

    Anda menerima hasil yang benar.

Metode 2: Membangun SQL CLR proyek di jendela Prompt Perintah Visual Studio

  1. Cari C:\CLRTest folder.

  2. Buat berkas teks yang bernama MyTest.cs.

  3. Tambahkan kode yang tercantum di bagian "Contoh kode" untuk berkas MyTest.cs.

  4. Buka jendela Prompt Perintah Visual Studio 2005.

  5. Ketik CD C:\CLRTest, dan kemudian tekan ENTER.

  6. Ketik csc /t:library MyTest.cs, dan kemudian tekan ENTER.

  7. Ketik sgen.exe/Force MyTest.dll, dan kemudian tekan ENTER.

  8. Jalankan pernyataan Transact-SQL berikut ini di SQL Server Management Studio:

    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. Jalankan pernyataan Transact-SQL berikut ini di SQL Server Management Studio:

    SELECT [dbTest].[dbo].[XMLTest] ()

    Anda menerima hasil yang benar.


Jika Anda menggunakan rakitan utama yang merujuk rakitan lainnya, Anda harus menghasilkan rakitan serialisasi XML untuk rakitan yang direkomendasikan oleh rakitan utama. Kemudian, Anda harus memuat rakitan serialisasi XML ini ke pangkalan data SQL Server dengan menggunakan rakitan membuat pernyataan.

Status

Perilaku ini merupakan bagian dari rancangan.

Referensi

Untuk informasi selengkapnya tentang serialisasi XML dari objek database CLR, kunjungi website MSDN berikut:

http://msdn2.microsoft.com/en-us/library/ms131088.aspxUntuk informasi selengkapnya tentang alat XML Serializer Generator, kunjungi website MSDN berikut:

http://msdn2.microsoft.com/en-us/library/bk3w6240.aspx

Perlu bantuan lainnya?

Kembangkan keterampilan Anda
Jelajahi pelatihan
Dapatkan fitur baru terlebih dahulu
Gabung Microsoft Insider

Apakah informasi ini bermanfaat?

Seberapa puaskah Anda dengan kualitas bahasanya?
Apa yang memengaruhi pengalaman Anda?

Terima kasih atas umpan balik Anda!

×