User 7923865 Ответов: 2

Веб-служба не возвращает данные в вызов AJAX


Мне было поручено создать веб-сайт HTML5. Веб-сайт должен будет подключиться к базе данных MS SQL и передать данные из нее на веб-сайт для просмотра пользователем. Мне нужно создать веб-службу, которая подключается к базе данных SQL. Методы, которые я намеревался передать на веб-страницу, чтобы заполнить поле списка и использовать его для заполнения графика данными. Я могу видеть данные с сервера IIS и веб-сайта WSDL. Я могу видеть данные с помощью SOAPUI, если я укажу его на веб-адрес. Однако, когда я запускаю AJAX-скрипт в Javascript, он не возвращает данные. Я озадачен.

Я прикрепил код веб-сервиса, а также код, который я использую в Javascript для вызова веб-службы.

Что я уже пробовал:

using System;
using System.Collections.Generic;
using System.Web;
using System.Data;
using System.Web.Services;
using System.Data.SqlClient;
using System.Web.Script.Serialization;





[WebService(Namespace = "http://tempuri.org/",
    Description = "Database Connection Service",
    Name = "UnivariateWebService")]
//[System.ComponentModel.ToolboxItem(false)]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
 [System.Web.Script.Services.ScriptService]

public class Service : System.Web.Services.WebService
{
    public Service () {

        //Uncomment the following line if using designed components 
        //InitializeComponent(); 
    }

    [WebMethod]
    public DataSet GetBatchData()
    {

        //Modify this connection string to use your SQL Server and log on information.
        var con = new SqlConnection("server=DEVELOPMENT-SER;uid=******;pwd=******;database=UnivariateRuns");

        //Open the Customers table to serve as the parent table.
        var daRunSet = new SqlDataAdapter("Select * From dbo.Products Order By product desc",
            con);

        //Create a client-side DataSet to hold the Customers and Orders tables.
        var ds = new DataSet();

        //Explicitly open the connection to allow explicit closing.
        con.Open();

        //Fill the DataSet with the Customers table and the Orders table.
        daRunSet.Fill(ds, "Batches");
        //string myJsonString = (new JavaScriptSerializer()).Serialize(ds);     // might need to phase the dataset as a string
        //Explicitly close the connection - do not wait for garbage collection.
        con.Close();

        //Return the DataSet to the client.
        return ds;
    }

    [WebMethod]
    public DataSet GetSampleData(string product)
    {
       
        //Modify this connection string to use your SQL Server and log on information.
        var con = new SqlConnection("server=DEVELOPMENT-SER;uid=******;pwd=******;database=UnivariateRuns");

        //Open the Customers table to serve as the parent table.
        var daRunSet = new SqlDataAdapter("Select * From dbo.RunSetData where product like '%" + product + "%' Order by product desc", con);

        //Create a client-side DataSet to hold the Customers and Orders tables.
        var ds=new DataSet();

        //Explicitly open the connection to allow explicit closing.
        con.Open();

        //Fill the DataSet with the Customers table and the Orders table.
        daRunSet.Fill(ds, "RunSet");
        //daOrders.Fill(ds, "Orders");

        //Explicitly close the connection - do not wait for garbage collection.
        con.Close();

        //Return the DataSet to the client.
        return ds;
    }
    
}



Javascript Function:

function DataConnect() {
   		$.ajax({
   			type: 'GET',
   			url: 'http://192.168.1.103/Web%20Service/Service.asmx/GetBatchData',
   			dataType: 'json',
   			contentType: 'application/json;charset=utf-8',
   			success: function(responce) {
   				var names = response.d;
                 alert(names);
            },
   			failure: function(error) {
   				 alert(response.d); 
   			}
   		});
   };

// How do I get the data passed to the Plot Array from the AJAX call?

Richard Deeming

var daRunSet = new SqlDataAdapter("Select * From dbo.RunSetData where product like '%" + product + "%' Order by product desc", con);


Ваш код уязвим для SQL-инъекция[^]. НИКОГДА используйте конкатенацию строк для построения SQL-запроса. ВСЕГДА используйте параметризованный запрос.

Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов | OWASP[^]

var daRunSet = new SqlDataAdapter("Select * From dbo.RunSetData where product like @product Order by product desc", con);
daRunSet.SelectCommand.Parameters.AddWithValue("@product", "%" + product + "%");

ZurdoDev

Я не думаю, что JavaScript может что - то сделать с набором данных. Вам нужно будет jsonify его или вернуть в виде строки.

[no name]

Таким образом, я смог преобразовать один из моих наборов данных в JSON. Но другой набор данных, который использует этот параметр, дает мне систему.Ошибка OutOfMemoryException. Я думаю, что это может быть связано с объемом данных, возвращаемых этим конкретным запросом.

2 Ответов

Рейтинг:
14

User 7923865

using System.Data;
using System.Web.Services;
using System.Data.SqlClient;
using Newtonsoft.Json;


[WebMethod]
    public string GetSampleData(string product)
    {
       
        //Modify this connection string to use your SQL Server and log on information.
        var con = new SqlConnection("server=DEVELOPMENT-SER;uid=*****;pwd=******;database=UnivariateRuns");

        //Open the Customers table to serve as the parent table.
        var daRunSet = new SqlDataAdapter("Select * From dbo.RunSetData where product like @product Order by product desc", con);
        daRunSet.SelectCommand.Parameters.AddWithValue("@product", "%" + product + "%");

        //Create a client-side DataSet to hold the Customers and Orders tables.
        var ds=new DataSet();

        

        //Explicitly open the connection to allow explicit closing.
        con.Open();

        //Fill the DataSet with the Customers table and the Orders table.
        daRunSet.Fill(ds, "RunSet");
        DataTable table = new DataTable();
        DataColumn idColumn = new DataColumn("id", typeof(int));
        idColumn.AutoIncrement = true;

        DataColumn itemColumn = new DataColumn("item");
        table.Columns.Add(idColumn);
        table.Columns.Add(itemColumn);
        ds.Tables.Add(table);

        for (int i = 0; i < 2; i++)
        {
            DataRow newRow = table.NewRow();
            newRow["item"] = "item " + i;
            table.Rows.Add(newRow);
        }

        ds.AcceptChanges();
        string json = JsonConvert.SerializeObject(ds, Formatting.Indented);
        //daOrders.Fill(ds, "Orders");

        //Explicitly close the connection - do not wait for garbage collection.
        con.Close();
        
        //Return the DataSet to the client.
        return json;
    }


Это код, приводящий к исключению из памяти, есть ли лучший способ организовать его?


Рейтинг:
0

User 7923865

возвращался слишком большой из набора данных