2016-04-28 17 views
8

Mam pytanie dotyczące pobierania danych z bazy danych SQL przez ASP.NET, a następnie przekazywania danych do Objective-C. Obecnie jestem po prostu za pomocą SQL SELECT, aby uzyskać dane z bazy danych za pomocą ASP.NET i ASP.NET zwraca dane w taki sposób:SQL XML lub JSON, aby powrócić do Objective-C za pośrednictwem ASP.NET

<ArrayOfKeyValueOfstringPunchListCellModel84zsBx89 xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays"> 
<KeyValueOfstringPunchListCellModel84zsBx89> 
<Key>ORC0023</Key> 
<Value xmlns:d3p1="http://schemas.datacontract.org/2004/07/LHS.Models"> 
</Value> 
</KeyValueOfstringPunchListCellModel84zsBx89> 
</ArrayOfKeyValueOfstringPunchListCellModel84zsBx89> 

a potem w Objective-C kładę danych w NSDictionary tak:

NSDictionary *punchList = [[NSDictionary alloc]initWithDictionary:[NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&myError]]; 

Wszystko działa zgodnie z oczekiwaniami.

Co robię teraz jest stworzenie procedury przechowywanej, która zwraca XML i mieć ASP.NET zwróci XML (wszystko tutaj jest zakończona i działa zgodnie z oczekiwaniami) XML wyszło tak:

<KeyValueOfstringPunchListCellModel84zsBx89> 
<Key>ORC0023</Key> 
<Value> 
</Value> 
</KeyValueOfstringPunchListCellModel84zsBx89> 
</ArrayOfKeyValueOfstringPunchListCellModel84zsBx89> 

Teraz dla ciebie, fanów Objective-C, wiesz, że nie możesz mieć XML-a w NSDictionary, chyba że używasz elementu/biblioteki innej firmy.

Moje pytanie brzmi: czy ponownie wykonałem procedurę przechowywaną, aby zwrócić JSON lub inny sposób rozwiązania tego problemu?

Moim celem końcowym jest przyspieszenie procesu, a zapytanie SQL jest ogromne i zwraca wiele wierszy.

+1

Naprawdę nie wyjaśniasz swojego problemu. Porównanie wielkości XML i JSON? Czy włączono kompresję w odpowiedziach HTTP? – Wain

+0

dlaczego trzeba ręcznie przygotować XML lub JSON? ASP.Net API ma sposoby zautomatyzowania procesu zwracania odpowiedzi w sposób zdefiniowany przez nas. – techspider

Odpowiedz

2

Powinieneś:

1) przerobić przechowywane proc i zwrócić surowe dane.

2) Niech asp.net obsługuje formatowanie danych, ponieważ niektórzy klienci mogą chcieć JSON, podczas gdy inni wolą xml. więc jeśli masz zamiar trasę JSON, można powrócić wynik JSON z MVC kontrolera tj

public JsonResult GetData() 
     { 
      var temp = new { 
       name = "hello world" 
      }; 
      return this.Json(temp) 
     } 

lub utworzyć usługę internetową z wykorzystaniem Web API.

ponieważ masz duży zestaw wyników, należy spróbować użyć JSON, który jest mniej gadatliwe niż xml, a tym samym będą jeść mniej zasobów

+0

To zdecydowanie jest droga ... jeśli to nie jest jakaś wersja asp.net w wersji basackward. – Clay

0

Chciałbym zaoferować alternatywne rozwiązanie, ale muszę przejść przez niektóre założenia.

Teraz moje pytanie brzmi, czy muszę przerobić moje procedury przechowywanej powrócić JSON czy to jakiś inny sposób, aby przejść na ten temat?

Nie trzeba powrócić JSON jeśli można uniknąć to dodatkowy krok, jeśli nie jest uruchomiony program Microsoft SQL Server 2016, który obsługuje teraz „FOR JSON” klauzuli po wyjęciu z pudełka.

Moim celem końcowym jest przyspieszenie procesu, a zapytanie SQL jest ogromne i zwraca wiele wierszy.

Tutaj "ogromny" + "szybki" może odgrywać pewną rolę. W obu przypadkach można również parsować XML bezpośrednio z Objective-C, tak jak robią to chłopcy z kanału C#, a także XmlReader.

Dostępne są opakowania cienkie, takie jak IGXMLReader.A oto wstępny przykład przeciwko twojemu XMLowi.

- (NSDictionary *)retrieveDataFromXml:(NSString *)xml { 
    NSMutableDictionary *dictionary = 
     [[NSMutableDictionary alloc] initWithCapacity:200]; 
    NSString *key; 
    for (IGXMLReader *node in [[IGXMLReader alloc] initWithXMLString:xml]) { 
    if ([node type] == IGXMLReaderNodeTypeElement && 
     [[node name] hasPrefix:@"Key"]) { 
     key = [node text]; 
    } else if ([node type] == IGXMLReaderNodeTypeElement && 
       [[node name] hasPrefix:@"Value"] && [key length]) { 
     [dictionary setObject:[node text] forKey:key]; 
     key = nil; 
    } 
    } 
    return [dictionary copy]; 
} 

Połączyłem przykład w github, aby zilustrować koncepcję.