나는 가지고있다:
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 열은 변환 할 하나라고 double
에 Int32
, 당신은 사용할 수 있습니다 :
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을 구문 분석해야했습니다. 이 방법론은 기본적으로 구축하기에 충분히 간단합니다.
- 원하는 유형의 열 추가
- 값을 변환하는 행을 찢어
-
원래 열을 삭제하고 이전 열과 일치하도록 새 열로 이름을 바꿉니다.
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();