none
ODBC Insert i fremmed database - tekst længde

    Spørgsmål

  • Hejsa,

    Vi laver flere steder ODBC insert/update i fremmede databaser, typisk MySQL, i forbindelse med webshops og lignende.
    Det fungerer fint, men nu er jeg rendt ind i et problem, hvor der findes et notatfelt som skal indsættes i en kolonne på MySQL databasen.
    Jeg samler hele notatteksten i en variabel og laver en update derfra.

    Er der flere en ca. 240-260 tegn melder ODBC driveren fejl:
    "[MySQL][ODBC 3.51 Driver][mysqld-5.5.25-cll]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near <tekst>"

    Er der tale om en fejl fra C5 på grund at den interne max felt længde?

    C5 er en gammel hund:
    3.0 SP3
    Kerne: 3.0 #43

    Mvh.
    Mads

    6. september 2012 08:04

Svar

  • Hej Mads,

    Fra C5 2010 er

    MAX_ROW_WIDTH  /* maximum row width retrieved      */

    ændret fra 255 til 1001.


    Venlig Hilsen Henrik Hansen Program Manager II Microsoft Dynamics C5

    • Markeret som svar af Mads W 7. september 2012 07:10
    7. september 2012 07:02
    Ejer
  • En sidste update på denne sag.
    Det blev løst via funktionen concat i update statement:
    update table set field = concat(field, 'this is the string', 'string2', 'string3', string4') 

    Mvh.
    Mads W

    • Markeret som svar af Mads W 18. september 2012 20:58
    18. september 2012 20:58

Alle besvarelser

  • Hej Mads,

    Prøv at lave det samme SQL statemet fra et ODBC værktøj op mod databasen, i stedet for fra C5.
    Det burde kunne give en ide om det er en begrænsning i ODBC interfacet i C5 eller i MySQL ODBC driveren.


    Venlig Hilsen Henrik Hansen Program Manager II Microsoft Dynamics C5

    6. september 2012 08:49
    Ejer
  • Hej Mads

    Jeg har lavet en hel del af den slags - i nøjagtigt 3.0sp3 og op mod MySQL. Faktisk har jeg stadig kode kørende hos en kunde, der søger for at synkronisere tabeller på MySQL med C5 tabeller - fuld brugeropsat i C5 naturligvis :-).

    Hvis du skal hente fra MySQL og ind i C5 er tricket at bygge din SQL så den select du kører bider data op i fx. 254 bytes hvis de skal ind i et db-felt i C5 eller 1000 bytes hvis de skal ind i en variable (brug substr i din select).

    Mht. at skrive eller update data, så kan lange sætninger konstrueres med ODBCPrepapre før du eksekverer dem med ODBCExecute. Men jeg er ikke sikker på at du kan dele midt i et felts data på den måde...

    Endelig skal du være OBS på at C5s string sagtens kan erklæres i versioner før 2010 (så vidt jeg husker) til at være længere end 1000 tegn, men at det aldrig har virket... Erklærer du dem længere end 1000 smider C5 kernen blot resten væk. Så det kan være den du er i... I de nyere C5'ere brokker compileren sig...

    Kunne det evt. være en ide at du skriver notatet linje for linje, og så blot beder MySQL om at samle dem? UPDATE xxxx SET Note = Note + (jeg arbejder ikke så meget med MySQL længere, men du finder nok selv den rette syntax :-)...

    MVH
    Gert Lynge


    MVH gsl@systemconnect.dk Se også: http://blog.systemconnect.dk/

    6. september 2012 08:51
  • Hej igen,

    Henrik, serverfolkene siger der er plads til 16.000 tegn i kolonnen. Den er sat til mediumtext.

    Gert, lige her laves der update fra C5 til MySQL. Der hentes også data vi select, men det kører fint i anden kørsel.
    Men der bruges også ODBC Prepare.

    Faktisk benytter vi til denne kunde noget ODBC forbindelse kit som Martin Broholm har stykket sammen. Så jeg skulle også mene det var lavet på den helt korrekte måde.

    Men måske er vi nødt til at bruge modellen med at opdatere feltet 240 tegn af gangen. Alternativt få webfolkene til at lave x antal tmp kolonner, så vi kan uploade en notatlinje til hver sin kolonne af gangen og webfolkene så samler data i et felt til sidst. 

    Mvh
    Mads

    6. september 2012 11:13
  • Hej igen,

    Det lader til at være en begrænsning 255 bytes i kernen i ODBC funktionerne. Det har jeg i hvert fald ladet mig fortælle.

    Henrik har du nogen måde at kontrollere det på, og eventuelt kontrollere i hvilken kerne det er rettet?

    Jeg blev anbefalet at lave en substring når jeg henter data via select; "SELECT SUBSTRING(Felt,1,250), " og ved update som du også nævnte Gert at man sætter feltet til værdi + ny substring;
    UPDATE Tabel SET Felt = Felt + <de næste XXX tegn> WHERE ...

    Tak for svaret Gert og Henrik. Men som nævnt var det rart med lidt ekstra information omkring kernerne.

    Mvh.
    Mads

    7. september 2012 06:33
  • Hej Mads

    For lige at præcisere noget jeg måske skulle have skrevet i mit første svar: Jeg er også ret sikker på at jeg har ramt sådan en grænse ifm. ODBC til MySQL på C5 3.0sp3 da jeg rodede med det i sin tid. Og jeg er også ret sikker på at begrænsningen er i C5 da MySQL sagtens kan tage imod BLOGs mv. via ODBC og PHP.

    Der skulle nogle workarounds til (ala de beskrevne) for at få det til at køre stabilt...
    Men jeg har aldrig fået grænserne identificeret 100%, da jeg ikke anså for en fejl, men blot nogle grænser jeg ikke lige kunne finde dokumentation for :-).


    MVH gsl@systemconnect.dk Se også: http://blog.systemconnect.dk/

    7. september 2012 06:40
  • Hej Mads,

    Fra C5 2010 er

    MAX_ROW_WIDTH  /* maximum row width retrieved      */

    ændret fra 255 til 1001.


    Venlig Hilsen Henrik Hansen Program Manager II Microsoft Dynamics C5

    • Markeret som svar af Mads W 7. september 2012 07:10
    7. september 2012 07:02
    Ejer
  • Hej Henrik,

    Super det var lige det jeg skulle bruge.

    God weekend!

    Mvh

    Mads

    7. september 2012 07:10
  • Hej,

    Selv 1000 tegn kan jo være for kort - I så fald kan man eventult vælge at skrive notatlinierne til tilsvarende linier i en "mellemtabel" i den "modtagende" database, hvorefter man men en SP samler indeholdet i notatfeltet i den rigtige tabel - Dette selvfølgelig under forudsætning at man har kontrol over tabellerne i den eksterne database. 

    17. september 2012 19:19
  • Aidal du har fuldstændig ret, 1000 tegn kan meget vel være for kort.
    Der findes forskellige måder at komme om ved dette på, og den du nævner var også oppe at vende på den sag jeg havde problemet på. Dog fravalgte vi den, da kunden ikke kunne sige max antal tegn han ville kunne skrive i notat. Så det bliver flere updates alt efter hvor langt feltet er...

    Kunne man mon bruge et COM/ACTIVE X object til C5 2012 via XAC og ikke have begrænsningen. Mig bekendt har vi ikke begrænsningerne ved #Variant eller #Object, da C5 blot gemmer en memory reference her...

    18. september 2012 06:40
  • En sidste update på denne sag.
    Det blev løst via funktionen concat i update statement:
    update table set field = concat(field, 'this is the string', 'string2', 'string3', string4') 

    Mvh.
    Mads W

    • Markeret som svar af Mads W 18. september 2012 20:58
    18. september 2012 20:58