miss786 Ответов: 2

Как вернуть несколько значений из запроса


В настоящее время я пытаюсь использовать цикл while для своего запроса, но он не возвращает несколько записей. текущий выход, который я получаю, - это одна запись, вместо этого я должен получить в общей сложности 3.

Пожалуйста, посоветуйте, что я могу сделать не так - Большое спасибо.

Как я тестирую запрос:
protected void Page_Load(object sender, EventArgs e)
        {

            string issue = storyURLSF();
            Label1.Text = Server.HtmlEncode(issue);
        }


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

public static string storyURLSF()
        {
            string article = "";
            int publication = 0;
            int issue = 0;
            int storyid = 0;

            SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["##"].ConnectionString);

            string commandtext = "#####";
            SqlCommand command = new SqlCommand(commandtext, con);
            con.Open();
            command.Parameters.Add(new SqlParameter("title", article));
            command.Parameters.Add(new SqlParameter("PUBLICATION_ID", publication));
            command.Parameters.Add(new SqlParameter("ISSUE_ID", issue));
            command.Parameters.Add(new SqlParameter("STORYID", storyid));

            SqlDataReader reader = command.ExecuteReader();

            while (reader.Read())
            {

                string name = reader.GetString(0);
                int pub = reader.GetInt32(1);
                int iss = reader.GetInt32(2);
                int sid = reader.GetInt32(3);

                //convertion to string
                string str = Convert.ToString(pub);
                string iss1 = Convert.ToString(iss);
                string sid1 = Convert.ToString(sid);


                var builder = new UriBuilder("http://www.structuredcreditinvestor.com/Article.asp?");
                builder.Port = -1;
                var query = HttpUtility.ParseQueryString(builder.Query);
                // string nm = System.Web.HttpUtility.UrlPathEncode(name);
                query["article"] = name;
                query["ISS"] = str;
                query["PUB"] = iss1;
                query["SID"] = sid1;
                builder.Query = query.ToString();
                string url = builder.ToString();
                return url;
            }
            return article;
        }

[no name]

Я думаю, что проблема заключается в вашем запросе (comandTex). проверьте запрос, выполнив его в среде sql management studio. если там он возвращает 3, то проблема заключается в этом коде.

F-ES Sitecore

"return url;" - это завершает работу функции и останавливает ваш цикл, так что вы возвращаете только первый url. Если вы хотите вернуть несколько URL-адресов, Вам нужно будет вернуть List<string>, поэтому создайте объект List<string> В начале вашей функции и добавьте url-адрес в список в вашем цикле, а затем верните List<string & gt; После цикла.

Ваша следующая проблема заключается в том, как вы показываете этот список на клиенте, вы не можете его построить, так как список не имеет текстового представления, вам нужно будет что-то сделать, чтобы он нормально отображался на странице, но мы не знаем, что вы в конечном итоге пытаетесь сделать, поэтому трудно предложить решение.

2 Ответов

Рейтинг:
1

Garth J Lancaster

ваша проблема, похоже, заключается в этом

var builder = new UriBuilder("http://www.structuredcreditinvestor.com/Article.asp?");
builder.Port = -1;
var query = HttpUtility.ParseQueryString(builder.Query);
// string nm = System.Web.HttpUtility.UrlPathEncode(name);
query["article"] = name;
query["ISS"] = str;
query["PUB"] = iss1;
query["SID"] = sid1;
builder.Query = query.ToString();
string url = builder.ToString();
return url;


вы перебираете возвращенные данные, но создаете новый объект для возврата каждый раз, а не расширяете/добавляете к данным - следовательно, я почти уверен, что вы увидите данные, возвращаемые как последняя запись, выбранная из базы данных - использование отладчика должно подтвердить это

Я не знаю, какую "методологию" вы используете с этим строителем / запросом - если бы я возвращал строку, я бы инициализировал ее вне цикла while reader.Read() и расширил/добавил к ней внутри цикла - затем, когда цикл будет завершен , я бы вернул всю строку-я не знаю, как это работает/переводится в инструменты, которые вы используете


Рейтинг:
0

Prateek Dalbehera

Привет Мисс 786,


в цикле while вы вызываете "return", поэтому только в первый раз он вернет текущий url-адрес и выйдет из цикла, поэтому он больше не войдет в цикл. вот почему вы не получаете 3 значения.

Кроме того, если вы хотите вернуть 3 значения, то возвращаемый тип метода должен быть строковым массивом или списком, или если его строка, то она должна быть объединена с некоторыми разделителями.

Ниже приведено решение вашей проблемы,

1. строковый массив или список

//public static ArrayList storyURLSF()
public static string[] storyURLSF()
        {
            string article = "";
            string[] articles = new string[3];//if only 3 for sure else use arraylist if it varies
            int count = 0; // to keeep a count to add in array
            ArrayList alArticles = new ArrayList();//if arraylist, then you should change return type
            int publication = 0;
            int issue = 0;
            int storyid = 0;
 
            SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["##"].ConnectionString);
 
            string commandtext = "#####";
            SqlCommand command = new SqlCommand(commandtext, con);
            con.Open();
            command.Parameters.Add(new SqlParameter("title", article));
            command.Parameters.Add(new SqlParameter("PUBLICATION_ID", publication));
            command.Parameters.Add(new SqlParameter("ISSUE_ID", issue));
            command.Parameters.Add(new SqlParameter("STORYID", storyid));
 
            SqlDataReader reader = command.ExecuteReader();
 
            while (reader.Read())
            {
 
                string name = reader.GetString(0);
                int pub = reader.GetInt32(1);
                int iss = reader.GetInt32(2);
                int sid = reader.GetInt32(3);
 
                //convertion to string
                string str = Convert.ToString(pub);
                string iss1 = Convert.ToString(iss);
                string sid1 = Convert.ToString(sid);
 

                var builder = new UriBuilder("http://www.structuredcreditinvestor.com/Article.asp?");
                builder.Port = -1;
                var query = HttpUtility.ParseQueryString(builder.Query);
                // string nm = System.Web.HttpUtility.UrlPathEncode(name);
                query["article"] = name;
                query["ISS"] = str;
                query["PUB"] = iss1;
                query["SID"] = sid1;
                builder.Query = query.ToString();
                string url = builder.ToString();
                //Your mistake here
                //return url;
                //Solution:
		articles[count] = url;//assign & increase count
                 count ++; //increment
		//or if arraylist(which is better if memory is not an issue)
                alArticles.Add(url);
            }
	    //after looping is finished, then only return
            // make sure return type is array or arraylist
            return articles; //if array
	//OR
	return alArticles;

        }


если вам нужен тип возвращаемого значения string, то добавьте каждый url-адрес разделителем и пролейте его для отдельных значений.


Спасибо,
Пратек


RAVI RANJAN OJHA

Очень прямолинейный ответ..