Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Problem z projektem procedury składowanej RESTful webservice + JSON + SQL

OK, więc jest kilka rzeczy, które musisz zmienić, aby działało:

  1. Dodaj konstruktor bez parametrów do Note'a, ponieważ będzie potrzebny do deserializacji:

    public Note()
    {
    }
    
  2. Pozbądź się "statycznych" w polach Note:

    publiczne statyczne string Klient { get; ustawić; }

    publiczne statyczne int Sprawa { get; ustawić; }

    publiczne statyczne ciąg Tekst { get; ustawić; }

    publiczne statyczne int NoteId { get; ustawić; }

    publiczne statyczne ciąg R1 { pobierz; ustawić; }

    publiczne statyczne ciąg R2 { get; ustawić; }

    publiczne statyczne ciąg S1 { pobierz; ustawić; }

    publiczne statyczne DateTime Data { get; ustawić; }

    publiczne statyczne bool Wpisz { get; ustawić; }

  3. Nie wysyłaj tablicy JSON, jeśli chcesz tylko 1 obiekt, nie zostanie on zdeserializowany. Oczekujesz pojedynczego obiektu, a nie tablicy, więc nie wysyłaj tablicy.

  4. Masz Type as bool, ale wysyłasz ciąg "1", to nie zostanie zdeserializowana do prawdziwej wartości, jak można się było spodziewać. Wyślij true/false (nie "true"/"false") lub zmień typ Type na string.

  5. Pozbądź się tego prywatnego pola, nie potrzebujesz go:

    prywatna uwaga;

  6. Pozbądź się tych konstruktorów, które tam masz

    notatka publiczna (string json)

    notatka publiczna (pozycja Uwaga)

    Nie tylko, że nie mają sensu i nie będą działać, nie potrzebujesz ich, ponieważ deserializator JSON wypełni pola za Ciebie.

EDYTUJ: Na przykład mówisz, że nie buduje, ponieważ nie ma już konstruktora z jednym parametrem. Oczywiście nie buduje, jest taka linia

Note notesdata = new Note(item);

ale nie potrzebujesz tej linii. Jaka jest idea tej linii? Chcesz instancję klasy Note, ale masz ją już w zmiennej "item". Nie musisz tworzyć drugiej kopii tego. Więc pozbądź się tego też.

Innym powodem, dla którego się nie skompiluje, jest to, że pozbywasz się tych pól statycznych, podczas gdy nadal masz to w swojej metodzie Add:

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

i jestem pewien, że tego nie chcesz. Zamiast tego chcesz użyć instancji obiektu, który został do Ciebie wysłany:

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

Inną rzeczą jest to, że zwykle nie ma powodu, dla którego metoda Add zwracałaby dodawany obiekt do bazy danych. Możesz to zmienić

   public Note Add(Note item)

do tego

   public void Add(Note item)

i nie zwracaj niczego, nie potrzebujesz tego.

Nie jestem ekspertem od SqlConnection i rzeczy z nim związanych, więc tej części nie komentuję. Używam EF w moich projektach do pracy z DB. W tej części mogą być więc pewne problemy, ale nie mogę tego komentować.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak znaleźć najwolniejsze zapytania

  2. SQL Server 2008:INSERT, jeśli nie wychodzi, zachowaj unikalną kolumnę

  3. argument procedury składowanej sql jako parametr dla zapytania dynamicznego

  4. Tabela przestawna serwera SQL Server z agregacjami wielu kolumn

  5. Konwersja nie powiodła się podczas konwertowania wartości varchar „none” na typ danych int