2017-04-04 79 views
0

我有一个存储过程的数据表。我想添加一个名为“Assessment”的列,它将从sql查询中填充。最后,我想用这个数据表填充一个商店。在Visual Studio中我看到,包含 “SITEID” 的数据表中的列被命名为7。但我收到此错误:C#从数据库添加数据表中的列

Load failed:Column '7' does not belong to table .

,代码:

DAL.DBDataContext dc = new DAL.DBDataContext(); 
try 
{ 
    SqlConnection sqlConnection1 = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["DBConnectionString"].ConnectionString); 
    SqlCommand cmd = new SqlCommand(); 
    SqlDataReader sqlreader; 

    cmd.CommandText = "StorProc"; 
    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.Parameters.Add(new SqlParameter("@CTid", ctid)); 

    cmd.Connection = sqlConnection1; 
    sqlConnection1.Open(); 
    sqlreader = cmd.ExecuteReader(); 

    var dt = new DataTable(); 
    dt.Load(sqlreader); 

    //Add assessment column 
    dt.Columns.Add("Assessment", typeof(System.String)); 

    var data = new List<object>(); 
    foreach (DataRow r in dt.Rows) 
    { 
     if (r[7] != null) 
     { 
      var res = (from d in dc.Doctors 
         join ct in dc.CTUsers on d.id equals ct.DoctorId 
         where ct.CTid == ctid && ct.SiteId == Int32.Parse(r["7"].ToString()) 
         select d).FirstOrDefault(); 
      r["Assessment"] = res.Assessment; 
     }      
     data.Add(r); 
    } 

    this.storeSites.DataSource = dt; 
    this.storeSites.DataBind(); 
    sqlConnection1.Close(); 
} 
catch (Exception a) 
{ 
    X.Msg.Alert("Warning", "Load failed:" + a.Message).Show(); 
} 

VisualStudio

+0

r [6]或r [8]是否有效?似乎很奇怪,列名是'7'。 – pookie

+0

如果我在sql服务器中运行存储过程,那么列名称就像“id”等。但是,如果我在Visual Studio中打开ItemArray,我只能看到数字。检查上传的照片 – atroul

+1

本质上,'Int32.Parse(r [“7”]。ToString()'是你的问题,我相信 – pookie

回答

1

请尝试这样的:

foreach (DataRow r in dt.Rows) 
{ 
    foreach(DataColumn column in dt.Columns) 
    { 
    if (r[column] != null && r[column].ColumnName == "some column name") 
    { 
    var res = (from d in dc.Doctors 
    join ct in dc.CTUsers on d.id equals ct.DoctorId 
    where ct.CTid == ctid && ct.SiteId == Int32.Parse(r[column].ToString()) 
    select d).FirstOrDefault(); 
    r["Assessment"] = res.Assessment; 
    }      
    } 
    data.Add(r); 
} 

Int32.Parse(r["7"].ToString()是不正确的。您正在请求一个名为7的列。

我觉得上面的代码更清晰。

编辑

您也可以访问行的列值如下:

r.ItemArray[i].ToString()

像这样:

for (int i = 0; i < dt.Rows.Count; i++) 
{ 
    var r = dt.Rows[i]; 
    var value = r.ItemArray[7].ToString(); 
    if (!String.IsNullOrEmpty(value)) 
    { 
    var res = (from d in dc.Doctors 
    join ct in dc.CTUsers on d.id equals ct.DoctorId 
    where ct.CTid == ctid && ct.SiteId == Int32.Parse(value) 
    select d).FirstOrDefault(); 
    r["Assessment"] = res.Assessment; 
    } 
    data.Add(r); 
} 
+0

但是使用这种方法它将检查所有列以找到等于ct.SiteId对吗?我想检查只有一个特定的一个,以避免任何错误 – atroul

+0

我明白了,你可以不添加到if语句吗?'r [column]!= null && [column] .ColumnName ==“某个列名” ? – pookie

1

的​​一个重载的索引来访问列。

public object this[int columnIndex] { get; set; } 

...其int索引来访问列(这就是我们可以看到你的形象)。您可以通过传递使用它的int

object o = r[7]; // NOT r["7"] ! 

的其他重载

public object this[string columnName] { get; set; } 

...需要为string通过列名:

object o = r["Assessment"]; 

如果列真名为“7”,那么你将不得不像这样访问它:

object o = r["7"]; // But this is wrong in your case! 

请注意,传递给索引的参数的类型会产生差异。所以r[7]r["Assessment"]都适用于你的情况。首选使用名称,因为如果架构或查询更改,索引可能会更改。 r["7"]不起作用,因为没有像这样命名的列。

请参见: