Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Problem mit RESTful-Webservice +JSON+SQL-Projekt für gespeicherte Prozeduren

OK, also gibt es einige Dinge, die Sie ändern müssen, damit es funktioniert:

  1. Parameterlosen Konstruktor zu Note hinzufügen, da er für die Deserialisierung benötigt wird:

    public Note()
    {
    }
    
  2. Befreien Sie sich von "statisch" in den Feldern von Note:

    öffentlich statisch Zeichenfolge Client { erhalten; einstellen; }

    öffentlich statisch int Fall { erhalten; einstellen; }

    öffentlich statisch Zeichenfolge Text { erhalten; einstellen; }

    öffentlich statisch int NoteId { erhalten; einstellen; }

    öffentlich statisch Zeichenfolge R1 { erhalten; einstellen; }

    öffentlich statisch Zeichenfolge R2 { erhalten; einstellen; }

    öffentlich statisch Zeichenfolge S1 { erhalten; einstellen; }

    öffentlich statisch DateTime Datum { erhalten; einstellen; }

    öffentlich statisch bool Typ { erhalten; einstellen; }

  3. Senden Sie kein JSON-Array, wenn Sie nur 1 Objekt möchten, es wird nicht deserialisiert. Sie erwarten ein einzelnes Objekt, kein Array, also senden Sie kein Array.

  4. Sie haben Type as bool, aber Sie senden die Zeichenfolge „1“, dies wird nicht wie erwartet auf den wahren Wert deserialisiert. Senden Sie entweder wahr/falsch (nicht "wahr"/"falsch") oder ändern Sie den Typ von Type in string.

  5. Befreien Sie sich von diesem privaten Elementfeld, Sie brauchen es nicht:

    privates Notizelement;

  6. Befreien Sie sich von diesen Konstruktoren, die Sie dort haben

    öffentliche Notiz (string json)

    öffentliche Notiz(Notizelement)

    Nicht nur, dass sie keinen Sinn machen und nicht funktionieren, Sie brauchen sie auch nicht, da der JSON-Deserializer die Felder für Sie ausfüllt.

BEARBEITEN: Sie sagen beispielsweise, dass es nicht erstellt wird, weil es keinen Konstruktor mit einem Parameter mehr gibt. Natürlich baut es nicht, da ist diese Zeile

Note notesdata = new Note(item);

aber Sie brauchen diese Zeile nicht. Was ist die Idee hinter dieser Linie? Sie möchten eine Instanz der Klasse Note, aber Sie haben sie bereits in der Variablen "item". Sie müssen davon keine zweite Kopie erstellen. Also werde auch das los.

Ein weiterer Grund, warum es nicht kompiliert wird, ist, dass Sie diese statischen Felder loswerden, während Sie dies noch in Ihrer Add-Methode haben:

        cmd.Parameters.Add("@Text", SqlDbType.VarChar).Value = Note.Text.Trim();
        cmd.Parameters.Add("@When", SqlDbType.DateTime).Value = Note.Date;

und ich bin mir ziemlich sicher, dass du das nicht willst. Stattdessen möchten Sie die Instanz des Objekts verwenden, die Ihnen gesendet wurde:

        cmd.Parameters.Add("@Text", SqlDbType.VarChar).Value = item.Text.Trim();
        cmd.Parameters.Add("@When", SqlDbType.DateTime).Value = item.Date;

Eine andere Sache ist, dass es normalerweise keinen Grund gibt, warum die Add-Methode das Objekt zurückgeben würde, das der DB hinzugefügt wird. Sie können dies also gerne ändern

   public Note Add(Note item)

dazu

   public void Add(Note item)

und gib nichts zurück, du brauchst es nicht.

Ich bin kein Experte für SqlConnection und Dinge drumherum, daher kommentiere ich diesen Teil nicht. Ich verwende EF in meinen Projekten für die Arbeit mit DB. Daher könnte es in diesem Teil einige Probleme geben, aber dazu kann ich nichts sagen.