не может прочитать несколько строк из sqldatareader - PullRequest
0 голосов
/ 16 апреля 2010

Когда я запрашиваю только одну запись / строку, sqldatareader дает правильный результат, но когда я запрашиваю несколько строк, это дает ошибку на стороне клиента. ниже мой код. подскажите пожалуйста в чем тут проблема.

   [WebMethod]
    public static string SendMessage(string order)
    {
            string Server = "alyeyey";
            string Username = "apjsjsjs";
            string Password = "jjsjsjs";
            string Database = "Amhshshs";

            string ConnectionString = "Data Source=" + Server + ";";
            ConnectionString += "User ID=" + Username + ";";
            ConnectionString += "Password=" + Password + ";";
            ConnectionString += "Initial Catalog=" + Database;
            string query = "select * from optionsRelation where orderNumber = " + order;//+" OR orderNumber = 17";

            DataTable dt = new DataTable();

            Hashtable sendData = new Hashtable();

        try
            {
            using (SqlConnection conn = new SqlConnection(ConnectionString))
            {
                using (SqlCommand cmd = new SqlCommand(query, conn))
                {
                    conn.Open();
                    SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                    dt.Load(dr);
                }
            }

            //Creating StringBuilder array for storing keys
            StringBuilder[] empKeys = new StringBuilder[4];

            for (int i = 0; i < empKeys.Length; i++)
            {
                empKeys[i] = new StringBuilder();
            }

            //Creating stringbuilder array for storing key values
            StringBuilder[] empDetails = new StringBuilder[4];

            for (int i = 0; i < empDetails.Length; i++)
            {
                empDetails[i] = new StringBuilder();
            }

            //putting datatable data to Keys array i-e empKeys and Values array i-e empDetails array
            int inc = 0;
            int j = 0;
            foreach (DataRow dr in dt.Rows)
            {
                foreach (DataColumn dc in dt.Columns)
                {
                    empKeys[inc].Append(dc.ColumnName);
                    inc++;
                }
                foreach (DataColumn dc in dt.Columns)
                {
                    empDetails[j].Append(dr[dc]);
                    j++;
                }
            }

            //mapping keys array and values array in hashtable

            for (int k = 0; k < empKeys.Length; k++)
            {
                sendData.Add(empKeys[k].ToString(), empDetails[k].ToString());
            }
            //sendData.Add("orderNum", order);
            JavaScriptSerializer jss = new JavaScriptSerializer();
            string output = jss.Serialize(sendData);
            return output;
        }
        catch (Exception ex)
        {
            return ex.Message + "-" + ex.StackTrace;
        }
    }
}

Ответы [ 3 ]

0 голосов
/ 16 апреля 2010

ошибка происходит на стороне клиента, но это из-за данных, поступающих со стороны сервера. потому что я проверил отправку различных значений этому клиенту, и он работает нормально с этими значениями. даже когда я использую строку запроса только для одной строки, например "select * from table, где orderNumber = 17", он работает нормально. но выдают ошибку при запросе нескольких строк. и "order" - это строковый параметр, переданный из вызова jquery ajax (и я проверил, что "order" содержит правильную строку, поэтому проблем с этим нет). Я использую массив empKeys и empDetails для хранения значений, которые можно датировать, чтобы преобразовать их в хеш-таблицу, потому что я должен отправлять данные в формате json в javascript и только с хеш-таблицей я успешно сделал это. Ниже весь мой код на стороне сервера:

    using System.Web.UI.WebControls;
using System.Web.Services;
using System.Data;
using System.Text;
using System.Web.Script.Serialization;
using System.Web.Script.Services;
using System.Collections;
using System.Data.SqlClient;

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


    [WebMethod]
    public static string SendMessage(string order)
    {
            string Server = "alyeyey";
            string Username = "apjsjsjs";
            string Password = "jjsjsjs";
            string Database = "Amhshshs";

            string ConnectionString = "Data Source=" + Server + ";";
            ConnectionString += "User ID=" + Username + ";";
            ConnectionString += "Password=" + Password + ";";
            ConnectionString += "Initial Catalog=" + Database;
            string query = "select * from optionsRelation where orderNumber = " + order;//+" OR orderNumber = 17";

            DataTable dt = new DataTable();

            Hashtable sendData = new Hashtable();

        try
            {
            using (SqlConnection conn = new SqlConnection(ConnectionString))
            {
                using (SqlCommand cmd = new SqlCommand(query, conn))
                {
                    conn.Open();
                    SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                    dt.Load(dr);
                }
            }

            //Creating StringBuilder array for storing keys
            StringBuilder[] empKeys = new StringBuilder[4];

            for (int i = 0; i < empKeys.Length; i++)
            {
                empKeys[i] = new StringBuilder();
            }

            //Creating stringbuilder array for storing key values
            StringBuilder[] empDetails = new StringBuilder[4];

            for (int i = 0; i < empDetails.Length; i++)
            {
                empDetails[i] = new StringBuilder();
            }

            //putting datatable data to Keys array i-e empKeys and Values array i-e empDetails array
            int inc = 0;
            int j = 0;
            foreach (DataRow dr in dt.Rows)
            {
                foreach (DataColumn dc in dt.Columns)
                {
                    empKeys[inc].Append(dc.ColumnName);
                    inc++;
                }
                foreach (DataColumn dc in dt.Columns)
                {
                    empDetails[j].Append(dr[dc]);
                    j++;
                }
            }

            //mapping keys array and values array in hashtable

            for (int k = 0; k < empKeys.Length; k++)
            {
                sendData.Add(empKeys[k].ToString(), empDetails[k].ToString());
            }
            //sendData.Add("orderNum", order);
            JavaScriptSerializer jss = new JavaScriptSerializer();
            string output = jss.Serialize(sendData);
            return output;
        }
        catch (Exception ex)
        {
            return ex.Message + "-" + ex.StackTrace;
        }
    }
}
0 голосов
/ 16 апреля 2010

Попробуйте это ... Я думаю, что это все еще имеет неправильный вывод JSON, но это даст вам идею. См. Статью Рика Штраля о преобразовании данных в json . Это немного сложнее, чем мой пример.

            List<Hashtable> sendData = new List<Hashtable>();

            foreach (DataRow dr in dt.Rows)
            {
                foreach (DataColumn dc in dt.Columns)
                {
                    Hashtable ht = new Hashtable();
                    ht.Add(dc.ColumnName, dr[dc].ToString());
                    sendData.Add(ht);
                }
            }
0 голосов
/ 16 апреля 2010

Как то так? Это не решит вашу ошибку на стороне клиента. Он использует параметры вместо конкатенации строк.

    string query = "select * from Customer_Order where orderNumber = @ordernumber";

    DataTable dt = new DataTable();

    using (SqlConnection conn = new SqlConnection(ConnectionString))
    {
        using (SqlCommand cmd = new SqlCommand(query, conn))
        {
            cmd.Parameters.Add(new SqlParameter("ordernumber", ordernumber));
            SqlDataAdapter dr = new SqlDataAdapter(cmd);
            dr.Fill(dt);
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...