Spalte nicht zulässig bei Update?

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Spalte nicht zulässig bei Update?

    Hallo,

    nachdem ich viel mit mySQL rumgespielt habe, wollte ich mich an unseren MS-SQL Server trauen.

    Allerdings bekomme ich schon bei einer simplen Update-Anweisung fehler
    Weiß da zufällig jemand, woran das liegt? Denn Google und forensuche haben mir leider nichts gebracht.

    Die Werte für den SQL-String werden per POST an die Seite übergeben:
    Code:
    Array ( [title_id] => PS7777 
    [title] => Emotional Security: A New Algorithm 
    [type] => psychology 
    [pub_id] => 0736 
    [price] => 7.98 
    [advance] => 4000 
    [royalty] => 10 
    [ytd_sales] => 3336 
    [notes] => Protecting yourself and your loved ones from undue emotional
     stress in the modern world. Use of computer and nutritional aids emphasized. 
    [pubdate] => 12 06 1991 0:00 )
    und daraus dann der String gebildet:
    Code:
    UPDATE titles 
    SET title = 'Emotional Security: A New Algorithm', 
    type = 'psychology ', 
    pub_id = '0736', 
    price = '7.98', 
    advance = '4000', 
    royalty = '10', 
    ytd_sales = '3336', 
    notes = 'Protecting yourself and your loved ones from undue emotional
     stress in the modern world. Use of computer and nutritional aids emphasized.', 
    pubdate = '12 06 1991 0:00' 
    WHERE title_id = 'PS7777'
    Und dann bekomme ich per get_last_message folgende Fehlermeldung:
    Die implizite Konvertierung von Datentyp varchar in Datentyp money in der pubs.dbo.titles-Tabelle, advance-Spalte ist nicht zul„ssig.
    Verwenden Sie die CONVERT-Funktion, um diese Abfrage auszufhren.
    Ich habe zum testen auch mal den teil mit advance weg gelassen, aber dann sucht er sich einfach das nächste Feld, welches er bemängelt davon ab habe ich keinen Wert so geändert, dass er nicht mehr in den Feldtyp passen würde... also ich habe die Daten erst ausgelesen und dann bei price z.B. die 7.99 zu 7.98 gemacht

    Zeilenumbrüche wurden nur zur besseren Lesbarkeit gemacht

    EDIT:
    SQL-String korrigiert
    Zuletzt geändert von Gae-Bulga; 28.06.2004, 11:00.

  • #2
    jetzt wäre es u.u. interessant zu wissen, wie deine tabelle aussieht ....
    INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


    Kommentar


    • #3
      Re: Spalte nicht zulässig bei Update?

      vielleicht solltest du mal explizit zahlen anstatt strings verwenden, an den stellen, die derart bemängelt werden.

      advance = '',

      '' ist nun mal etwas anderes, als eine zahlenmäßige 0 - und genau die scheint mir an der stelle erwartet zu werden.

      (wieso eigentlich '', in deiner POST-auflistung stand doch noch [advance] => 4000 drin ...?)
      I don't believe in rebirth. Actually, I never did in my whole lives.

      Kommentar


      • #4
        Gibts dafür einen SQL-Befehl x_X naja, hab jetzt aus den Clienttools abgeschrieben:

        feldname, feldtyp, größe, null, standart

        title_id, tid, 6, [ ], [nichts]
        title, varchar, 80, [ ], [nichts]
        type, char, 12, [ ], ('UNDECIDED')
        pub_id, char, 4 , [x], [nichts]
        price, money, 8, [x], [nichts]
        advance, money, 8, [x], [nichts]
        royalty, int, 4, [x], [nichts]
        ytd_sales, int, 4, [x], [nichts]
        notes, varchar, 200, [x], [nichts]
        pubdate, datetime, 8, [ ], (getdate())

        dürfte eine Standartdatenbank von SQL-Server 2000 sein.

        EDIT:
        @wahsaga: Ja, kleiner fehler der beim vielen rumspielen passiert ist. Der SQL-Fehler bleibt allerdings der gleiche, auch wenn bei advance im SQL-String 4000 steht
        Zuletzt geändert von Gae-Bulga; 28.06.2004, 10:57.

        Kommentar


        • #5
          Wie kommt denn Deine 4000 vom oberen Array in dein Update unten?
          steht da Update tbl
          SET
          advance='4000' ?
          oder
          Set
          advance=$Array[advance]
          oder
          Set
          advance=$Array[6] ?
          Lass ma wie von Wahsaga angemerkt die einfachen Hochkommas weg, weil ich glaub dann
          interpretiert er dat als Zeichenstring(varchar), und das tut er dann auch beim price usw.
          Und wofür suchst du jetzt einen SQL-Befehl? x_X (convert?)
          oder Create Table?
          Das Leben ist kein Ponyhof.

          Kommentar


          • #6
            Und wofür suchst du jetzt einen SQL-Befehl? x_X (convert?)
            oder Create Table?
            jetzt wäre es u.u. interessant zu wissen, wie deine tabelle aussieht ....
            Gibts dafür einen SQL-Befehl x_X naja, hab jetzt aus den Clienttools abgeschrieben:

            feldname, feldtyp, größe, null, standart

            title_id, tid, 6, [ ], [nichts]
            [...]
            Wie kommt denn Deine 4000 vom oberen Array in dein Update unten?
            PHP-Code:
            $sql    "UPDATE titles ";
            $sql   .= "SET title = '$title', ";
            $sql   .= "type = '$type', ";
            $sql   .= "pub_id = '$pub_id', ";
            $sql   .= "price = '$price', ";
            $sql   .= "advance = '$advance', ";
            $sql   .= "royalty = '$royalty', ";
            $sql   .= "ytd_sales = '$ytd_sales', ";
            $sql   .= "notes = '$notes', ";
            $sql   .= "pubdate = '$pubdate' ";
            $sql   .= "WHERE (title_id = '$title_id')"
            Wobei die Klammern bei (title_id = '$title_id') erst gerade dazu gekommen sind. Ich bin in einem SQL-Server-Handbuch am schaun, und da stands so drin, macht aber auch keinen Unterschied.

            Ich habe nun die Hochkommata entfernt (teilweise, ganz ohne gehts garnicht) und bekomme die Rückmeldung "Die Anweisung wurde beendet", also auch nicht die Lösung

            Kommentar


            • #7
              Ich habe nun die Hochkommata entfernt
              wo denn?
              Die Zeit hat ihre Kinder längst gefressen

              Kommentar


              • #8
                und was sagt: echo $sql; ? Ist deine Abfrage OK? Poste mal die Ausgabe.

                Kommentar


                • #9
                  Verzeihung, das hatte ich zwischendurch gemacht.
                  Code:
                  UPDATE titles 
                  SET title = 'Emotional Security: A New Algorithm', 
                  type = 'psychology ', 
                  pub_id = 0736, 
                  price = 7.98, 
                  advance = 4000, 
                  royalty = 10, 
                  ytd_sales = 3336, 
                  notes = 'Protecting yourself and your loved ones from undue emotional
                   stress in the modern world. Use of computer and nutritional aids emphasized.', 
                  pubdate = '12 06 1991 0:00' 
                  WHERE (title_id = PS7777)
                  Ergebnis:
                  Ungltiger Spaltenname 'PS7777'.
                  Gut, da hatte ich mir gedacht, dass PS7777 eigentlich auch eher ein String ist, aber wenn ich dort die Hochkommata wieder hinzufüge, kommt wieder:
                  Die Anweisung wurde beendet.
                  EDIT:
                  Aaaaalso, ich poste jetzt mal den Code und die Ausgabe:

                  PHP-Code:
                  print_r($_POST);
                  $title_id    $_POST['title_id'];
                  $title    $_POST['title'];
                  $type    $_POST['type'];
                  $pub_id    $_POST['pub_id'];
                  $price    $_POST['price'];
                  $advance    $_POST['advance'];
                  $royalty    $_POST['royalty'];
                  $ytd_sales    $_POST['ytd_sales'];
                  $notes    $_POST['notes'];
                  $pubdate    $_POST['pubdate'];

                  $sql    "UPDATE titles ";
                  $sql   .= "SET title = '$title', ";
                  $sql   .= "type = '$type', ";
                  $sql   .= "pub_id = $pub_id, ";
                  $sql   .= "price = $price, ";
                  $sql   .= "advance = $advance, ";
                  $sql   .= "royalty = $royalty, ";
                  $sql   .= "ytd_sales = $ytd_sales, ";
                  $sql   .= "notes = '$notes', ";
                  $sql   .= "pubdate = '$pubdate' ";
                  $sql   .= "WHERE (title_id = '$title_id')";

                  echo 
                  "<br><br>";
                  echo 
                  $sql."<br><br>";

                  mssql_query($sql) or die (mssql_get_last_message()); 
                  Array ( [title_id] => PS7777 [title] => Emotional Security: A New Algorithm [type] => psychology [pub_id] => 0736 [price] => 7.99 [advance] => 4000 [royalty] => 10 [ytd_sales] => 3336 [notes] => Protecting yourself and your loved ones from undue emotional stress in the modern world. Use of computer and nutritional aids emphasized. [pubdate] => 12 06 1991 0:00 )

                  UPDATE titles SET title = 'Emotional Security: A New Algorithm', type = 'psychology ', pub_id = 0736, price = 7.99, advance = 4000, royalty = 10, ytd_sales = 3336, notes = 'Protecting yourself and your loved ones from undue emotional stress in the modern world. Use of computer and nutritional aids emphasized.', pubdate = '12 06 1991 0:00' WHERE (title_id = 'PS7777')

                  Die Anweisung wurde beendet.
                  Zuletzt geändert von Gae-Bulga; 29.06.2004, 12:36.

                  Kommentar


                  • #10
                    OK mach mal so:

                    im EM (Enterprise Manager) Rechtsklick auf den Tabellennamen -> Alle Tasks -> SQL-Script generieren -> es erscheint ein Fenster -> auf Vorschau klicken -> alles ab dem Befehl "GO" übernehmen und hier posten. Dann schauen wir mal weiter.

                    Kommentar


                    • #11
                      Ehrm...da sind ganz viele Anweisungen mit GO...aber ich denke du meinst das hier, oder?
                      Code:
                      CREATE TABLE [dbo].[titles] (
                      	[title_id] [tid] NOT NULL ,
                      	[title] [varchar] (80) COLLATE Latin1_General_CI_AS NOT NULL ,
                      	[type] [char] (12) COLLATE Latin1_General_CI_AS NOT NULL ,
                      	[pub_id] [char] (4) COLLATE Latin1_General_CI_AS NULL ,
                      	[price] [money] NULL ,
                      	[advance] [money] NULL ,
                      	[royalty] [int] NULL ,
                      	[ytd_sales] [int] NULL ,
                      	[notes] [varchar] (200) COLLATE Latin1_General_CI_AS NULL ,
                      	[pubdate] [datetime] NOT NULL 
                      ) ON [PRIMARY]
                      GO

                      Kommentar


                      • #12
                        Original geschrieben von Gae-Bulga
                        PHP-Code:
                        mssql_query($sql) or die (mssql_get_last_message()); 
                        Die Anweisung wurde beendet.
                        und? wurde ein Update durchgeführt? wie wär's mit:
                        PHP-Code:
                        mssql_query($sql) or die (mssql_error());
                        //edit: Sh*t, gibs nicht 

                        Kommentar


                        • #13
                          und? wurde ein Update durchgeführt?
                          Nein. Das get_last_message steht auch bei "or die(...", von daher wirds wohl eine Art Abbruch-Rückmeldung sein. Die Daten verändern sich auf jeden Fall nicht.
                          (mssql_error());
                          Scheint mysql-spezifisch zu sein, deswegen habe ich get_last_message benutzt, da es den befehlt mit _error nicht gibt.
                          EDIT:

                          Mal eine andere Theorie: Gibt es bei Tabellen auf MSSQL eine Art schreibschutz oder so? ...ich glaub das schau ich zuerst mal nach

                          Kommentar


                          • #14
                            Bring den Inhalt von $pubdate auf das Format: 'DD.MM.YYYY HH:MM' oder besser: finde heraus, wasfür DateTime-Format der Server akzeptiert und übergebe entsprechend. Ich vermute, dass hier das Problem ist.

                            Kommentar


                            • #15
                              Original geschrieben von Gae-Bulga
                              Nein. Das get_last_message steht auch bei "or die(...", von daher wirds wohl eine Art Abbruch-Rückmeldung sein.
                              klar, ich hab' wieder Mist gepostet

                              Kommentar

                              Lädt...
                              X