Dynamic Google doughnut chart from sql query data

时间秒杀一切 提交于 2020-01-05 05:44:06

问题


I want to make a Google doughnut chart populated with data from a sql query.

I searched for example code but has not been able to make a chart appear.

Script:

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script type="text/javascript" src="https://www.google.com/jsapi"></script>
<script type="text/javascript">
    // Global variable to hold data
        google.load('visualization', '1', { packages: ['corechart'] });
        google.setOnLoadCallback(DrawDonut);

        $(function DrawDonut() {

            var options = {
                pieHole: 0.4,      
                colors: ['#286090', '#d7d7d7']  
            };

            $.ajax({
                type: 'POST',
                dataType: 'json',
                contentType: 'application/json',
                url: 'Default.aspx/GetChartData',
                data: '{}',
                success:
                    function (response) {
                        drawchart(response.d);
                    },

                    error: function () {
                        alert("Error loading data! Please try again.");
                    }
            });
        })
            function drawchart(dataValues) {
            var data = new google.visualization.DataTable();
            data.addColumn('string', 'UnitID');
            data.addColumn('number', 'TotalUse');
            for (var i = 0; i < dataValues.length; i++) {
                data.addRow([dataValues[i].UnitID, dataValues[i].TotalUse]);
            }
            new google.visualization.PieChart(document.getElementById('chart')).
                draw(data, { title: "Use distributed on units" });
        }    
    </script>

Html:

<div id="chart" style="width: 900px; height: 600px;"></div>

Code behind:

<WebMethod()> 
Public Shared Function GetChartData(ByVal MemberIndex As String) As List(Of Object)
    Dim query As String = "SELECT Log.[UnitID], COUNT(*) As [TotalUse] FROM Log WHERE (MemberIndex_Log = @MemberIndex AND (GramSup1 + GramSup2) > 0 AND Log.[UnitID] > 5000) GROUP BY Log.[UnitID]"
    Dim constr As String = ConfigurationManager.ConnectionStrings("DefaultConnection").ConnectionString
    Dim chartData As List(Of Object) = New List(Of Object)()
    chartData.Add(New Object() {"UnitID", "TotalUse"})
    Using con As SqlConnection = New SqlConnection(constr)
        Using cmd As SqlCommand = New SqlCommand(query)
            cmd.CommandType = CommandType.Text
            cmd.Connection = con
            cmd.Parameters.AddWithValue("@MemberIndex", Convert.ToInt32(HttpContext.Current.Session("MemberIndex")))
            con.Open()
            Using sdr As SqlDataReader = cmd.ExecuteReader()
                While sdr.Read()
                    chartData.Add(New Object() {sdr("UnitID"), sdr("TotalUse")})
                End While
            End Using

           con.Close()
           Return chartData
        End Using
    End Using
End Function

I want a dynamic doughnut chart to appear, showing the use of the units (typically from 2 10 units) distributed on the chart.


回答1:


first, jsapi is an old version of google charts and should no longer be used.

use loader.js instead, note the path...

<script src="https://www.gstatic.com/charts/loader.js"></script>

this will only change the load statement.


next, google charts will wait for the page to load by default.
no need to place your code inside the jquery short-hand document ready function --> $(function () {
placing the DrawDonut function inside the ready function,
takes it out of scope from the google callback.
since it cannot be reached, it does not run.


last, the success & error callbacks on $.ajax have been deprecated,
use the done & fail promises instead.


recommend setup similar to the following snippet...

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script src="https://www.gstatic.com/charts/loader.js"></script>
<script type="text/javascript">
  google.charts.load('current', {
    packages: ['corechart']
  }).then(function () {
    var options = {
      title: 'Use distributed on units',
      pieHole: 0.4,
      colors: ['#286090', '#d7d7d7'],
      width: 900,
      height: 600
    };

    $.ajax({
      type: 'POST',
      dataType: 'json',
      contentType: 'application/json',
      url: 'Default.aspx/GetChartData',
      data: '{}'
    }).done(function (response) {
      drawchart(response.d);
    }).fail(function () {
      console.log('Error loading data! Please try again.');
    });

    function drawchart(dataValues) {
      var data = new google.visualization.DataTable();
      data.addColumn('string', 'UnitID');
      data.addColumn('number', 'TotalUse');
      for (var i = 0; i < dataValues.length; i++) {
        data.addRow([dataValues[i].UnitID, dataValues[i].TotalUse]);
      }
      new google.visualization.PieChart(document.getElementById('chart')).
        draw(data, options);  // <-- use options already defined above
    }
  });
</script>

<div id="chart"></div>

note: you are defining your options object, here...

var options = {
    pieHole: 0.4,      
    colors: ['#286090', '#d7d7d7']  
};

but not using it to draw the chart, here...

draw(data, { title: "Use distributed on units" });


来源:https://stackoverflow.com/questions/54303716/dynamic-google-doughnut-chart-from-sql-query-data

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!