#javascript #sql-server
#javascript #sql-сервер
Вопрос:
Идея в том, что каждая тема имеет несколько тем, и когда я вызываю функцию getTopicsForSubject()
, чтобы получить эти данные на страницу веб-сайта, она возвращает только 1 запись из таблицы. Я тестирую это, используя console.log(response)
в файле JavaScript, чтобы увидеть, что передается из соединения хранимая процедура / 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 amp;amp; this.status === 200) {
console.log(req.response);
}
}
req.send(JSON.stringify(postObj));
return false;
}
Ответ №1:
Вы повторно инициализируете свою переменную JSON каждый раз при чтении строки. Попробуйте это:
json = (string)rdr[0].ToString() "|" (string)rdr[1].ToString() "|" (string)rdr[2].ToString() "|" (string)rdr[3].ToString();
Это неправильный способ возврата данных. В JS вы все равно получите это как строку, а затем проанализируете ее следующим образом, чтобы получить фактические значения:
var array = req.response.split('|');
for (var i = 0; i < array.length; i ) {
console.log(array[i]);
}
Я бы посоветовал вам использовать правильный способ обработки этих данных, возвращая HTTP-ответ из API вместо строки. Например. создайте список, а затем заполните его во время чтения из программы чтения и верните его. Попробуйте это:
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 });
Комментарии:
1. Я предпочитаю использовать SqlDataAdapter для заполнения данных в таблицу данных. Затем я бы сериализовал datatable, передал его в Javascript и манипулировал им там.
2. Да, это лучший подход. Я предложил это решение в соответствии с его кодом.