2010-04-15 2 views
0

Когда я запрашиваю только одну запись/строку, sqldatareader дает правильный результат, но когда я запрашиваю несколько строк, это дает ошибку на стороне клиента. ниже мой код. скажите, пожалуйста, в чем проблема.не может читать несколько строк из 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; 
     } 
    } 
} 
+0

Какая ошибка возникает у вас? – Harv

+0

Пожалуйста, уточните причину ошибки. –

+0

ошибка возникает в браузере Ошибка: ожидается ']' – amby

ответ

0

Что-то вроде этого? Однако это не устраняет вашу клиентскую ошибку. Он использует параметры вместо конкатенации строк.

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

может быть больше похоже на: новый SqlParameter ("@ ordernumber", SqlDbType.Int) .Value = порядковый номер – Brandi

+0

@Brandi В моем примере SqlDBType выводится из типа структуры .Net объекта. Я не был уверен, какой тип объекта «заказ» был. – Germ

0

ошибка возникает на стороне клиента, но это из-за данных, поступающих со стороны сервера. потому что я проверил передачу различных значений этому клиенту, и он отлично работает с этими значениями. даже когда я использую строку запроса только для одной строки, например «select * from table where orderNumber = 17», она работает нормально. но дать ошибку во время запроса для нескольких строк. и «order» - это строковый параметр, переданный из jQuery ajax call (и я проверил, что «порядок» содержит правильную строку, поэтому никаких проблем с этим). Я использую empKeys и empDetails массив для хранения данных datatable, чтобы преобразовать их в хеш-таблицу, потому что я должен отправлять данные в 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

Вы строковый массив содержит 4 значения, в вашем случае - 4 имени столбца. Вы не можете добавить empKeys [5] ... – Germ

0

Попробуйте это ... Я думаю, что это все еще имеет неправильный выход JSON, но это даст вам идею. См. Статью Рика Страйля по телефону 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); 
       } 
      } 
Смежные вопросы