Как получить данные результата запроса SQL Server в формате JSON?

Я только начинаю понимать формат Ajax и JSON. Я создаю очень простую адресную книгу. Предположим у меня есть таблица с для простоты имеет 3 колонки:

Name, Email and Phone

мой javascript / jquery не лучший просто обучение, но я хочу поместить данные, возвращенные с моего SQL Server в формат JSON. Должен ли я создать хранимую процедуру, которая может создать файл json и поместить его в папку, где я могу использовать его в своем javascript?

или это что-то вроде клиента C# / VB.net приложение должно делать то, где оно фактически генерирует файл каждые 5 минут? В основном давайте предположим, что я получаю некоторые данные:

George g@yahoo.com 123-3333
Mike m@gmail.com 123-4433
Steve s@gmail.com 144-3333
Jill r@gmail.com 333-3333

Я получаю это обратно из простого оператора select:

SELECT name, email, phone from myTable

как я могу получить это как файл json, чтобы я мог хранить данные в .json а затем используйте этот файл в моем коде javascript. Может ли кто-нибудь объяснить это, а также как люди генерируют файлы json?

2 ответов


обычно лучший способ сделать это-иметь JSON, обслуживаемый через некоторый веб-api.

вот пример того, как это сделать в 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 = "g@yahoo.com", Phone = "123-3333" }, 
            new Contact{ Name = "Mike", Email = "m@yahoo.com", Phone = "123-3333" }, 
            new Contact{ Name = "Steve", Email = "s@yahoo.com", Phone = "123-3333" } 
        };

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

затем вы перейдете к:http://localhost:xxxx/api/contacts/ и вы можете увидеть ваши данные. Вы можете использовать javascript для получения данных в формате JSON. Веб-API заботится о его преобразовании в JSON для вы.

за кулисами ASP.NET MVC использует NewtonSoft JSON.NET чтобы преобразовать классы в JSON. Это с открытым исходным кодом и может использоваться в любом приложении .NET.

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

получение данных с помощью 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>

если ваш проект использует ASP.NET веб-формы, вы можете сделать следующее вместо этого:

asp.net возврат веб-форм json результат

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

вы можете использовать некоторые из моих рудиментарных sql для логики json, которые я использовал в прошлом... но это может быть специфично для моего набора данных. Я пытался genericize это немного.

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
;

/* -- выход будет следующим:

[ {"Id": 1 ,
"Column1": 10,
"Column2": "Test",
"Столбец3":"Условие_2" },
{"Id": 2,
"Column1": 20,
"Column2": "Test3" ,
"Column3":" Test4"},
{"Id": 3,
"Column1": 30,
"Column2": "Test5",
"Column3": "Test6" } ] */