2012-11-15 12 views
9

Po prostu rozumiem format Ajax i JSON. Buduję bardzo prostą książkę adresową. więc zakładać, mam tabelę dla uproszczenia ma 3 kolumny:Jak uzyskać dane wynikowego zapytania SQL Server w formacie JSON?

Name, Email and Phone

Moja JavaScript/jQuery nie jest najlepsza tylko nauka, ale chcę umieścić dane zwracane z mojego serwera SQL do JSON format. Czy powinienem utworzyć procedurę składowaną, która może utworzyć plik json i umieścić go w folderze, w którym mogę go użyć w moim javascript?

Czy jest to coś w rodzaju aplikacji klienckiej C#/VB.net, która powinna działać tam, gdzie faktycznie generuje plik co 5 minut? Zasadniczo pozwala zakładać, mam pewne dane historyczne:

George [email protected] 123-3333 
Mike [email protected] 123-4433 
Steve [email protected] 144-3333 
Jill [email protected] 333-3333 

dostanę to z powrotem od prostego select:

SELECT name, email, phone from myTable

Jak można wtedy uzyskać to jako plik json, dzięki czemu można przechowywać danych w .json, a następnie użyj tego pliku w moim kodzie JavaScript. Czy ktoś może to wyjaśnić, a także jak ludzie generują pliki json?

+1

Możesz chcieć głosować tutaj : http://connect.microsoft.com/SQLServer/feedback/details/673824/add-native-support-for-json-to-sql-server-a-la-xml-as-in-for-json-or -from-openjson –

+0

Będziesz musiał użyć skryptu po stronie serwera. Czy aktualizacja plików .json jest ekonomiczna przy każdej aktualizacji bazy danych. Na pewno lepiej byłoby serializować dane i mieć je w jednym polu SQL? – shennan

+0

Zduplikowane pytanie? http://stackoverflow.com/questions/1562128/how-can-i-get-a-json-object-from-a-sql-server-table –

Odpowiedz

10

Zazwyczaj lepszym sposobem na wykonanie tego polecenia jest udostępnienie JSON za pomocą interfejsu WWW.

Oto przykład jak to zrobić w ASP.NET MVC:

http://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/tutorial-your-first-web-api

public class Contact 
{ 
    public string Name {get;set;} 
    public string Email {get;set;} 
    public string Phone {get;set;} 
} 

public class ContactsController : ApiController 
    { 
     // instead of having the contacts in memory, you can load them from the database using Entity Framework, Dapper.NET - or you other favorite ORM. 
     Contact[] contacts = new Contact[] 
     { 
      new Contact{ Name = "George", Email = "[email protected]", Phone = "123-3333" }, 
      new Contact{ Name = "Mike", Email = "[email protected]", Phone = "123-3333" }, 
      new Contact{ Name = "Steve", Email = "[email protected]", Phone = "123-3333" } 
     }; 

     public IEnumerable<Contact> GetAllContacts() 
     { 
      return contacts; 
     } 
    } 

Można by następnie przejdź do: http://localhost:xxxx/api/contacts/ i można zobaczyć swoje dane. Możesz użyć javascript do pobierania danych w formacie JSON. Web API dba o to, aby przekonwertować go na system JSON.

Za kulisami ASP.NET MVC używa JSON.NET NewtonSoft do konwersji klas do JSON. To jest open source i może być używane w dowolnej aplikacji .NET.

http://james.newtonking.com/pages/json-net.aspx

Retrieveing ​​danych przy użyciu jQuery:

<script type="text/javascript"> 
    $(document).ready(function() { 
     // Send an AJAX request 
     $.getJSON("api/contacts/", 
     function (data) { 
      // On success, 'data' contains a list of contacts. 
      $.each(data, function (key, val) { 

       console.log(val.Name, val.Phone, val.Email); 
      }); 
     }); 
    }); 
</script> 

Jeśli projekt jest przy użyciu ASP.NET Web Forms, można wykonać następujące zamiast:

asp.net web forms json return result

[WebMethod] 
[ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
public List<Contact> GetAllContacts() 
{ 
    return contacts; 
} 
+2

Zaktualizowana odpowiedź do wyświetlenia przy użyciu [WebMethod] dla WebForms. –

+0

@JoeMcBride - próbowałem tego z problemami http://stackoverflow.com/questions/13401776/ajax-call-states-failed-to-load-resource-simple-asp-net-contacts-class może mógłbyś jeszcze raz pomóc? – oJM86o

+0

Wymaga to utworzenia klasy dla każdego możliwego zapytania, które zwrócisz z DB (wszystkie tabele i widoki). Preferrable byłby jakiś ogólny sposób, aby uzyskać 'SELECT * FROM view' bezpośrednio w formacie JSON. Jakoś bezpośrednio przekonwertować wyniki z SQLDataReader na odpowiedź JSON. –

1

Być może będziesz w stanie wykorzystać niektóre z moich elementarnych logiki sql do json, których używałem w przeszłości ... ale może to być swoiste dla mojego zbioru danych. Próbowałem ją trochę uogólnić.

SET NOCOUNT ON; 

--sample table 
CREATE TABLE #Temp(
    Id INT Identity(1,1), 
    Column1 INT, 
    Column2 VARCHAR(10), 
    Column3 VARCHAR(10) 
    ) 
; 

INSERT INTO #Temp(Column1, Column2, Column3) VALUES (10,'Test', 'Test2'), (20, 'Test3', 'Test4'), (30, 'Test5', 'Test6'); 

WITH 
    cte AS(
     SELECT Id AS RowId, 
       CAST(Id AS VARCHAR(100)) AS Id, 
       CAST(Column1 AS VARCHAR(100)) AS Column1, 
       CAST(Column2 AS VARCHAR(100)) AS Column2, 
       CAST(Column3 AS VARCHAR(100)) AS Column3 
     FROM #Temp 
     ), 
    cte2 AS (
     SELECT RowId, 
       '"' + PropertyName + '"' + ':' + CASE WHEN ISNUMERIC(Value) = 1 THEN Value ELSE '"' + Value + '"' END AS Value, 
       ROW_NUMBER() OVER(PARTITION BY RowId ORDER BY CASE WHEN PropertyName = 'Id' THEN '' ELSE PropertyName END) AS RowNum, 
       ROW_NUMBER() OVER(ORDER BY RowId) AS RowNum2 
     FROM cte 
      UNPIVOT(
       Value 
       FOR PropertyName IN (
        Id, 
        Column1, 
        Column2, 
        Column3 
        ) 
       ) upvt 
     ) 
     SELECT CASE WHEN cte2.RowNum2 = y.MinRowNum THEN '[' ELSE '' END, 
       CASE WHEN cte2.RowNum = x.MinRowNum THEN '{' ELSE '' END, 
       cte2.value, 
       CASE WHEN cte2.RowNum <> x.MaxRowNum THEN ',' ELSE '' END, 
       CASE 
        WHEN cte2.RowNum = x.MaxRowNum THEN '}' + 
         CASE WHEN cte2.RowNum2 = y.MaxRowNum THEN '' ELSE ',' END 
        ELSE '' 
       END, 
       CASE WHEN cte2.RowNum2 = y.MaxRowNum THEN ']' ELSE '' END 
     FROM cte2 
      INNER JOIN (
       SELECT RowId, 
         MIN(RowNum) AS MinRowNum, 
         MAX(RowNum) AS MaxRowNum 
       FROM cte2 
       GROUP BY RowId 
       ) x 
        ON cte2.RowId = x.RowId 
      CROSS JOIN (
       SELECT MIN(RowNum2) AS MinRowNum, 
         MAX(RowNum2) AS MaxRowNum 
       FROM cte2 
       ) y 
; 

/* --output będzie następujący:

[{ "id": 1,
"COLUMN1": 10,
"COLUMN2": "Test"
"kolumna3": "Test2"},
{ "id": 2
"Kolumna1": 20,
"Kolumna2": "Test3"
"kolumna3": "Test4"},
{ "id": 3,
"Kolumna1": 30,
"Kolumna2": "test5"
"kolumna3": "test6"}] */

+0

Zasadniczo odłączyłem ogólny zestaw danych oparty na kolumnach, a następnie użyłem funkcji okienkowania do zidentyfikowania początku i końca "dokumentu", "obiektu" i "właściwości/wartości". Oczywiście lepiej byłoby zrobić to w kodzie, ale działa to w najprostszy sposób. –

Powiązane problemy