Avatar billede sbhansen Nybegynder
18. september 2001 - 10:35 Der er 9 kommentarer og
2 løsninger

Indsæt i Access2000 notat-felt som string - hvorfor virker det ikke?

Vi øver med JDBC:ODBC connection til Access2000.
Det går fint med insert og select, SÅ LÆNGE vi ikke prøver at indsætte en String i et felt, der er defineret som notatfelt - (memo)
Hvordan indsætter man tekst i sådan et felt med et \"INSERT INTO (Memofeltet) values (\"Her er en ufattelig lang tekst\")

- Og hvordan arbejder man generelt bedst med memofelt-længder på op til 65.000 tegn i Java, som string???
Avatar billede kresten Nybegynder
18. september 2001 - 10:40 #1
Jeg syntes at kunne huske noget om at memo felter af en eller anden grund kun virker hvis de er listet i slutningen af din SQL.

Så den SQL du har skrevet i spørgsmålet skulle virke. Hvis ikke, hvad er fejl beskrivelsen?
Avatar billede sbhansen Nybegynder
18. september 2001 - 10:53 #2
Du får lige den helt korrekte SQL:
SQL = \"Insert into Members (LongText) values (\'Hejsa - og her kunne vi skrive og skrive og skrive\')\";

og eksekveret med:       
resultInteger = stmt.executeUpdate(SQL);

... giver fejlen:
java.sql.SQLException: [Microsoft][ODBC Microsoft Access-driver] Der er en syntaksfejl i INSERT INTO-sætningen.

Avatar billede kresten Nybegynder
18. september 2001 - 11:05 #3

Hmm.. det ser jo rigtigt ud.

Hvis du skriver SQLen direkte i Access, virker det så? Access er jo ikke kendt for at have den bedste SQL.
Avatar billede sbhansen Nybegynder
18. september 2001 - 11:14 #4
Det her virker i Access forespørgsels-vinduet:

INSERT INTO Members ( [LongText] )
values (\'Her er en lang tekst\')

Det virker både med pinger (\') og med anførselstegn (\") rundt om teksten

Men vi kan generelt heller ikke tildele indholdet af et memo-felt til en String i java, da fejler systemet, uden at gå i den exception vi prøver at stille op for det.

Vi har altså følgende situation:
- Vi kan ikke skrive i et memo-felt i Access

- Vi kan godt SELECTE værdien af et memofelt og skrive på skærm med: System.out.println(resultSet.getString(\"LongText\") men...
- Vi kan ikke sige: String copyLongText = resultSet.getString(\"LongText\");
Dette giver følgende fejl:
java.sql.SQLException: No data found
, men data ER der jo, for jeg kan println med dem...?
Avatar billede kresten Nybegynder
18. september 2001 - 11:18 #5
Ehhh.. fisk?! Jeg ved ikke hvad det er så.
Personligt holder jeg mig også langt fra Access.
Avatar billede sbhansen Nybegynder
18. september 2001 - 11:21 #6
Det er sådan set også kun opstarten mht access - systemet skal køre på MS SQL 2000, men da har man jo en pendant til memofeltet, så derfor skulle det helst kunne køre - desuden er vi jo så \"platformsuafhængige\" og skal gerne kunne bruge systemet overfor en hvilken som helst DB...
- Nå, men jeg håber der er andre, der kan se, hvad jeg gør galt, eller som definitivt ved, at jeg er i en dead-end...
Avatar billede logical Nybegynder
18. september 2001 - 11:44 #7
Har du prøvet at kigge på metadata fra dit resultset:

ResultSetMetaData rsmd = resultSet.getMetaData();
for (int i = 1, max = rsmd.getColumnCount() ; i <= max ; i++)
  system.out.println(rsmd.getColumnName(i) + \" \" + rsmd.getColumnClass(i) + \" \" + rsmd.getColumnType(i));


column types vil matche en konstant i java.sql.Types:
public class Types {
    public final static int BIT         =  -7;
    public final static int TINYINT     =  -6;
    public final static int SMALLINT    =  5;
    public final static int INTEGER     =  4;
    public final static int BIGINT         =  -5;
    public final static int FLOAT         =  6;
    public final static int REAL         =  7;
    public final static int DOUBLE         =  8;
    public final static int NUMERIC     =  2;
    public final static int DECIMAL        =  3;
    public final static int CHAR        =  1;
    public final static int VARCHAR     =  12;
    public final static int LONGVARCHAR     =  -1;
    public final static int DATE         =  91;
    public final static int TIME         =  92;
    public final static int TIMESTAMP     =  93;
    public final static int BINARY        =  -2;
    public final static int VARBINARY     =  -3;
    public final static int LONGVARBINARY     =  -4;
    public final static int NULL        =  0;
    public final static int OTHER        = 1111;
        public final static int JAVA_OBJECT        = 2000;
        public final static int DISTINCT            = 2001;
        public final static int STRUCT              = 2002;
        public final static int ARRAY              = 2003;
        public final static int BLOB                = 2004;
        public final static int CLOB                = 2005;
        public final static int REF                = 2006;
}
Avatar billede logical Nybegynder
18. september 2001 - 11:48 #8
PS. java.sql har en type CLOB, som netop skulle repræsentere en character stream a la memo.
Avatar billede sbhansen Nybegynder
20. september 2001 - 22:05 #9
Hmm...Jeg vil meget gerne have skåret ud i pap. Jeg kan ikke finde nogle eksempler på at anvende BLOB og/eller CLOB, derfor:

jeg ville virkelig kunne bruge, hvis det kunne vises, hvordan man så arbejder med CLOB/BLOB\'erne...
Mit LongText-felt  er iflg metadataene = -1, dvs. LONGVARCHAR. Hvordan arbejder jeg med den...
Er der en, der vil prøve at vise, hvordan man selecter et memofelt i access, og overfører det til en variabel (et objekt).
Avatar billede logical Nybegynder
21. september 2001 - 08:08 #10
Hrm, LongVarChar siger mig ikke så meget.

Prøv at tage dit memo fra dit resultset:
Object o = resultSet.getObject(\"Nemo\");
Class[] c = o.getClass().getDeclaredClasses();
for (int i = 0 ; i < c.length ; i++) {
  String ci = c[i].isInterface() ? \"Interface \" : \"class \";
  System.out.println(ci + c[i].getName());
}
Avatar billede logical Nybegynder
21. september 2001 - 08:23 #11
Ups, forkerte eksempel..

Tag den her:
        Class clazz = resultSet.getObject(\"LongText\").getClass();
        while(clazz != null) {
           
            System.out.println(clazz.getName());
            Class[] interfaces = clazz.getInterfaces();
            for (int i = 0 ; i < interfaces.length ; i++) {
                System.out.println(\"Interface>\" + interfaces[i].getName());
            }
            clazz = clazz.getSuperclass();
        }
Hvordan mener den så, det kan repræsenteres?
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
Kurser inden for grundlæggende programmering

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