Javascript 从存储过程返回多个值

Javascript 从存储过程返回多个值,javascript,sql-server,Javascript,Sql Server,其思想是每个主题都有多个主题,当我调用函数getTopicsForSubject()以便将此数据发送到网站页面时,它只返回表中的一条记录。我使用JavaScript文件中的console.log(response)来测试它,以查看从存储过程/api连接传入的内容。我认为我需要像读取数组一样读取存储过程传递的内容,尽管我不太确定这是如何完成的 存储过程: USE [Capstone] GO /****** Object: StoredProcedure [dbo].[getTopicsForSu

其思想是每个主题都有多个主题,当我调用函数
getTopicsForSubject()
以便将此数据发送到网站页面时,它只返回表中的一条记录。我使用JavaScript文件中的
console.log(response)
来测试它,以查看从存储过程/api连接传入的内容。我认为我需要像读取数组一样读取存储过程传递的内容,尽管我不太确定这是如何完成的

存储过程:

USE [Capstone]
GO
/****** Object:  StoredProcedure [dbo].[getTopicsForSubject]    Script Date: 2/21/2021 11:30:03 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[getTopicsForSubject]
    @SubjectID int
AS
BEGIN
    select  *
    from    Topic
    where   SubjectID = @SubjectID
    return; 
END
API代码

private static string ExecuteSPGetSubjectsForTopic(string queryString, string subjectID)
{
    string json = "";
    string connectionString = ConfigurationManager.AppSettings["dbconn"].ToString();

    using (SqlConnection conn = new SqlConnection(connectionString))
    {
        conn.Open();

        // 1.  create a command object identifying the stored procedure
        SqlCommand cmd = new SqlCommand(queryString, conn);

        // 2. set the command object so it knows to execute a stored procedure
        cmd.CommandType = CommandType.StoredProcedure;

        // 3. add parameter to command, which will be passed to the stored procedure
        cmd.Parameters.Add(new SqlParameter("@SubjectID", subjectID));

        // execute the command
        using (SqlDataReader rdr = cmd.ExecuteReader())
        {
            // iterate through results, printing each to console
            while (rdr.Read())
            {                    
                json = (string)rdr[0].ToString() + "|" + (string)rdr[1].ToString()+ "|" + (string)rdr[2].ToString() + "|" + (string)rdr[3].ToString();
            }
        }
    }

    return json;
}
JavaScript代码

function getTopicsForSubject()
{       
    var postObj = {
        subjectID: localStorage.getItem('myFutureCurrentSubject')
    };
    console.log(postObj);

    var req = new XMLHttpRequest();
    req.open('POST', 'https://localhost:44303/api/JSON/getTopicsForSubject', true);
    req.setRequestHeader('Content-Type', 'application/json');
    
    req.onreadystatechange = function() { // Call a function when the state changes.
        if (this.readyState === XMLHttpRequest.DONE && this.status === 200) {               
            console.log(req.response);                      
        }
    }
    
    req.send(JSON.stringify(postObj));
    
    return false;       
}

每次读取一行时都要重新初始化JSON变量。试试这个:

json += (string)rdr[0].ToString() + "|" + (string)rdr[1].ToString()+ "|" + (string)rdr[2].ToString() + "|" + (string)rdr[3].ToString();
 List<object[]> topics = new List<object[]>();
 while (rdr.Read())
 {
    object[] row = new object[rdr.FieldCount];
    for (int i = 0; i < rdr.FieldCount; i++)
    {
        row[i] = rdr[i];
    }
    topics.Add(row);
 }
 return Ok(new { Data = topics });
这不是返回数据的正确方法。在JS中,您仍然会将其作为字符串,然后像这样解析它以获得实际值:

var array = req.response.split('|');
for (var i = 0; i < array.length; i++) {
    console.log(array[i]);
}
var array=req.response.split(“|”);
对于(var i=0;i
我建议您通过从API返回HTTP响应而不是字符串来使用适当的方法来处理这些数据。例如,创建一个列表,然后在从读卡器读取时填充该列表并返回。试试这个:

json += (string)rdr[0].ToString() + "|" + (string)rdr[1].ToString()+ "|" + (string)rdr[2].ToString() + "|" + (string)rdr[3].ToString();
 List<object[]> topics = new List<object[]>();
 while (rdr.Read())
 {
    object[] row = new object[rdr.FieldCount];
    for (int i = 0; i < rdr.FieldCount; i++)
    {
        row[i] = rdr[i];
    }
    topics.Add(row);
 }
 return Ok(new { Data = topics });
列表主题=新建列表();
while(rdr.Read())
{
object[]行=新对象[rdr.FieldCount];
对于(int i=0;i
我更喜欢使用SqlDataAdapter将数据填充到数据表中。然后我将序列化datatable,将其传递给Javascript,并在那里对其进行操作。是的,这是更好的方法。我根据他的代码提出了这个解决方案。