2017-09-14 47 views
0

这是我的第一篇文章,我是编程新手。现在,我正在尝试更改DataTable中从sql数据库中获取数据的列名称。使用foreach循环更改列名后,看起来在更改数据表的列名后,程序在将其绑定到gridview后立即崩溃。 the error occurC#Datatable列名更改问题

任何想法是什么导致错误?

C#代码隐藏:

//custom query generator 
Session["query"] = db.generate_query(parameter1, parameter2, parameter3, parameter4); 
//connecting sql 
SqlConnection conn = new SqlConnection("Data Source=USER-PC;Initial Catalog=ISMS;Integrated Security=True"); 
SqlCommand cmd1 = new SqlCommand(Session["query"].ToString(),conn); 
SqlDataAdapter sdal = new SqlDataAdapter(cmd1); 


//when search is needed 
dt_table = new DataTable(); 
sdal.Fill(dt_table); 
// dataTable.Columns["ExistingColumnName"].ColumnName = "regnum"; 
//renaming column in datatable 

foreach (DataColumn dtclm in dt_table.Columns) { 
    dt_table.Columns[dtclm.ToString()].ColumnName = dt_table.Columns[dtclm.ToString()].ColumnName.ToString().Replace("_"," "); 

} 

staff_attendance_gridview.Visible = true; 
staff_attendance_gridview.DataSource = dt_table; 
staff_attendance_gridview.DataBind(); 
result_message.Text = dt_table.Rows.Count.ToString() + " rows in the table"; 

ASPX文件:

<%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="admin_attendance_.aspx.cs" Inherits="ISMS.admin_attendance" %> 
<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server"> 
<!--start container box--> 
<div id="container_box"> 
<div id="text"> 
<asp:Label runat="server" ID="welcome_message" /><br /> 
<br /> 
<!--search bar--> 
<p> 
<br /> 
    Employee ID: <asp:TextBox runat="server" ID="employee_search" Text="" /><br /> 
    <br /> 
    Attendance ID: <asp:TextBox runat="server" ID="attendance_ID_text_box" Text="" /><br /> 
    <br /> 
    fill up both attendance ID and Employee ID and click delete to delete certain record.<br /> 
    <br /> 
<asp:Button ID="search_btn" runat="server" Text="search" OnClick="search_btn_Click" /> 
<asp:Button ID="clock_in_or_out_btn" runat="server" Text="clock in/out" OnClick="clock_in_or_out_btn_Click" /> 
<asp:Button ID="delete_button" runat="server" Text="delete" OnClick="delete_button_Click" /> 
    <br /> 
</p> 
<!--gridview--> 
    <hr /> 
    <br /> 
<div id="gridview"> 
<asp:GridView runat="server" ID="staff_attendance_gridview" OnPageIndexChanging="gridview_PageIndexChanging" AutoGenerateColumns="true" DataKeyNames="Attendance_id" > 
</asp:GridView> 



</div> 
<!--end gridview--> 
<p> 
<!--validator--> 
<asp:RegularExpressionValidator ID="employee_search_validator" runat="server"  
ErrorMessage="Invalid searching citeria. Only exactly 8 numbers is allowed." 
ControlToValidate="employee_search" 
ValidationExpression="^[0-9]{8}$" /><br /> 
<br /> 
</p> 
<br /> 
<!--hyperlink to main menu--> 
<asp:Label runat="server" ID="result_message" /><br /> 
<a href="admin.aspx" >Main menu</a> 
</div>  
</div> 
<!--end container box--> 
</asp:Content> 

Database table structure

+0

您应该避免使用数据表,并学习如何正确的处理[IDisposable接口(https://msdn.microsoft.com/en-us/library/system.idisposable(V = vs.110)。 ASPX)。 – mason

+0

ok注意。这是我第一次听说IDisposable接口,会学到它 – moja

+0

为什么你在会话中存储你的查询? – mason

回答

2

你在你的GridView是指一列Attendance_id的属性。这必须匹配列的更新名称Attendance id

我已更正以下代码,以正确处理IDisposable并删除过于复杂的位。

Session["query"] = db.generate_query(parameter1, parameter2, parameter3, parameter4); 

using(SqlConnection conn = new SqlConnection("Data Source=USER-PC;Initial Catalog=ISMS;Integrated Security=True")) 
{ 
    using(SqlCommand cmd1 = new SqlCommand(Session["query"].ToString(), conn)) 
    { 
     using(SqlDataAdapter sdal = new SqlDataAdapter(cmd1)) 
     { 
      dt_table = new DataTable(); 
      sdal.Fill(dt_table); 
     } 
    } 
} 

foreach (DataColumn column in dt_table.Columns) 
{ 
    column.ColumnName = column.ColumnName.Replace("_", " "); 
} 

staff_attendance_gridview.Visible = true; 
staff_attendance_gridview.DataSource = dt_table; 
staff_attendance_gridview.DataBind(); 
result_message.Text = dt_table.Rows.Count + " rows in the table"; 
+0

@moja如果您在某个地方引用某个您之前重命名的内容时遇到错误,请自己帮忙,并对旧值进行文本搜索,看看它是否在其他地方引用。 – mason

+0

没问题,如果重命名后出现错误,将搜索旧值文本。感谢您的建议 – moja