C#从数据库中添加数据表中的列

时间:2017-04-04 13:00:57

标签: c# mysql datatable

我有一个存储过程的数据表。我想添加一个名为“Assessment”的列,它将从sql查询中填充。最后,我想用这个数据表填充一个商店。在visual studio中,我看到包含“SiteId”的数据表列名为7.但是我收到此错误:

  

加载失败:列'7'不属于表。

和代码:

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

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:1)

https://datatables.net/有一个重载索引器来访问列。

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"]不起作用,因为没有像这样命名的列。

请参阅: