2012-11-15 17 views
9

Sto solo imparando a capire il formato Ajax e JSON. Sto costruendo una rubrica molto semplice. Quindi assumere Ho una tabella con la semplicità ha 3 colonne:Come ottenere i dati del risultato della query SQL Server in formato JSON?

Name, Email and Phone

mio JavaScript/jQuery non è il migliore solo imparare, ma voglio mettere i dati restituiti dal mio SQL Server in JSON formato. Devo creare una stored procedure in grado di creare un file JSON e metterlo in una cartella in cui posso usarlo nel mio javascript?

O è come dovrebbe funzionare un'applicazione client C#/VB.net in cui effettivamente genera il file ogni dire 5 minuti? lascia basicamente Presumo ottengo alcuni dati storici:

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

ottengo questo ritorno da una semplice dichiarazione prescelta:

SELECT name, email, phone from myTable

Come posso quindi ottenere questo come un file JSON in modo da poter memorizzare il dati in un .json e quindi utilizzare tale file nel mio codice javascript. Qualcuno può spiegare questo e come le persone generano file json?

+1

Si potrebbe voler votare qui : 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

Per questo dovrai utilizzare uno script sul lato server. È economico aggiornare i file .json ogni volta che viene effettuato un aggiornamento del database. Sicuramente sarebbe meglio serializzare i dati e averli in un campo SQL? – shennan

+0

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

risposta

10

In genere, un modo migliore per farlo è far pubblicare JSON tramite qualche web API.

Ecco un esempio di come farlo in 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; 
     } 
    } 

si sarebbe poi passare a: http://localhost:xxxx/api/contacts/ e si può vedere i vostri dati. È possibile utilizzare javascript per recuperare i dati in formato JSON. L'API Web si occupa di convertirla in JSON per te.

Dietro le quinte ASP.NET MVC utilizza JSON.NET di NewtonSoft per convertire le classi in JSON. Questo è open source e può essere utilizzato in qualsiasi applicazione .NET.

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

retrieveing ​​i dati utilizzando 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> 

Se il progetto sta usando Forms ASP.NET Web, è possibile effettuare le seguenti operazioni, invece:

asp.net web forms json return result

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

Risposta aggiornata per mostrare usando [WebMethod] per WebForms. –

+0

@JoeMcBride - L'ho provato con i problemi http://stackoverflow.com/questions/13401776/ajax-call-states-failed-to-load-resource-simple-asp-net-contacts-class forse puoi aiutarti di nuovo? – oJM86o

+0

Ciò richiede di creare una classe per ogni possibile query che si restituirebbe dal DB (tutte le tabelle e le viste). Preferibile sarebbe un modo generico per ottenere 'SELECT * FROM view' direttamente nel formato JSON. In qualche modo per convertire direttamente i risultati da SQLDataReader alla risposta JSON. –

1

Potrebbe essere possibile utilizzare alcuni dei miei rudimentali sql to json logic che ho usato in passato ... ma potrebbe essere un po 'specifico per il mio set di dati. Ho provato a generarlo un po '.

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 sarebbe la seguente:

[{ "id": 1,
"Colonna1": 10,
"Column2": "Test",
"Colonna3": "Test2"}, {
"Id": 2,
"Colonna1": 20,
"Column2": "Test3",
"Colonna3": "Test4"},
{ "id": 3,
"Colonna1": 30,
"Column2": "Test5",
"Colonna3": "Test6"}] */

+0

Fondamentalmente, non ho inavvertito un set di dati generico basato su colonne e quindi ho usato le funzioni di windowing per identificare l'inizio e la fine del "documento", "entità" e "proprietà/valore". Ovviamente, questo sarebbe meglio fatto nel codice, ma funziona in un pizzico per gli scopi più basilari. –

Problemi correlati