2017-04-04 38 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"]不起作用,因爲沒有像這樣命名的列。

請參見: