2010-07-06 5 views
0

J'ai quelques données dans une base de données Microsoft SQL. Je reçois ceux avec un dataadapter et les place dans un ensemble de données. Après cela, je veux changer quelques-unes des valeurs, comme certaines que je veux changer: "Na/Na". Maintenant, le problème est que le type normal de cette colonne est INT. Donc ça me donne une erreur.Problème de type de fichier de données

Existe-t-il un moyen de vérifier que toutes les colonnes ont le type STRING? Ou puis-je m'assurer que le schéma des datatables ne soit pas utilisé, je sais que je pourrais faire toutes les colonnes moi-même en C# et ensuite obtenir les valeurs par une requête, mais ce serait beaucoup de travail.

+0

Avez-vous besoin que cette valeur soit enregistrée dans la base de données, ou en ayez juste besoin pour l'affichage? – Oded

+0

Pensez-vous vraiment que vous devriez le faire? C'est possible et je peux écrire une bonne solution mais je ne le ferai pas. Je vous conseille vraiment de trouver une alternative à ce que vous voulez faire. –

+0

J'ai quelques valeurs que je veux "spec" cela signifie que je veux voir si les valeurs sont dans certaines valeurs. Ensuite, je vais donner à la cellule un vrai ou un faux. C'est juste pour l'affichage, mais après je vais créer de nouvelles bases de données dans la base de données avec seulement des types de chaînes. Et replacez la nouvelle table "specced" dans la base de données. – Julian

Répondre

0

Vous pouvez essayer de cloner DataTable et de modifier les types de données de chaque colonne, comme suggéré dans this après. (Faites défiler à mi-chemin pour la réponse).

L'autre alternative est de changer (ou de créer une) procédure stockée qui récupère vos données et de faire passer les bonnes valeurs de type "Na/Na" que vous voulez.

+0

La première solution sonne bien, je pense que je vais pour celui-là. Je sais que ce que je fais n'est pas 100% comme il se doit. Mais je reçois toutes sortes de valeurs stupides d'une entreprise et j'ai besoin de faire quelque chose de décent. – Julian

0

Est-ce juste une colonne qui vous pose le problème? Vous devez toujours dans la base de données le convertir en nvarchar ou quelque chose avant de l'envoyer au C#. Alors le type de colonne serait une chaîne. Sinon, vous pourriez presque certainement écrire du code qui regarderait les types d'une colonne et s'il trouve des entiers, ajoutez une nouvelle colonne au DataTable et copiez les données. Cela vient dangereusement près de votre suggestion de faire des colonnes pour chacun d'eux même si. Enfin, si vos entiers sont réellement limités à une certaine plage (c'est-à-dire qu'ils sont toujours positifs), vous pouvez utiliser une valeur magique (comme -1) pour représenter N/A, puis dans le code que vous utilisez pour traiter Assurez-vous de reconnaître la valeur magique avant de faire des choses avec.

Je ne pense pas (bien que je serais ravi d'être corrigé) que vous pouvez simplement changer le type d'une colonne et que toutes les valeurs actuelles sont converties automatiquement.

+0

J'ai déjà pensé à votre solution, mais le problème est qu'il y a quelques -1 valeurs dans ces tables, qui peuvent aussi être vraies ou fausses. – Julian

1

Je peux suggérer un moyen mais ce n'est pas parfait. La méthode consiste à convertir des champs en varchar dans une requête ou une procédure stockée. Il vaudra mieux (si possible) que vous apportiez vos changements "Na/Na" sur le côté MS SQL Server dans la procédure stockée.

+0

Cela sonne bien, je veux que le dataadapter mette toutes les valeurs dans l'ensemble de données en tant que type de données. Chaîne. – Julian

0

Travaillez-vous avec un "jeu de données typé", et avez-vous seulement besoin d'afficher "Na/Na" à certaines occasions?

vous pouvez facilement ensuite ajouter une propriété à la classe partielle de votre datatable qui est une chaîne et renvoie simplement ce que vous devez afficher:

public partial class DataSet1 { 
    partial class DataTable1DataTable 
    { 
     public string MyStringColumn { 
      get { 
       return IntColumn <= 0 ? "Na/Na" : IntColumn.ToString(); 
      } 
     } 
    } 
} 
+0

Désolé si vous n'avez pas lu mon commentaire précédent. Mais j'ai aussi besoin de le stocker plus tard. Trouvé autre solution posté ci-dessus qui semble bon, pas la façon la plus «soignée» de le faire, mais oui. – Julian

0

Vous ne pouvez pas changer le DataType d'une colonne après la datatable a été rempli de données. Vous devez donc d'abord définir les données en ajoutant les colonnes en C#. Toutefois, vous pouvez toujours utiliser la commande adapter.Fill, mais en utilisant le deuxième paramètre, pour spécifier le nom du DataTable que vous souhaitez remplir dans l'ensemble de données.

DataSet DS = new DataSet(); 
DataTable DT = new DataTable("Table1"); 
DT.Columns.Add(new DataColumn("column1", typeof(string))); 
DS.Tables.Add(DT); 

adapter.Fill(ds , "Table1"); 
+0

Merci pour l'aide! Regardez l'autre solution que j'ai utilisée, cela fonctionne bien, n'est pas lent pour mes tables et résout le problème. – Julian

Questions connexes