Нет строки в позиции 0. Необходимо проверить, если количество строк> 0, прежде чем заполнять таблицу и переходить к следующему запросу - PullRequest
0 голосов
/ 15 июля 2011

Я выкладываю верхнюю часть кода. Независимо от того, что я делаю, компилятор говорит, что мне не хватает пространства имен, или я использую метод, подобный классу, или ожидающий 'or ='. Я совершенно новичок в программировании на C #.

Проблема: Запрос проверяет, есть ли люди в вашей сети. Люди с другими в сети, без ошибок. Люди без других в своей сети, ошибка. (Я даже не перебрал сетевой запрос, чтобы заполнить раздел «друзья» в разделе XML, если друзья находятся в их сети)

Спасибо заранее за помощь

<%@ Page language="c#" %>

<script runat="server" language="C#">
        protected void Page_Load(object sender, EventArgs e)
        {
            string xml;
            try
            {
                xml = Auth(Request.Params["uid"].ToString());
            }
            catch (Exception ex)
            {
                xml = ex.Message;
            }
            if (!string.IsNullOrEmpty(xml))
            {
                Response.Clear();
                Response.ExpiresAbsolute = DateTime.Now;
                Response.AddHeader("Content-type", "text/xml");
                Response.Write(xml);
            }
            if (!string.IsNullOrEmpty(xml) || Request.Params["uid"] != string.Empty)
            {
                Response.End();
            }
        }



        protected virtual string Auth(string uid)
        {
            String xml;

            if (!String.IsNullOrEmpty(Request["uid"]))
            {

                System.Data.DataTable dtTable = new System.Data.DataTable();
                System.Data.DataTable memTable = new System.Data.DataTable();
                System.Data.DataTable netTable = new System.Data.DataTable();
                System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(ConfigurationManager.ConnectionStrings["LocalSqlServer"].ConnectionString);
                conn.Open();

                string query = "SELECT userid, username, city, state, country, birthday, img1, userLevelName, gendername, title FROM UserInfo INNER JOIN Gend ON UserInfo.gendID = Gend.gendID INNER JOIN UserLevel ON UserInfo.UserLevelID = UserLevel.UserLevelID WHERE userid='" + Request["uid"] + "'";
                System.Data.SqlClient.SqlDataAdapter adp = new System.Data.SqlClient.SqlDataAdapter(query, conn);
                adp.Fill(dtTable);

                //start of problem is that the next query checks to see if someone is in your network, people with others in network, no error. people without others in their network error

                string query1 = "SELECT MemID FROM network WHERE userid='" + Request["uid"] + "'";
                System.Data.SqlClient.SqlDataAdapter memdp = new System.Data.SqlClient.SqlDataAdapter(query1, conn);
                memdp.Fill(memTable);

                string query2 = "SELECT Distinct userid, username, img1, birthday, gendid, city, state, country, title FROM UserInfo WHERE (userinfo.userid IN (" + memTable.Rows[0]["memid"] + ")) AND userinfo.img1 is not null order by userinfo.username";
                System.Data.SqlClient.SqlDataAdapter netdp = new System.Data.SqlClient.SqlDataAdapter(query2, conn);
                netdp.Fill(netTable);

                //end of problem

                conn.Close();

                xml = string.Format("<login result=\"OK\">" +
                    "<userData>" +
                        "<id><![CDATA[" + dtTable.Rows[0]["userid"] + "]]></id>" +
                        "<name><![CDATA[" + dtTable.Rows[0]["username"] + "]]></name>" +
                        "<gender><![CDATA[" + dtTable.Rows[0]["gendername"] + "]]></gender>" +
                        "<location><![CDATA[" + dtTable.Rows[0]["city"] + "]]>, <![CDATA[" + dtTable.Rows[0]["state"] + "]]>, <![CDATA[" + dtTable.Rows[0]["country"] + "]]></location>" +
                        "<age>22</age>" +
                        "<photo>http://www.somesite.com/thumbnail.asp?path=" + dtTable.Rows[0]["img1"] + "</photo>" +
                        "<thumbnail>http://www.somesite.com/thumbnail.asp?path=" + dtTable.Rows[0]["img1"] + "</thumbnail>" +
                        "<details><![CDATA[" + dtTable.Rows[0]["title"] + "]]></details>" +
                        "<level><![CDATA[" + dtTable.Rows[0]["userlevelname"] + "]]></level>" +
                        "<profileUrl>http://www.somesite.com/" + dtTable.Rows[0]["username"] + "</profileUrl>" +
                    "</userData>" +

                    "<friends>" +
                        "<friend>" +
                            "<id>2</id>" +
                            "<name>Bill</name>" +
                            "<gender>0</gender>" +
                            "<location>London, UK</location>" +
                            "<age>22</age>" +
                            "<photo>http://yourdomain/photos/bill.png</photo>" +
                            "<thumbnail>http://yourdomain/photos/bill_small.png</thumbnail>" +
                            "<details>Hello, I am Bill</details>" +
                            "<level>regular</level>" +
                        "</friend>" +
                    "</friends>" +

Ответы [ 3 ]

3 голосов
/ 15 июля 2011

Ваш первый запрос пустой, это означает, что в memTable нет строк, и вы пытаетесь получить доступ к первой строке при создании второго запроса.

memdp.Fill(memTable);
if(memTable.Rows.Count != 0) //check if table has any rows
{
    string query2 = ...//do other stuff
}
0 голосов
/ 15 июля 2011

Попробуйте это.

protected string Auth(string uid)
{
    string xml = String.Empty;

    if (!String.IsNullOrEmpty(Request["uid"]))
    {
        string query1 = "SELECT userid, username, city, state, country, birthday, img1, userLevelName, gendername, title FROM UserInfo INNER JOIN Gend ON UserInfo.gendID = Gend.gendID INNER JOIN UserLevel ON UserInfo.UserLevelID = UserLevel.UserLevelID WHERE userid='" + Request["uid"] + "'";
        System.Data.DataTable dtTable = FillDataTableFromDB(query1);
        string query2 = "SELECT MemID FROM network WHERE userid='" + Request["uid"] + "'";
        System.Data.DataTable memTable = FillDataTableFromDB(query2);            
        xml = "<login result=\"OK\">" +
            "<userData>" +
                "<id><![CDATA[" + dtTable.Rows[0]["userid"] + "]]></id>" +
                "<name><![CDATA[" + dtTable.Rows[0]["username"] + "]]></name>" +
                "<gender><![CDATA[" + dtTable.Rows[0]["gendername"] + "]]></gender>" +
                "<location><![CDATA[" + dtTable.Rows[0]["city"] + "]]>, <![CDATA[" + dtTable.Rows[0]["state"] + "]]>, <![CDATA[" + dtTable.Rows[0]["country"] + "]]></location>" +
                "<age>22</age>" +
                "<photo>http://www.somesite.com/thumbnail.asp?path=" + dtTable.Rows[0]["img1"] + "</photo>" +
                "<thumbnail>http://www.somesite.com/thumbnail.asp?path=" + dtTable.Rows[0]["img1"] + "</thumbnail>" +
                "<details><![CDATA[" + dtTable.Rows[0]["title"] + "]]></details>" +
                "<level><![CDATA[" + dtTable.Rows[0]["userlevelname"] + "]]></level>" +
                "<profileUrl>http://www.somesite.com/" + dtTable.Rows[0]["username"] + "</profileUrl>" +
            "</userData>";
        if(memTable != null && memTable.Rows.Count >0)
        {

            string query3 = "SELECT Distinct userid, username, img1, birthday, gendid, city, state, country, title FROM UserInfo WHERE (userinfo.userid IN (" + memTable.Rows[0]["memid"] + ")) AND userinfo.img1 is not null order by userinfo.username";
            System.Data.DataTable netTable = FillDataTableFromDB(query3);
            if(netTable != null && netTable.Rows.Count >0)
            {
                xml = "<friends>";

                foreach(System.Data.DataRow row in netTable.Rows)
                {
                    xml = "<friend>" +
                        "<id><![CDATA[" + row["userid"] + "]]></id>" +
                        "<name>Bill</name>" +
                        "<gender>0</gender>" +
                        "<location>London, UK</location>" +
                        "<age>22</age>" +
                        "<photo>http://yourdomain/photos/bill.png</photo>" +
                        "<thumbnail>http://yourdomain/photos/bill_small.png</thumbnail>" +
                        "<details>Hello, I am Bill</details>" +
                        "<level>regular</level>" +
                        "</friend>";
                }
                xml = "</friends>";
            }
        }
    }
    return xml;
}

private System.Data.DataTable FillDataTableFromDB(string query)
{
    System.Data.DataTable datatable = new System.Data.DataTable(); 
    string connString = System.Configuration.ConfigurationManager.ConnectionStrings["LocalSqlServer"].ConnectionString;
    using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(connString))
    {
        using (System.Data.SqlClient.SqlDataAdapter adapter = new System.Data.SqlClient.SqlDataAdapter(query, conn))
        {
            adapter.Fill(datatable);
        }
    }
    return datatable;
}

P.S .: Пожалуйста, не используйте код, подобный тому, что приведен в вашем фрагменте. Functions есть причина. Также есть нечто, называемое StringBuilder. Какой смысл использовать virtual на aspx? Этот код просто решает ошибки. Мне грустно, что вы не предпринимаете серьезных попыток кодирования.

0 голосов
/ 15 июля 2011

Моя первая рекомендация - поместить этот код в файл .aspx.cs (codebehind). Вы не указываете namemace в файле сценария, есть ли какие-либо операторы использования, которые вам не хватает?

е:

using System;

namespace mynamespace
{
    public class MyTestClass : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
        }
    }
}

Надеюсь, это поможет. Не могли бы вы опубликовать точную ошибку, которую вы получаете?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...