2012-11-15 6 views
9

मैं सिर्फ अजाक्स और जेएसओएन प्रारूप को समझ रहा हूं। मैं एक बहुत ही सरल पता पुस्तिका बना रहा हूं। तो मान मैं सादगी की खातिर के साथ एक मेज है 3 स्तंभ हैं:जेएसओएन प्रारूप में SQL सर्वर क्वेरी परिणाम का डेटा कैसे प्राप्त करें?

Name, Email and Phone

मेरे जावास्क्रिप्ट/jQuery सबसे अच्छा सिर्फ सीखने नहीं है, लेकिन मैं डेटा JSON में मेरी एसक्यूएल सर्वर से लौटे रखना चाहते हैं प्रारूप। क्या मुझे एक संग्रहीत प्रक्रिया बनाना चाहिए जो एक जेएसएस फ़ाइल बना सकता है और उसे उस फ़ोल्डर में रख सकता है जहां मैं इसे अपने जावास्क्रिप्ट में उपयोग कर सकता हूं?

या यह क्लाइंट सी #/वीबीनेट ऐप की तरह कुछ ऐसा होना चाहिए जहां यह वास्तव में फ़ाइल को 5 मिनट कहता है?

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

मैं एक साधारण चयन बयान से वापस पाने:

SELECT name, email, phone from myTable

मैं तो एक json फ़ाइल के रूप में प्राप्त कर सकते हैं कैसे तो मैं स्टोर कर सकते हैं मूल रूप से यह मान मैं कुछ डेटा वापस प्राप्त करने देता है .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 फ़ाइलों को अपडेट करना आर्थिक है। निश्चित रूप से डेटा को क्रमबद्ध करना और इसे एक SQL फ़ील्ड में रखना बेहतर होगा? – shennan

+0

डुप्लिकेट सवाल? http://stackoverflow.com/questions/1562128/how-can-i-get-a-json-object-from-a-sql-server-table –

उत्तर

10

आमतौर पर ऐसा करने का एक बेहतर तरीका है कि JSON कुछ वेब एपीआई के माध्यम से कार्य करता है।

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/ और आप अपने डेटा देख सकते हैं

यहाँ कैसे ASP.NET MVC में यह करने के लिए का एक उदाहरण है। आप JSON प्रारूप में डेटा पुनर्प्राप्त करने के लिए जावास्क्रिप्ट का उपयोग कर सकते हैं। वेब एपीआई इसे आपके लिए JSON में परिवर्तित करने का ख्याल रखता है।

दृश्यों के पीछे एएसपी.नेट एमवीसी कक्षाओं को जेएसओएन में परिवर्तित करने के लिए न्यूटन सॉफ्ट के JSON.NET का उपयोग कर रहा है। यह खुला स्रोत है और किसी भी .NET अनुप्रयोग में उपयोग किया जा सकता है।

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

jQuery का उपयोग कर डेटा Retrieveing:

asp.net web forms json return result

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

<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 वेब प्रपत्र का उपयोग कर रहा है, तो आप के बजाय निम्न कर सकते हैं

+2

वेबफॉर्म के लिए [WebMethod] का उपयोग करके दिखाने के लिए अद्यतन उत्तर। –

+0

@JoeMcBride - मैंने मुद्दों के साथ यह कोशिश की http://stackoverflow.com/questions/13401776/ajax-call-states-failed-to-load-resource-simple-asp-net-contacts-class शायद आप फिर से मदद कर सकते हैं? – oJM86o

+0

यह आपको प्रत्येक संभावित क्वेरी के लिए कक्षा बनाने की आवश्यकता है जिसे आप डीबी (सभी तालिकाओं और विचारों) से वापस लौटाएंगे। प्रीफेरबल कुछ सामान्य तरीका होगा, 'दृश्य * दृश्य से सीधे' JSON प्रारूप में प्राप्त करने के लिए। किसी भी तरह से सीधे SQLDataReader से जेएसओएन प्रतिक्रिया में परिणामों को परिवर्तित करने के लिए। –

1

आप मेरी कुछ प्राथमिकताओं का उपयोग करने में सक्षम हो सकते हैं एसएसएल से जेसन तर्क कि मैंने अतीत में उपयोग किया है ... लेकिन यह मेरे डेटासेट के लिए विशिष्ट प्रकार का हो सकता है। मैंने इसे थोड़ा सा बनाने की कोशिश की।

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,
"Column2": "टेस्ट",
"स्तम्भ 3": "Test2"},
{ "id": 2,
"स्तंभ 1": 20,
"Column2": "test3",
"स्तम्भ 3": "test4"},
{ "id": 3,
"स्तंभ 1": 30,
"Column2": "Test5",
"स्तम्भ 3": "Test6"}] */

+0

असल में, मैंने एक सामान्य कॉलम आधारित डेटासेट को अनपॉवेट किया, और उसके बाद "दस्तावेज़", "इकाई", और "संपत्ति/मान" की शुरुआत और अंत की पहचान करने के लिए विंडोिंग फ़ंक्शंस का उपयोग किया। जाहिर है, यह कोड में बेहतर होगा, लेकिन यह सबसे बुनियादी उद्देश्यों के लिए चुटकी में काम करता है। –

संबंधित मुद्दे