Avatar billede kring Nybegynder
17. juli 2006 - 16:30 Der er 30 kommentarer og
2 løsninger

Hente og eksekvere kode fra databasen

Hej Eksperter.

Findes der en måde til at hente C#-kode fra et varchar-felt i en MSSQL-database-tabel, og eksekverer det?

Lidt på samme måde som PHP's eval-metode.

MVH
Kring
Avatar billede arne_v Ekspert
17. juli 2006 - 16:35 #1
du kan godt compile og loade kode dynamisk

men til smaa brug vil jeg anbefale et alternativ nemlig JavaScript kode

fordi:

C# kan kalde kode i alle .NET sprog

der er JScript.NET

JavaScript har ogsaa en eval funktion
Avatar billede snepnet Nybegynder
17. juli 2006 - 16:36 #2
Det kan du sådan set godt .... Hvad er det for noget kode du skal kunne holde i databasen?
Mvh
Avatar billede kring Nybegynder
17. juli 2006 - 16:40 #3
Jeg henter noget tekst der blandt andet indeholder nogle hjemmelavede tags fx ##ValueClass("Param1", "Param2").Value## hvor ValueClass er en C# klasse. Så jeg vil gerne kunne erstatte selve tagget med værdien af "eksekveringen" af det der står i tagget.

Giver det mening? :)
Avatar billede snepnet Nybegynder
17. juli 2006 - 16:50 #4
Hvis det er en klasse du har i forvejen, kan du jo bare lave kaldet i koden med de parametre du har hentet fra basen.
Mvh
Avatar billede snepnet Nybegynder
17. juli 2006 - 16:51 #5
Altså trække parametrene ud med lidt strenggymnastik - og så bruge din ValueClass.
Mvh
Avatar billede kring Nybegynder
17. juli 2006 - 17:01 #6
Den tekst jeg henter ud kan indeholde forskellige klasser. Det er ikke altid ValueClass.

Hvis du forestiller dig at teksten der bliver hentet ud er:
"Der var en gang en mand som boede i ##StandardValue("Adresse", 2006)##. Han var ansat som tjenestemand og fik derfor ##BonusProcent("Tjenestemand", 10)##. Det var han meget glad for!"

Så vil jeg gerne kunne hente den tekst, finde tags og eksekverer dem og få værdien, og så erstatte selve tagget i teksten. Så fx ##BonusProcent("Tjenestemand", "Las Vegas department")## bliver erstattet af "15%" og ##StandardValue("Adresse", 2006)## bliver erstattet af "1st street, 12345 Las Vegas".
Avatar billede snepnet Nybegynder
17. juli 2006 - 17:21 #7
Ok ... Det ville jeg nok ikke selv gøre med dynamisk kodegenerering, men det kan self. have nogle fordele.
Der er et download (og en artikel) her du kan kigge på:
http://www.west-wind.com/presentations/dynamicCode/DynamicCode.htm
Mvh
Avatar billede kring Nybegynder
17. juli 2006 - 19:42 #8
Hold da op det er besværligt. Kan det virkelig ikke gøres nemmere?

I PHP ville man bare gøre noget ligende sådan her:
$value = eval(MetodeKald("Param1", Param1)); fx. eval(BonusProcent("Tjenestemand", 10))
og så ville $value være fx. 15%.

Kan man ikke gøre noget tilsvarende i ASP.NET?
Avatar billede arne_v Ekspert
17. juli 2006 - 19:53 #9
jo

du kan goere det med C# kode besvaerligt

eller med JavaScript kode nemt
Avatar billede kring Nybegynder
17. juli 2006 - 20:03 #10
arne_v kan du give et eksempel på løsningen af mit problem med JavaScript?
Avatar billede arne_v Ekspert
17. juli 2006 - 20:04 #11
jeg kan da prove
Avatar billede kring Nybegynder
17. juli 2006 - 20:11 #12
Det lyder godt... jeg venter spændt :)
Avatar billede arne_v Ekspert
17. juli 2006 - 20:49 #13
eksempel:

using System;
using System.Reflection;
using System.Text.RegularExpressions;
using Microsoft.JScript;
using Microsoft.JScript.Vsa;

public class Test
{
    private static GlobalScope gs = VsaEngine.CreateEngineAndGetGlobalScope(false, new string[] { Assembly.GetExecutingAssembly().GetName().Name });
    public static string Evaluate(string s)
    {
       
        return Eval.JScriptEvaluate(s, gs.engine).ToString();
    }
    public static string Address(int id)
    {
        return "DOTNET vej nr. " + id;
    }
    public static int BonusPercent(int salaryclass)
    {
        return (salaryclass - 5) / 2;
    }
    public static void Main(string[] args)
    {
        // simpelt
        Console.WriteLine(Evaluate("Test.Address(77)"));
        Console.WriteLine(Evaluate("Test.BonusPercent(18)"));
        // kombineret med regex
        string s = "bor ##Address(77)## og får ##BonusPercent(18)##% i bonus";
        Console.WriteLine(s);
        string s2 = s;
        MatchCollection res = Regex.Matches(s,"(##)(.*?)(##)");
        for(int i = 0; i < res.Count; i++) {
            s2 = s2.Replace(res[i].Groups[0].Value,Evaluate("Test." + res[i].Groups[2].Value));
        }
        Console.WriteLine(s2);
    }
}
Avatar billede kring Nybegynder
17. juli 2006 - 21:18 #14
Det er spændende ud. Jeg får dog følgende fejl når jeg prøver at teste det:
The type or namespace name 'JScript' does not exist in the namespace 'Microsoft'

