Mam:
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];
Chcę tylko:
Załóżmy, że obecnie column.DataType.Name ma wartość „Double” . Chcę, aby zmienił się w „Int32” .
Jak to osiągnąć?
c#
types
datacolumn
c#-datatable
rofans91
źródło
źródło
Chociaż prawdą jest, że nie możesz zmienić typu kolumny po
DataTable
wypełnieniu kolumny , możesz ją zmienić po wywołaniuFillSchema
, ale przed sprawdzeniemFill
. Na przykład powiedzmy, że trzecia kolumna to ta, z której chcesz przekonwertowaćdouble
naInt32
, możesz użyć:źródło
Oracle.MangedDataAccess.Client.OracleDataAdapter
za pomocą procedury składowanej. To działa. Dzięki.Stary post, ale pomyślałem, że zważę, z rozszerzeniem DataTable, które może konwertować pojedynczą kolumnę na raz, na dany typ:
Można to wtedy nazwać w ten sposób:
Oczywiście używając dowolnego typu, o ile każda wartość w kolumnie może zostać faktycznie przekonwertowana na nowy typ.
źródło
public static void ConvertColumnType<T>(this DataTable dt, string columnName, TnewType) where T : Type, IConvertible
dr[dc.ColumnName] = dr[columnName] == DBNull.Value ? DBNull.Value : Convert.ChangeType(dr[columnName], newType);
Rozważ także zmianę typu zwracanego:
źródło
źródło
Przyjąłem trochę inne podejście. Musiałem przeanalizować datę i godzinę z importu programu Excel, który był w formacie daty OA. Ta metodologia jest wystarczająco prosta, aby zbudować z ... w istocie,
Usuń oryginalną kolumnę i zmień nazwę na nową, aby pasowała do starej
źródło
Po
DataTable
wypełnieniu nie można zmienić typu kolumny.Najlepszą opcją w tym scenariuszu jest dodanie
Int32
kolumnyDataTable
przed jej wypełnieniem:Następnie możesz sklonować dane z oryginalnej tabeli do nowej tabeli:
Oto post ze szczegółami .
źródło
jeśli chcesz zmienić tylko kolumnę. na przykład z string na int32 możesz użyć właściwości Expression:
źródło
Stworzyłem funkcję rozszerzenia, która umożliwia zmianę typu kolumny DataTable. Zamiast klonować całą tabelę i importować wszystkie dane, po prostu klonuje kolumnę, analizuje wartość, a następnie usuwa oryginał.
Możesz go używać w ten sposób:
Powyższy kod zmienia wszystkie kolumny dziesiętne na podwójne.
źródło
źródło
Połączyłem wydajność rozwiązania Marka - więc nie muszę korzystać
.Clone
z całego DataTable - z rodzajami i rozszerzalnością, dzięki czemu mogę zdefiniować własną funkcję konwersji . Oto, na czym skończyłem:W ten sposób użycie jest znacznie prostsze, a jednocześnie można je dostosować:
źródło
Puedes agregar una columna con tipo de dato distinto, luego copiar los datos y eliminar la columna anterior
źródło