esmaspäev, 23. veebruar 2009

SQL2005 CLR meetodi dünaamiline väljakutsumine teisest CLR meetodist

Kuna kulus kaks päeva teadasaamiseks, kuidas asju teha ei saa nüüd siis nüüd puust ja punaselt

CLR tegemine SQL2005 tuleb teha .NET Framework Versiooniga 2.0 kuna LINQ-i SQL2005 veel ei tunne

Ehk probleem, et teeme ühe ASSEMBLY ja selles sees olevast meetodist on vaja pöörduda teise ASSEMBLY meetodite poole.
SQL2005 lubab välja kutsuda ainult SQLSERVER-i enda sisse laetud ASSEMBLY-sid. Võimalus tegelikult ka mujalt , näiteks GAC-ist aga
võib pista kisama. Need DLL-id mida saab SQL2005 ASSEMBLYKS teha on piiratud ja muid DLL-e saab sisse laadida UNSAFE suvandiga.
Aga näide selline, et
ASSEMBLY TurukampusSqlPdf ja selle sees meetod ArvePdf mis pöördub ASSEMBLY Laad meetodite KasLaeb ja Laeb poole

ASSEMBLY Laad meetodid sellised

public partial class Protseduurid //See peab sellise nimega olema, selle kaudu leitakse ülesse
{
[Microsoft.SqlServer.Server.SqlProcedure]
public static void KasLaeb( ref String nimi) //siit loeb ka ref parameetri tagasi
{
string s="Tere ";
nimi = s+nimi;
}

[Microsoft.SqlServer.Server.SqlProcedure]
public static void Laeb()
{
string s = "Tere ";
s += "Kere";
}
}


ASSEMLBLY TurukampusSqlPdf meetod ArvePdf tahab nüüd neid kätte saada


using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Reflection.Emit;
using System.Reflection;
using System.Diagnostics;
using System.IO;


public partial class StoredProcedures
{
[Microsoft.SqlServer.Server.SqlProcedure]
public static void ArvePdf(SqlString raportkataloog, SqlInt32 invoice_form, SqlInt32 keel, SqlInt64 arvenr,
SqlInt32 arvetyyp, SqlInt32 tenant, SqlString fail)
{
try
{

// assembly laadimine tuleb teha täisnimega
Assembly repf = Assembly.Load("Laad, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null");
Type MyType = repf.GetType("Protseduurid"); //siin on see klassi nimi oluline
if (MyType != null)
{
object MyObj = Activator.CreateInstance(MyType);
//kutsume välja meetodi
MyType.InvokeMember("Laeb", BindingFlags.Default BindingFlags.InvokeMethod, null, null, new object[] { });
//kutsume välja meetodi koos parameetritega
object[] MyParameter = new object[] { "Kuido" };
object tar = new object();
MyType.InvokeMember("KasLaeb", BindingFlags.Default BindingFlags.InvokeMethod, null, tar, MyParameter);
// MyParameter[0].ToString() on nüüd see, mille KasLaeb meetodist parameetrina tagasi loeme

//kirjutame selle bitijadana faili
System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
byte[] sisu = encoding.GetBytes(tar.GetType().FullName + " " + tar.ToString() + " " + MyParameter[0].ToString());
FileInfo fil = new FileInfo((string)fail);
FileStream f = fil.OpenWrite();
f.Write(sisu, 0, sisu.Length);
f.Close();
}

}
catch (SystemException ex)
{
throw ex;
}

}
}



Blogged with the Flock Browser