2017-09-14 1 views
0

이것은 내 첫 번째 게시물이며 프로그래밍에 익숙하지 않습니다. 지금 당장, SQL 데이터베이스에서 데이터를 가져 오는 DataTable의 열 이름을 변경하려고합니다. 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"; 

영문 파일 :

<%@ 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

당신의 DataTable을 사용하지 말고, 제대로 [는 IDisposable] (https://msdn.microsoft.com/en-us/library/system.idisposable (V = vs.110를 처리하는 방법을 배워야한다). aspx). – mason

+0

ok라고 쓰여 있습니다. 이것은 IDisposable Interface를 처음 들었을 때 배울 것입니다. – moja

+0

왜 세션에 쿼리를 저장합니까? – mason

답변

2

당신은 열 Attendance_id을 말한다 당신의 GridView의 속성을 가지고있다. 업데이트 된 컬럼 이름과 일치해야합니다 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