2012-11-15 25 views
9

私はAjaxとJSON形式について理解しています。私は非常に単純なアドレス帳を構築しています。SQL Serverのクエリ結果のデータをJSON形式に変換する方法は?

Name, Email and Phone

私のjavascript/jqueryのは、単に学習最善ではありませんが、私はJSONに私のSQL Serverから返されたデータを入れたい: だから3列があり、私は、簡単のためにテーブルを持っていると仮定しますフォーマット。 jsonファイルを作成し、それを私のjavascriptで使用できるフォルダに置くことができるストアドプロシージャを作成する必要がありますか?

これはクライアントC#/ VB.netアプリのようなもので、実際に5分ごとにファイルが生成される場所です。

SELECT name, email, phone from myTable

私は、JSONファイルとしてこれを取得することができますどのように私は保存することができます:私は、単純なselect文からこの背中を取得

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

:基本的に私は戻っていくつかのデータ取得を前提とすることができますデータを.jsonに入力してから、そのファイルをjavascriptコードで使用してください。誰かがjsonファイルを生成する方法と同様にこのことを説明できますか?

+1

あなたがここに投票したい場合があります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

これにはサーバーサイドスクリプトを使用する必要があります。データベースの更新が行われるたびに.jsonファイルを更新するのは経済的ですか?確かに、データをシリアル化して1つのSQLフィールドに入れる方が良いでしょうか? – shennan

+0

重複した質問はありますか? http://stackoverflow.com/questions/1562128/how-can-i-get-a-json-object-from-a-sql-server-table –

答えて

10

これを行うよりよい方法は、JSONをいくつかのWeb 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 = "[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; 
     } 
    } 

あなたが、その後を参照します:http://localhost:xxxx/api/contacts/、あなたのデータを見ることができます。 JavaScriptを使用してJSON形式のデータを取得できます。 Web APIはJSONに変換してくれます。

シーンの裏側ASP.NET MVCは、NewtonSoftのJSON.NETを使用してクラスをJSONに変換しています。これはオープンソースであり、どの.NETアプリケーションでも使用できます。

<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 Webフォームを使用している場合は、代わりに次のことが可能です。:

asp.net web forms json return result

[WebMethod] 
[ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
public List<Contact> GetAllContacts() 
{ 
    return contacts; 
} 
のjQueryを使用してデータをRetrieveing

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

+2

WebFormsの[WebMethod]を使用して表示する回答が更新されました。 –

+0

@ JoeMcBride - 私は問題でこれを試しましたhttp://stackoverflow.com/questions/13401776/ajax-call-states-failed-to-load-resource-simple-asp-net-contacts-class多分あなたは再び助けることができますか? – oJM86o

+0

これは、DB(すべてのテーブルとビュー)から返す可能性のあるすべてのクエリのクラスを作成する必要があります。 Preferrableは、 'SELECT * FROM view'を直接JSON形式にするための一般的な方法です。何らかの形でSQLDataReaderからJSON応答に結果を直接変換します。 –

1

あなたは私のいくつかの初歩的なものを利用することができます私は過去に使用してきたSQLからJSONへのロジックですが、それは私のデータセットに特有のものかもしれません。私は少しそれを一般化しようとしました。/ *

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以下の通りであろう:

[{ "ID":1、
"列1":10、
"列2" を "テスト"、
"COLUMN3": "Test2を"}、
{ "ID":2、
"列1":20、
"列2": "Test3は"
"COLUMN3": "TEST4"}、
{ "ID":3、
"列1":30、
"列2": "TEST5"、
"COLUMN3": "TEST6"}] */

+0

基本的に、私はジェネリックな列ベースのデータセットをピボットし、ウィンドウ関数を使用して "ドキュメント"、 "エンティティ"、 "プロパティ/値"の開始と終了を識別しました。明らかに、これはコードでうまくいくでしょうが、最も基本的な目的のためにピンチで動作します。 –

関連する問題