2013-03-07 70 views
2

我想通過Linq在我的數據表上篩選記錄,但不知何故結果是顯示一個沒有錯誤的表,但是在表的一列中有一行表示「行有錯誤」。我的代碼如下: 有什麼建議嗎?linq和數據表的困難

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Data; 
using System.Data.SqlClient; 
using System.Configuration; 
using System.Collections; 


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

      SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["dbcon"].ToString()); 

      con.Open(); 

      SqlCommand sqlcmd = new SqlCommand(); 
      sqlcmd.CommandText = "select * from user_info"; 
      sqlcmd.CommandType = CommandType.Text; 

      sqlcmd.Connection = con; 
      SqlDataReader sqlreader = sqlcmd.ExecuteReader(); 

      DataTable dt = new DataTable(); 
      dt.Columns.Add("first_name", typeof(string)); 
      dt.Columns.Add("last_name", typeof(string)); 
      dt.Columns.Add("Email_ID", typeof(string)); 
      dt.Columns.Add("Contact", typeof(string)); 
      dt.Columns.Add("Address", typeof(string)); 
      dt.Columns.Add("Role", typeof(string)); 


      while (sqlreader.Read()) 
      { 
       DataRow dr = dt.NewRow(); 
       dr["first_name"] = sqlreader["first_name"]; 
       dr["last_name"] = sqlreader["last_name"]; 
       dr["Email_ID"] = sqlreader["email"]; 
       dr["Contact"] = sqlreader["contact1"]; 
       dr["Address"] = sqlreader["address"]; 
       dr["Role"] = sqlreader["role"]; 
       dt.Rows.Add(dr); 
      } 


      var results = from myRow in dt.AsEnumerable() 
          where myRow.Field<string>("Role").ToString() == "admin".ToString() 
          select myRow; 

      //dataGridView1.DataSource = dt; 


      //DataClasses1DataContext dc = new DataClasses1DataContext(); 
      //var admin = from records in dc.GetTable<user_info>() 
      //    where records.role =="admin" 
      //    select records; 
      GridView1.DataSource = results; 
      GridView1.DataBind(); 
     } 
    } 
} 
+0

當你做sqlreader [「列名稱」]它返回一個對象。也許測試它是否爲null或字符串旁邊的其他類型? – 2013-03-07 12:50:32

+0

不,它不是空的。 – 2013-03-07 12:51:36

+0

喲可以嘗試刪除最初在你的LINQ上的位置,看看它是如何工作的。如果這是返回相同的「行有錯誤」消息,這將是因爲您正在拉動數據或構建數據表的方式存在問題。調試,並確保你有你想要的數據形式的數據庫。但正如lazyberezovsky指出的那樣,代碼似乎沒有任何問題。 – 2013-03-07 13:17:43

回答

3

嘗試刪除ToString呼叫。如果角色列中有null,它會拋出異常。並從過濾的行創建新的數據表:

var results = from myRow in dt.AsEnumerable() 
       where myRow.Field<string>("Role") == "admin" 
       select myRow; 

GridView1.DataSource = results.CopyToDataTable(); // create datatable 
GridView1.DataBind(); 

順便說一句爲什麼不使用Linq來實體呢?你將能夠在數據庫端進行過濾。

+0

已經嘗試過!相同的結果。 – 2013-03-07 12:47:14

+0

不,不能做到這一點使用LINQ實體,因爲我必須這樣做,只有這樣做,作業的一部分。 – 2013-03-07 12:50:29

+0

@ankitaalung如果datatable包含數據,那麼你的代碼沒有任何問題 – 2013-03-07 13:02:11