[C#] DataTable에서 DataColumn의 DataType을 변경하는 방법은 무엇입니까?

나는 가지고있다:

DataTable Table = new DataTable;
SqlConnection = new System.Data.SqlClient.SqlConnection("Data Source=" + ServerName + ";Initial Catalog=" + DatabaseName + ";Integrated Security=SSPI; Connect Timeout=120");

SqlDataAdapter adapter = new SqlDataAdapter("Select * from " + TableName, Connection);
adapter.FillSchema(Table, SchemaType.Source);
adapter.Fill(Table);

DataColumn column = DataTable.Columns[0];

내가하고 싶은 것은 :

현재 column.DataType.Name“Double” 이라고 가정합니다 . 나는 그것이 “Int32” 가되기를 원한다 .

어떻게해야합니까?



답변

Datatable이 데이터로 채워진 후에는 DataType을 변경할 수 없습니다. 그러나 아래와 같이 데이터 테이블을 복제하고 컬럼 유형을 변경하고 이전 데이터 테이블에서 복제 된 테이블로 데이터를로드 할 수 있습니다.

DataTable dtCloned = dt.Clone();
dtCloned.Columns[0].DataType = typeof(Int32);
foreach (DataRow row in dt.Rows)
{
    dtCloned.ImportRow(row);
}


답변

DataTable를 채운 후에는 열 유형을 변경할 수 없지만 을 호출 한 후를 호출 FillSchema하기 전에 변경할 수 있습니다 Fill. 예를 들어, 3 열은 변환 할 하나라고 doubleInt32, 당신은 사용할 수 있습니다 :

adapter.FillSchema(table, SchemaType.Source);
table.Columns[2].DataType = typeof (Int32);
adapter.Fill(table);


답변

이전 게시물이지만 한 번에 하나의 열을 주어진 유형으로 변환 할 수있는 DataTable 확장을 사용하여 고려할 것이라고 생각했습니다.

public static class DataTableExt
{
    public static void ConvertColumnType(this DataTable dt, string columnName, Type newType)
    {
        using (DataColumn dc = new DataColumn(columnName + "_new", newType))
        {
            // Add the new column which has the new type, and move it to the ordinal of the old column
            int ordinal = dt.Columns[columnName].Ordinal;
            dt.Columns.Add(dc);
            dc.SetOrdinal(ordinal);

            // Get and convert the values of the old column, and insert them into the new
            foreach (DataRow dr in dt.Rows)
                dr[dc.ColumnName] = Convert.ChangeType(dr[columnName], newType);

            // Remove the old column
            dt.Columns.Remove(columnName);

            // Give the new column the old column's name
            dc.ColumnName = columnName;
        }
    }
}

그런 다음 다음과 같이 호출 할 수 있습니다.

MyTable.ConvertColumnType("MyColumnName", typeof(int));

물론 열의 각 값을 실제로 새 유형으로 변환 할 수있는 한 원하는 유형을 사용합니다.


답변

반환 유형 변경도 고려하십시오.

select cast(columnName as int) columnName from table


답변

Dim tblReady1 As DataTable = tblReady.Clone()

'' convert all the columns type to String
For Each col As DataColumn In tblReady1.Columns
  col.DataType = GetType(String)
Next

tblReady1.Load(tblReady.CreateDataReader)


답변

나는 약간 다른 접근 방식을 취했습니다. OA 날짜 형식의 Excel 가져 오기에서 datetime을 구문 분석해야했습니다. 이 방법론은 기본적으로 구축하기에 충분히 간단합니다.

  1. 원하는 유형의 열 추가
  2. 값을 변환하는 행을 찢어
  3. 원래 열을 삭제하고 이전 열과 일치하도록 새 열로 이름을 바꿉니다.

    private void ChangeColumnType(System.Data.DataTable dt, string p, Type type){
            dt.Columns.Add(p + "_new", type);
            foreach (System.Data.DataRow dr in dt.Rows)
            {   // Will need switch Case for others if Date is not the only one.
                dr[p + "_new"] =DateTime.FromOADate(double.Parse(dr[p].ToString())); // dr[p].ToString();
            }
            dt.Columns.Remove(p);
            dt.Columns[p + "_new"].ColumnName = p;
        }

답변

DataTable가 채워 지면 열 유형을 변경할 수 없습니다.

이 시나리오에서 가장 좋은 방법은 채우기 전에에 Int32열을 추가하는 DataTable것입니다.

dataTable = new DataTable("Contact");
dataColumn = new DataColumn("Id");
dataColumn.DataType = typeof(Int32);
dataTable.Columns.Add(dataColumn);

그런 다음 원본 테이블의 데이터를 새 테이블로 복제 할 수 있습니다.

DataTable dataTableClone = dataTable.Clone();

자세한 내용 은 다음과 같은 게시물입니다 .