128 votes

Comment changer le type de données d'une colonne de données dans une table de données ?

Je l'ai fait :

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];

Ce que je veux faire, c'est :

Supposons qu'actuellement column.DataType.Name es "Double" . Je veux qu'il devienne "Int32 .

Comment puis-je y parvenir ?

294voto

Akhil Points 4181

Vous ne pouvez pas modifier le DataType une fois que le Datatable est rempli de données. Cependant, vous pouvez cloner la table de données, changer le type de colonne et charger les données de la table de données précédente dans la table clonée comme indiqué ci-dessous.

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

0 votes

J'adore la solution - Élégante ! Cependant, ImportRow() ne semble pas convertir les valeurs de chaîne en valeurs flottantes. Est-ce que quelque chose m'échappe ici ?

3 votes

DataTable.ImportRow() (ou plutôt son stockage sous-jacent) convertit les valeurs en utilisant l'interface IConvertible. Assurez-vous de définir la propriété DataTable.Locale en conséquence ! (la valeur par défaut est CultureInfo.CurrentCulture)

2 votes

Cela ne fonctionne pas. J'essaie de créer une colonne memorystream au lieu d'une colonne byte array. Cela donne System.ArgumentException : Type of value has a mismatch with column typeCouldn't store <System.Byte[]> in DATA Column. Le type attendu est MemoryStream

31voto

rsbarro Points 12575

S'il est vrai que vous ne pouvez pas changer le type de la colonne après l'option DataTable est rempli, vous pouvez le changer après avoir appelé FillSchema mais avant d'appeler Fill . Par exemple, disons que la 3ème colonne est celle que vous voulez convertir de double a Int32 vous pourriez utiliser :

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

1 votes

Notez que cela ne semble pas fonctionner si la commande de votre adaptateur est une procédure stockée.

1 votes

Je l'ai testé sur Oracle.MangedDataAccess.Client.OracleDataAdapter avec une procédure stockée. Cela fonctionne. Merci.

10voto

tsilb Points 4356

Envisagez également de modifier le type de retour :

select cast(columnName as int) columnName from table

8voto

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)

4voto

Josh Earl Points 6462

Une fois qu'un DataTable a été remplie, vous ne pouvez pas changer le type d'une colonne.

Votre meilleure option dans ce scénario est d'ajouter un Int32 à la colonne DataTable avant de le remplir :

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

Vous pouvez ensuite cloner les données de votre tableau original vers le nouveau tableau :

DataTable dataTableClone = dataTable.Clone();

Voici un post avec plus de détails .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X