2014-05-07 25 views
3

新的程序員,我正在用VB.Net代碼構建一個aspx頁面,我試圖用我們的數據庫中的數據創建一個D3圖表,但我無法獲得將值返回到正確的格式。VB.Net SQL結果到JSON的Ajax

在我的VB代碼,我可以得到一個串入的確切格式我想:

[{ name: "PROAIR", value: 7}],{ name: "NASONEX", value: 4}] 

,但是當我通過它回到它結束了:

{"d":"[{name: \"PROAIR\", value: 7},{name: \"NASONEX\", value: 4}]"} 

我知道(現在)它試圖序列化返回值,所以我嘗試了使用數據表和序列化,然後列表(對象)並序列化,但每次我得到不同的結果與更多的引號和返回值退出退格。我已經看過Microsoft Person示例和一些Stack Contacts示例,但是真的有必要爲我構建一個全新的類並向其中添加新項目? 我下面的字符串生成器,代碼:

Dim sData As String 
Dim sqlCmd As New SqlCommand(strSql, cn) 
Using sdr As SqlDataReader = sqlCmd.ExecuteReader() 
    Dim sb As New StringBuilder() 
    sb.Append("[") 
    While sdr.Read() 
    sb.Append("{") 
    System.Threading.Thread.Sleep(50) 
    sb.Append(String.Format("name: '{0}', value: {1}", sdr(0), sdr(1))) 
    sb.Append("},") 
    End While 
    sb = sb.Remove(sb.Length - 1, 1) 
    sb.Append("]") 
    sData = sb.ToString 
    sData = sData.Replace("'", ControlChars.Quote) 
    cn.Close() 

    Return sData 
End Using 

如果我嘗試和序列化字符串:

Dim serializer As New JavaScriptSerializer() 
Dim SerializedResult = serializer.Serialize(sData) 
Return SerializedResult 

我結束了:{"d":"\"[{name: \\\"PROAIR\\\", value: 7},{name: \\\"NASONEX\\\", value: 4}]\""}

我試着用 昏暗deserializedResult =序列化反序列化(字符串)(sData) 但它出錯陣列類型失敗,所以顯然你不能這樣做:)

在aspx頁面我已經硬編碼:

success: function (r) { 
var data = [{ name: "PROAIR", value: 7}],{ name: "NASONEX", value: 4}] 

和我的圖表構建完美的,所以它只是一個以正確的格式返回SQL數據和更改腳本代碼變種數據的事= R;

編輯工作下面的代碼:

aspx頁面:

$(function() { 
     GetData(); 
    }); 

    function GetData() { 
     $.ajax({ 
      type: "post", 
      url: "D3PieChart.aspx/GetData", 
      contentType: "application/json; charset=utf-8", 
      dataType: "json", 
      success: function (r) { 

       data = r.d; 
       data = jQuery.parseJSON(data) 

-- Build D3 chart commands in this section -- 

      }, 
      error: function (xhr, status, error) { 
       OnFailure(error); 
       alert('Error'); 
      } 
     }); 
    } 

</script> 

VB頁:

<WebMethod()> _ 
Public Shared Function GetData() As String  

    Dim sConnect As String = ConfigurationManager.ConnectionStrings("SQLConnectionString").ConnectionString 
    Dim cn As New SqlConnection(sConnect) 
Dim strSql As String = "SELECT name and a count of stuff " 
strSql += "FROM a bunch of tables WHERE stuff = stuff " 

    Dim dtb As New DataTable 
    cn.Open() 
    If (cn.State And ConnectionState.Open) <> 0 Then 
     Dim sqlCmd As New SqlCommand(strSql, cn) 
     Dim sqlDad As New SqlDataAdapter(sqlCmd) 
     sqlDad.Fill(dtb) 
     dtb.Columns(0).ColumnName = "Name" 
     dtb.Columns(1).ColumnName = "value" 
     Dim sjData As String = GetJson(dtb) 
     Return sjData 
    End If 
    Return -1 
