【问题标题】:cannot read multiple rows from sqldatareader无法从 sqldatareader 读取多行
【发布时间】:2010-04-15 21:09:17
【问题描述】:

当我只查询一个记录/行时,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;
        }
    }
}

【问题讨论】:

  • 请说明您遇到的错误。
  • 浏览器出现错误错误:预期为 ']'
  • 不要使用字符串连接来构建您的查询!而且,是的,我在对你大喊大叫。
  • 如果您在 客户端 遇到错误,那么您需要向我们展示 客户端代码 以便我们提供帮助,而不是服务器代码。

标签: c# asp.net sql sql-server-2008


【解决方案1】:

这样的?但是,这并不能解决您的客户端错误。它确实使用参数而不是字符串连接。

    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);
        }
    }

【讨论】:

  • 可能更像:new SqlParameter("@ordernumber", SqlDbType.Int).Value = ordernumber
  • @Brandi 在我的示例中,SqlDBType 是从对象的 .Net 框架类型推断出来的。我不确定“订单”是什么类型的对象。
【解决方案2】:

客户端发生错误,但这是因为数据来自服务器端。因为我已经检查了向该客户端发送不同的值,并且这些值可以正常工作。即使我只对一行使用查询字符串,例如“从 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;
        }
    }
}

【讨论】:

  • 您的字符串数组包含 4 个值,在您的情况下为 4 个列名。您不能附加到 empKeys[5]...
【解决方案3】:

试试这个...我认为这仍然有错误的 JSON 输出,但它会给你这个想法。请参阅 Rick Strahl 在converting a datatable to 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);
                }
            }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-11
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多