Laufzeitfehler



  • hi

    Weiß jemand weßhalb so ein Laufzeitfehler kommt

    [ODBC Microsoft Access Driver]
    Feld 'Referenzen.Referenzname darf kiene Zeichenfolge
    der Länge Null sein

    danke



  • Möglicherweise ist dem Feld in der Datenbank "Leere Zeichenfolge - Nein" (oder vielleicht auch "Eingabe erforderlich - Ja") zugewiesen und du versuchst einen Datensatz anzulegen, bei dem in eben genau diesem Feld nix drin steht.



  • hi
    danke erstmal für deine Antwort

    Leider kenn ich mich mit Access nichts so gut, hab nichts gefunden.
    Aber eigentlich hab ich in der DB gar nichts verstellt, "eigentlich".

    Weißt du wo man das sehen kann?

    danke dir



  • habs gefunden
    mal schaun obs was bringt

    danke



  • okay, also wenn ich "yes" einstelle, dann kommt die Fehlermedlung nicht mehr
    Aber ich hab glaug was anderes falsch gemacht...was vergessen zu initialisieren oder so..
    Naja mal schaun..



  • hi isabeau

    nochmals danke für den Tipp, hat wunderbar geklappt 🙂

    grüße



  • hi
    kann mir jemand sagen warum ich diesen Laufzeitfehler bekomme, und ihn beheben kann (ACCESS/MFC/VC++6)
    ------>Datentypen in Kriteriumausdruck unverträglich

    Das Problem liegt darin, dass ich erst alle Felder ausfüllen muss.
    Wenn ich auf "zur DB hinzufügen" klicke, kommt kein Fehler. Nur wenn ich ein Feld nicht ausfülle, dann kommt der Fehler. Kein Plan woran das liegen könnte

    danke für die hilfe und jeden Tip



  • Ich rate einfach mal weiter 😃 :
    möglicherweise stimmt ein Datentyp deine RecordSet-Klasse irgendwo nicht mit der Datenbank überein. Also z.B. in der RecordSet-Klasse ist das Feld CString m_DATUM angegeben, während das Feld in der Datenbank zwar DATUM heisst, aber als Datum/Uhrzeit (und nicht Text) ausgewiesen ist.

    [edit]
    Achso, noch was:
    falls du ein SQL-Statement an die Datenbank abschickst, könnte es auch soetwas sein, dass du versuchst, eine Zahl in ein Zahlenfeld zu schreiben, aber den Zahlenwert in ' gesetzt hast:
    ... PLZ = '12345'...
    Oder der umgekehrte Fall, dass bei einem Textfeld die ' fehlen:
    ... ORT = Entenhausen...
    [/edit]



  • hi
    aha..

    also wenn ich in der Access DB unter einem DatayTyp (TEXT) die LÄnge NULL auf JA einstelle, dann gibt es keine Probleme, wenn ich in dem Eingabefeld nichts eintrage.
    Aber wenn eine Zahl erwartet wird, dann schon (DataTYp NUMBER)

    mein code sieht so aus

    void CSteuerung::SetDatenInVersuchsdatenTabelle(CString sVersuchsname,CString sSitzplaetze)
    
    {
    
    	CString strHilfe = "";
    
    	strHilfe = "INSERT INTO Versuchsdaten (VersuchsName,Sitzplaetze) VALUES";
    
    	strHilfe = strHilfe + "('" + sVersuchsname + "','" + sSitzplaetze + "')";
    

    FÜr VErsuchsname geb ich ein TEXT ein und für Sitzplaetze eine NUMBER
    PAsst das so, oder hängt da der FEhler, mit den "' ?
    danke



  • Die Variablen sVersuchsname und sSitzplaetze sind beide CString. Dann musst du SetDatenInVersuchsdatenTabelle(...) auch mit CString aufrufen:

    FALSCH:

    CString strName = "Müller-Lüdenscheid";
    int nZahl = 6;
    SetDatenInVersuchsdatenTabelle(strName, nZahl);
    

    RICHTIG:

    CString strName = "Müller-Lüdenscheid";
    CString strZahl = "6";
    SetDatenInVersuchsdatenTabelle(strName, strZahl);
    

    sSitzplaetze muss vom Typ CString sein, damit man den SQL-String zusammenbauen kann. Hast du also schon richtig. Mit einem Zahlenwert würde das nicht klappen:

    FALSCH:

    int nZahl = 6;
    ...
    CString strHilfe = strHilfe + "('" + sVersuchsname + "','" + nZahl + "')";
    

    ...aber da würde wohl auch der Compiler schon meckern.

    So, sSitzplaetze ist zwar ein CString, aber das dazugehörige Feld in der Datenbank ist vom Typ NUMBER und da schreibt man einen Wert ohne ' rein. Die Zeile muss also lauten:

    strHilfe = strHilfe + "('" + sVersuchsname + "'," + sSitzplaetze + ")";
    


  • aha, erstmal vielen Dank für die Hilfe.
    Leider kommt nun folgender Laufzeitfehler
    "Syntaxfehler in der INSERT INTO Anweisung..." 😞

    Aber ich kann doch in der DB auch anstatt NUMBER---TEXT auswählen oder
    (das versteh ich eh nicht was der Unterschied zw. Text und Number ist)
    Das spiel doch in der Eingabemaske keine Rolle oder?
    Wenn ich TExt auswähle sind doch die Zahlen eh schon dabei



  • Mmmmhhhh,... Syntaxfehler ? Dann hast du evtl. irgendwo ein Komma vergessen oder zu viel oder sonst irgendeinen Schreibfehler. Musst du eben mal mit dem Debugger nachgucken, was wirklich in der Variablen mit der SQL-Anweisung drin steht.

    Tja, und TEXT bedeutet eben alphanummerisch. Zeichenketten. Buchstaben-Zeichen ("Otternasen"), Zahlen-Zeichen ("0815") oder Gemischt-Zeichen ("Area51"). Wobei diese Zahlen aber als Text in einer Zeichenkette (hier gekennzeichnet durch " vorneweg und hintendran) vorliegen z.B. in einer CString-Variablen.

    NUMBER sind eben einfach Zahlen, aber nicht als Zeichenkette sondern als,.. öhm,... naja,... Zahl eben. Z.B. der Inhalt von integer-, float- oder double-Variablen.

    > Das spiel doch in der Eingabemaske keine Rolle oder?
    Stimmt. Kommt nur drauf an, wie es in der DB gespeichert werden soll:
    - als TEXT: dann müssen die ' mit in die SQL-Anweisung
    - als NUMBER: dann ohne die ' in der SQL-Anweisung



  • mmh, aber dann dürfte es doch normal gar nicht compiliert werden ohne Fehler oder?
    Der Laufzeitfehler kommt beim klicken auf "Hinzufügen"
    Der Mist kommt immer, wenn ich in das Eingabefeld: z.B Sitzplätze, wo eine NUMBER erwartet wird, NICHTS eingebe.
    Wenn ich eine Zahl eingebe klappt alles wunderbar

    Ich werd mal deguggen...

    Hab mal das ausprobiert:

    if(sSitzplaetze == "")
    	{
    		sSitzplaetze = "0";
    	}
    

    wenn ich nichts eintrage, dann wird in der DB eine 0 eingetragen, aber was muss ich machen, wenn ich garnichts eingetragen haben will
    dies geht nicht " ",



  • Möchte nur mal so nebenbei als Tip was sagen... Hat nichts mit der Eigentlichen Sache zu tun 😉

    isabeau schrieb:

    ... PLZ = '12345'...

    Bei PLZs würde ich als Datentyp nicht Number oder sonst einen Zahlen wert nehmen..
    Es gibt nämlich auch Postleitzahlen die mit einer 0 anfangen, die dann abgeschnitten - weil sinnlos bei einer Zahl mit 0 anzufangen - wird.
    Deswegen würde ich als Datentyp varchar2[5] (oderhalt entsprechender Datentyp) nehmen. Dann hat man nie Probleme damit.

    Ausserdem kann man dann bei der suche leicher nach PLZs die mit 51... Anfangen machen ( "where PLZ like '51%'" anstatt "where PLZ <= 51999 AND PLZ >= 51000" Meiner meinung nach "sinnvoller")

    lässt sich aber sicherlich streiten, wie man's besser macht 😉

    Also sorry nochmal, das ich das einfach so eingeworfen habe.



  • schon okay Vernochan.faul, brauchst dich nicht zu entschuldigen 😉
    Ist sehr interessant was du geschrieben hast, jetzt weiß ichs, guter Tip 🙂



  • soll ich mal in der Access DB, statt Number Text nehmen?
    Müsste doch dann gehen oder?



  • Also ich hab nun anstatt NUMBER; TEXT genommen
    Da hats geklappt, war ja auh´ch fast klar ;-),
    aber jetzt weiß ich nicht ob das ok ist, weil das hat doch normal ein Zweck dass man bei einer Zahl auch NUMBER nimmt oder ?

    DANKE



  • Naja also ansich sollte man schon number benutzen.
    Postleitzahlen sind aber eine Ausnahme, weil man dort eine 0 am Anfang haben kann, die WICHTIG ist.
    Wenn ich zum Beispiel von Geld rede macht es keinen unterschied ob ich nun 500 oder 0500 Euro habe. Deswegen wird auch nie eine 0 am Anfang einer zahl ausgegeben. Macht ja auch keinen Sinn.
    Aber eine Postleitzahl ist eine Genaue Identifizierung, bei der es Vorkommen kann, das die erste Zahl eine 0 ist. Da diese 0 Wichtig ist und nicht weggelassen werden kann muss man sich was einfallen lassen.
    Natürlich kann man bei jeder Ausgabe prüfen ob das nun 4 oder 5 Stellen sind und im Notfall eine 0 Vorstellen, aber das halte ich für Verschwendete Rechenleistung(klar - heutzutage quasi egal) und mehr aufwand weil man immer bei jeder ausgabe dran denken muss.

    Aber vor allem mache ich das so(und empfehle es auch so ;)) weil die Erste 0 Entscheidend sein kann... (Gera zum Beispiel hat PLZ 07545 - is schon anders als 7545 - kann zwar sein, das die post das richtig senden würde aber es ist quasi undefiniert was passiert ;))



  • hi

    aha, okay merci, ich werds mir merken 🙂
    Weiß du vielleicht oder jemand anderes wie man das macht?
    http://www.c-plusplus.net/forum/viewtopic.php?t=91406

    thx



  • hm? is doch ne Lösung drin?!?!?! 😕


Anmelden zum Antworten