Jeg kan se at jeg kun har: CSharp, SqlServer, VisualBasic, VisualC og Win32 i Microsoft-namespacet.

Hvordan får jeg tilføjes JScript?
Avatar billede arne_v Ekspert
17. juli 2006 - 21:22 #15
tilfoej en reference til Microsoft.JScript.dll ?
Avatar billede kring Nybegynder
17. juli 2006 - 22:10 #16
hehe. tak fordi at du vækkede mig.

Jeg får en anden fejl nu: Microsoft.JScript.JScriptException: Function expected

Det er når jeg kalder Evaluate sådan her:
String TagValue = Evaluate("adressefunk(11)");

Har omdøbt din Address(int id) til adressefunk(int id).
Avatar billede arne_v Ekspert
17. juli 2006 - 22:12 #17
er den static og prefixed med klasse navn ?

namespace ?
Avatar billede kring Nybegynder
17. juli 2006 - 22:21 #18
Den ser sådan her ud:

public static string addressfunk(int id)
{
  return "DOTNET vej nr. " + id;
}
Avatar billede arne_v Ekspert
17. juli 2006 - 22:25 #19
ligger klassen i et namespace ?
Avatar billede arne_v Ekspert
17. juli 2006 - 22:26 #20
det goer den sikkert

her er en version med namespace:

using System;
using System.Reflection;
using System.Text.RegularExpressions;
using Microsoft.JScript;
using Microsoft.JScript.Vsa;

namespace E
{
    public class Test
    {
        private static GlobalScope gs;
        static Test()
        {
            gs = VsaEngine.CreateEngineAndGetGlobalScope(false, new string[] { Assembly.GetExecutingAssembly().GetName().Name });
            Import.JScriptImport("E", gs.engine);
        }
        public static string Evaluate(string s)
        {
           
            return Eval.JScriptEvaluate(s, gs.engine).ToString();
        }
        public static string Address(int id)
        {
            return "DOTNET vej nr. " + id;
        }
        public static int BonusPercent(int salaryclass)
        {
            return (salaryclass - 5) / 2;
        }
        public static void Main(string[] args)
        {
            // simpelt
            Console.WriteLine(Evaluate("Test.Address(77)"));
            Console.WriteLine(Evaluate("Test.BonusPercent(18)"));
            // kombineret med regex
            string s = "bor ##Address(77)## og får ##BonusPercent(18)##% i bonus";
            Console.WriteLine(s);
            string s2 = s;
            MatchCollection res = Regex.Matches(s,"(##)(.*?)(##)");
            for(int i = 0; i < res.Count; i++) {
                s2 = s2.Replace(res[i].Groups[0].Value,Evaluate("Test." + res[i].Groups[2].Value));
            }
            Console.WriteLine(s2);
        }
    }
}
Avatar billede kring Nybegynder
17. juli 2006 - 22:27 #21
Nej ikke umiddelbart. Det er en class som er blevet oprettet af Visual Studio og smidt i App_Code.
Avatar billede kring Nybegynder
17. juli 2006 - 22:29 #22
Der er ikke noget namespace-keyword i starten af klassen.

using System.Reflection;
using Microsoft.JScript;
using Microsoft.JScript.Vsa;

public class TestClass
{
...
}
Avatar billede arne_v Ekspert
17. juli 2006 - 22:37 #23
hvad med

String TagValue = Evaluate("Test.adressefunk(11)");
Avatar billede kring Nybegynder
17. juli 2006 - 22:41 #24
Det giver samme exception.
Avatar billede arne_v Ekspert
17. juli 2006 - 22:51 #25
mystisk

faar du recompilet ?
Avatar billede kring Nybegynder
17. juli 2006 - 22:52 #26
ja, det gør IIS selv
Avatar billede arne_v Ekspert
18. juli 2006 - 02:16 #27
jeg har lige prøvet med .NET 2.0 og den kræver også Microsoft.Vsa.dll (plus giver
en warning om at man bør bruge noget ICodeCompiler)
Avatar billede arne_v Ekspert
18. juli 2006 - 02:16 #28
men virker altså
Avatar billede kring Nybegynder
18. juli 2006 - 13:42 #29
Jeg kan ikke få det til at virke, men jeg vil gerne give points til både arne_v og snepnet. Så hvis i smider et svar, får i points.

Tak for hjælpen :)
Avatar billede snepnet Nybegynder
18. juli 2006 - 14:49 #30
Jamen det gør vi så :o)
Mvh
Avatar billede snepnet Nybegynder
18. juli 2006 - 14:49 #31
Høh.... Alle gode gange 2 ;o)
Avatar billede arne_v Ekspert
18. juli 2006 - 22:21 #32
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester