# Übergabe eines Datensatzes (Übergabestruktur)



## chipmount (20. Nov 2004)

Hi Leute, 

es geht um folgendes: Client und Server (jdbc corba, oracle) 

Client: Eingabe des Datensatzes (bestnr(number), name(varchar2), bestelldatum(varchar2)) 

Server: einfügen einse vollständigen Datensatzes in die Tabelle "Bestellung" 
Die Parameterübergabe soll rein mit in,inout, out Parametern erfolgen 

Die Übergabe eines Datensatzes Bestellung soll mit einer eigens 
dafür vorzusehenden ÜBERGABESTRUKTUR erfolgen!!! 

Ich weiss nich, wie man so eine ÜBERGABESTRUKTUR macht und das dann wieter an die DB weitergibt  

Hat jemand eine Idee 

Danke


----------



## foobar (20. Nov 2004)

Einmal posten reicht !!!!!


----------



## Bleiglanz (21. Nov 2004)

OJEMINE

gehts da um ne Corba IDL?

mit ÜBERGABESTRUKTUR ist wahrscheinlich ein Java Interface (Sagen wir "foo.bar.Bestelldaten") gemeint, so dass du auf dem Client den Aufruf


```
corbastub.fuegeEin(aktuelleDatenWieEingeben);
```
durchführen kannst, Das Argument ist vom Typ foo.bar.Bestelldaten und wird dann gemarshallt - übers Netz geschickt - vom CorbaServer unmarshallt usw. usw.

wieviel weisst du über Corba? 

warum nimmst du nicht gleich JDBC?


----------



## chipmount (21. Nov 2004)

leider hab ich keine/wenig ahnung von corba, java etc leider muss ich hier mit corba arbeiten weil... mann will es so :roll: 

ich habe an sowas gedacht

ClientProgramm:

```
import java.io.*;
import org.omg.CORBA.*;
import org.omg.CosNaming.*;

public class ComputingClient {
   public static void main(String[] args) {
      try {
         ORB orb = ORB.init(args, null);
         NamingContext namingContext =
            NamingContextHelper.narrow(orb.resolve_initial_references("NameService"));
         Computer c =
            ComputerHelper.narrow(namingContext.resolve(new NameComponent[] {
                                                              new NameComponent("computer", "Object")
                                                           }));
         System.out.println("Bestellung");
         BufferedReader in =
            new BufferedReader(new InputStreamReader(System.in));
         String bestnr;
         System.out.print("BestNr: ");
         bestnr = in.readLine();
         if (bestnr == null) {
            System.out.println("Syntax Error");
            return;
         }
         String name;
         System.out.print("Name: ");
         name = in.readLine();
         if (name == null) {
            System.out.println("Syntax Error");
            return;
         }
         String bestelldatum;
         System.out.print("Bestelldatum: ");
         bestelldatum = in.readLine();
         if (bestelldatum == null) {
            System.out.println("Syntax Error");
            return;
         }
         
              in.close();
      }
      catch (org.omg.CORBA.ORBPackage.InvalidName e) {
         System.out.println("Error " + e);
      }
      catch (org.omg.CosNaming.NamingContextPackage.InvalidName e) {
         System.out.println("Error: " + e);
      }
      catch (org.omg.CosNaming.NamingContextPackage.NotFound e) {
         System.out.println("Error: " + e);
      }
      catch (org.omg.CosNaming.NamingContextPackage.CannotProceed e) {
         System.out.println("Error: " + e);
      }
      catch (IOException e) {
         System.out.println("Error: " + e);
      }
      catch (NumberFormatException e) {
         System.out.println("Syntax Error");
      }
   }
}
```


wie übrge ich diese werte an server und wo mach ich das???

meine IDL Datei (sieht ein wenig arm aus oder??)


```
interface Computer {
   void bestellung(in string bestnr, in string name, in string bestelldatum);
  };
```

mein SERVANT (hier muss doch die jdbc/sql operationen rein oder???):

```
import java.sql.*;
public class ComputerImpl extends _ComputerImplBase {
   public String  getBestellung(String bestnr, String name, String bestelldatum) {
      
   }
   
}
```

mein SERVER:

```
import org.omg.CORBA.*;
import org.omg.CosNaming.*;

public class ComputingServer {
   public static void main(String[] args) {
      try {
         ComputerImpl c = new ComputerImpl();
         ORB orb = ORB.init(args, null);
         orb.connect(c);
         //System.out.println(orb.object_to_string(c));
         NamingContext namingContext =
            NamingContextHelper.narrow(orb.resolve_initial_references("NameService"));
         namingContext.rebind(new NameComponent[] {
                                     new NameComponent("computer", "Object")
                                  },
                              c);
         System.out.println("ready");
         orb.run();
      }
      catch (org.omg.CORBA.ORBPackage.InvalidName e) {
         System.out.println("Error: " + e);
      }
      catch (org.omg.CosNaming.NamingContextPackage.InvalidName e) {
         System.out.println("Error: " + e);
      }
      catch (org.omg.CosNaming.NamingContextPackage.NotFound e) {
         System.out.println("Error: " + e);
      }
      catch (org.omg.CosNaming.NamingContextPackage.CannotProceed e) {
         System.out.println("Error: " + e);
      }
   }
}
```


hatt jeman eine bessere IDEE???[/code]


----------



## Bleiglanz (21. Nov 2004)

> leider hab ich keine/wenig ahnung von corba, java etc leider muss ich hier mit corba arbeiten weil... mann will es so


wer ist "man"? 

dieses Thema ist definitiv zu komplex und umfangreich, als dass du dir hier grossartige Hilfe erhoffen kannst - sowas kann man nicht als Anfänger und mit ein paar Foren als Anlaufpunkt erledigen


----------



## chipmount (21. Nov 2004)

und was schlägst du vor???


----------



## Bleiglanz (21. Nov 2004)

keine Ahnung, dein Code schaut jetzt mal nicht so schlecht aus, vielleicht kannst du dich ja irgendwie durchwursteln

wenn du Probleme hast, kannst du ja hier wieder fragen; aber nicht

bitte helft mir

sondern was konkretes (Fehlermeldung, klares Problem, usw.)


----------



## chipmount (21. Nov 2004)

mein problemm ist :

wie gebe ich die parameter (bestnr, name ,...) wieter an server??


----------



## Bleiglanz (22. Nov 2004)

Der Witz - die Idee hinter - das Tolle - an CORBA/RMI/Webservices ist gerade, dass du beim Client 

```
MeinStub stub = //blalba mit Narrow;

stub.bestellung(bestnr,name,datum); // HIER GEHTS LOS
```
einfach einen Methodenaufruf machst. In der Zeile mit "HIER GEHTS LOS" wird folgendes gemacht:

1) die drei Parameter werden serialisiert

2) übers netz an das passende Serverobjekt übertragen

2') am Server gleich deserialisiert und als normales Java Zeugs weitergegeben

3) dann wird am Server der eigentliche "Code" ausgeführt

4) wenns Rückgabewerte gibt, dann werden auch diese serialisiert und übers Netz zurückgeschickt

das alles ist automatisch, es schaut so aus, als ob du einen ganz normalen Methodenaufruf gemacht hast! das ist der Witz beim dem ganzen RPC-Kram! Du musst nichts machen, der Stub erledigt den fast alles für dich


----------



## chipmount (22. Nov 2004)

mir ist  auch klar das es ein wenig bei corba.. automatisch geht
aber ich muss doch erst meine schnittstellen in IDL datei deffinieren muss ich denn hier die parameter mitübergeben??

```
void bestellung(in string bestnr, in string name, in string bestelldatum);
```

was meinst du denn mit

```
MeinStub stub = //blalba mit Narrow;
```


----------



## chipmount (22. Nov 2004)

meinst du sowas (auf der client seite)???

```
MeinStub stub =MeinStubHelper.narrow(obj);
stub.bestellung(bestnr,name,datum);
```


----------



## Bleiglanz (23. Nov 2004)

ja


----------



## chipmount (4. Dez 2004)

also hab jetz folgendes gemacht

meine schnittstellendeff:

```
module M_N
{
interface I_N{
struct abc {
string bestnr;
string name;
string bestelldaum;
};
void setBestellung (in abc bestellung, out long anzahl);
};
};
```

Client gipt die werte ein
clientprogramm:

```
...
        String name; 
         System.out.print("Name: "); 
         name = in.readLine(); 
          String bestnr; 
         System.out.print("Name: "); 
         bestnr = in.readLine(); 

.....
//parameterübergabe an server via corba

M_N.I_NPackage.abc bestellung= new M_N.I_NPackage.abc (bestnr, name, bestelldatum);
```

server programm soll die werte in die db ablegen
serverprogramm:

```
.....

class I_NImpl extends I_NPOA{

//aufruf setbestellung
public void setBestellung(M_N.I_NPackage.abc bestellung, org.omg.CORBA.IntHolder anzahl)
{
try
{
    JDBC bla bla....
}
}
```

problem ist:
die eingegebenen werte kommen irgendwie beim server nicht an der client krigt aber eine mitteilung von dem server das 0 datensätze geändert worden sind 

was ist falsch an meiner Client übergabe 



```
M_N.I_NPackage.abc bestellung= new M_N.I_NPackage.abc (bestnr, name, bestelldatum);
```

danke


----------