End Function 



Public Shared Function GetJson(ByVal dt As DataTable) As String 
    Dim serializer As New System.Web.Script.Serialization.JavaScriptSerializer() 
    serializer.MaxJsonLength = Integer.MaxValue 

    Dim rows As New List(Of Dictionary(Of String, Object))() 
    Dim row As Dictionary(Of String, Object) = Nothing 
    Dim row2 As Dictionary(Of Integer, Object) = Nothing 
    For Each dr As DataRow In dt.Rows 
     row = New Dictionary(Of String, Object)() 
     row2 = New Dictionary(Of Integer, Object)() 
     For Each dc As DataColumn In dt.Columns 
      row.Add(dc.ColumnName.Trim(), dr(dc)) 
     Next 
     rows.Add(row) 
    Next 
    Return serializer.Serialize(rows) 
End Function 
End Class 

這是一個簡單的圖表,並沒有採取任何參數都是硬編碼的,但它是pulli來自SQL Server數據庫的圖表數據。

+1

你爲什麼不使用json.net? –

+0

什麼是數據? –

+0

@Daniel我是一名新員工,我沒有安裝/引用新模塊的能力,所以我希望能夠使用我已有的功能。 – Dave

回答

4

讓您的SQL結果在數據表,它簡單的傳球給的getJSON方法來獲取JSON字符串。 System.Collections.Generic

Dim da As New OleDb.OleDbDataAdapter(strSql, cn) 
Dim dt As DataTable = New DataTable 
da.Fill(dt) 

Dim sData As string = GetJson(dt) 



Public Shared Function GetJson(ByVal dt As DataTable) As String 
     Dim serializer As New System.Web.Script.Serialization.JavaScriptSerializer() 
     serializer.MaxJsonLength = Integer.MaxValue 

     Dim rows As New List(Of Dictionary(Of String, Object))() 
     Dim row As Dictionary(Of String, Object) = Nothing 
     For Each dr As DataRow In dt.Rows 
      row = New Dictionary(Of String, Object)() 
      For Each dc As DataColumn In dt.Columns 

       row.Add(dc.ColumnName.Trim(), dr(dc)) 

      Next 
      rows.Add(row) 
     Next 
     Return serializer.Serialize(rows) 
    End Function 

添加引用在aspx頁面

success: function (r) { 
var data = r.d; 
+0

我填充的數據表,加入COLUMNNAMES叫你的getJSON功能昏暗SDATA作爲字符串=的getJSON(DT) 返回SDATA – Dave

+0

**跑出來的時間評論**我填充的數據表,加入COLUMNNAMES叫你的getJSON功能昏暗SDATA作爲字符串=的getJSON(DT) 返回SDATA但如果我添加警報(數據)到aspx頁面,我得到[{ 「名稱」: 「PROAIR」, 「值」:7},{ 「名稱」:「NASONEX 「,」價值「:4}]在列的周圍加引號,我沒有得到任何圖表。我需要在aspx頁面砸「掉COLUMNNAMES – Dave

+0

使用jQuery.parseJSON(RD) –

0

我做同樣的事情在我的項目希望這將幫助你:

在我的aspx頁面我使用 -

$.ajax({ 
      ... 
      error: function() { 

      }, 
      success: function (result) { 
       $("#MainContent_EmployeesGridView").find('span[id="MainContent_EmployeesGridView_minIncrease_' + rowNum + '"]').html(result.d[0]); 
       $("#MainContent_EmployeesGridView").find('span[id="MainContent_EmployeesGridView_maxIncrease_' + rowNum + '"]').html(result.d[1]); 
      } 
     }); 

需要注意的重要部分是,我使用的結果。 d [0]在我的gridview中設置html文本值。

因此,對於你的問題它會看起來像:

success: function (r) { 
       var data = r.d[0]; 
       var data2 = r.d[1]; } 

Here's an explanation that I found covering the .d