Impossible de convertir l'objet de type 'System.Object [] "type de Système".String[]'
Je suis en train d'élaborer un C# VS 2008 /SQL Server application de site web. Je suis un débutant de ASP.NET. J'obtiens l'erreur ci-dessus, cependant, sur la dernière ligne du code ci-dessous. Pouvez-vous me donner des conseils sur la façon de résoudre ce problème? Cette compile correctement, mais je rencontre cette erreur après l'exécution.
Tout ce que je suis en train de faire est de stocker les éléments de la deuxième ligne de "dt" dans les paramètres de chaîne. La première ligne de l'en-tête, donc je ne veux pas de ces valeurs. La deuxième ligne est la première ligne de valeurs. Ma procédure stockée SQL requiert ces valeurs comme des chaînes de caractères. Je tiens donc à analyser la deuxième ligne de données et de la charge dans les 2 paramètres de la chaîne. J'ai ajouté plus de mon code ci-dessous.
DataTable dt;
Hashtable ht;
string[] SingleRow;
...
SqlConnection conn2 = new SqlConnection(connString);
SqlCommand cmd = conn2.CreateCommand();
cmd.CommandText = "dbo.AppendDataCT";
cmd.Connection = conn2;
SingleRow = (string[])dt.Rows[1].ItemArray;
SqlParameter sqlParam = cmd.Parameters.AddWithValue("@" + ht[0], SingleRow[0]);
sqlParam.SqlDbType = SqlDbType.VarChar;
SqlParameter sqlParam2 = cmd.Parameters.AddWithValue("@" + ht[1], SingleRow[1]);
sqlParam2.SqlDbType = SqlDbType.DateTime;
Mon erreur:
System.InvalidCastException was caught
Message="Unable to cast object of type 'System.Object[]' to type 'System.String[]'."
Source="App_Code.g68pyuml"
StackTrace:
at ADONET_namespace.ADONET_methods.AppendDataCT(DataTable dt, Hashtable ht) in c:\Documents and Settings\Admin\My Documents\Visual Studio 2008\WebSites\Jerry\App_Code\ADONET methods.cs:line 88
InnerException:
OriginalL'auteur salvationishere | 2010-06-06
Vous devez vous connecter pour publier un commentaire.
Hmmm. Vous essayez d'accéder aux propriétés de la DataTable
dt
, mais il semble que vous pourriez attendre de cette table contient les résultats de l'AppendDataCT
requête. Il n'a pas. Soyez prudent avec votre index de ligne d'accès, trop: les Tableaux en C# sont basés sur 0, etdt.Rows[1]
permettra de récupérer les deuxième ligne dans la table.Cela mis à part, l'examen de la documentation pour DataRow.ItemArray. Cette méthode retourne un tableau d'objets, pas un tableau de chaînes de caractères. Même si votre ligne ne contient rien, mais les chaînes, vous êtes toujours aux prises avec un tableau d'objets, et vous aurez à le traiter de cette façon. Vous pouvez lancer chaque personne élément dans la ligne d'une chaîne de caractères, si c'est le bon type de données pour cette colonne:
MODIFIER: Ok, en réponse à votre montage, je vois ce que vous essayez de faire. Il y a beaucoup de façons de le faire, et je serais tout particulièrement recommandons que vous vous éloignez de tables de hachage et vers équivalents génériques comme Dictionnaire - vous vous économiserez beaucoup d'exécution de la coulée de chagrin. Cela dit, voici la plus simple adaptation de votre code:
Vous n'avez pas besoin le "@"; ADO.NET ajouterai que pour vous. L' (string) jette travailler aussi longtemps que il ya une chaîne de caractères à la touche 0 (ce qui est un assez non-standard façon d'utiliser les tables de hachage - vous auriez ont généralement une sorte de descriptif la clé), et si la première colonne de votre datatable contient des chaînes de caractères.
Je vous recommande de regarder typés et générique collections. Le manque de ici votre code un peu fragile.
Il est difficile de vous répondre sans avoir une meilleure compréhension de ce que vous essayez d'accomplir. Cela dit, vous aurez besoin d'instancier votre
SingleRow
objet avant de pouvoir accéder à des propriétés.Pouvez-vous décrire ce que vous essayez d'accomplir, dans l'ensemble? Peut-être que certains pseudo-code de l'aiderait.
Merci, j'ai mis à jour ma description ci-dessus.
Merci pour l'aide, Michael! Je n'ai toujours pas reçu mon code pour l'instant mais je suis encore à apprendre sur le Dictionnaire.
OriginalL'auteur Michael Petrotta
Vous ne pouvez pas jeter un tableau d'objets dans un tableau de chaînes de caractères, vous devez lancer chaque élément dans le tableau, comme chacun de ces éléments doit être cochée que si il peut être moulé. Vous pouvez utiliser le
Cast
méthode:Ce code, je crois, demande Linq, de sorte que vous devez être en utilisant .net 3.5 ou plus et que vous avez de référence Linq et l'utilisation du Système.Linq
OriginalL'auteur Guffa
(vous pouvez également utiliser
Cast<T>().ToArray()
, mais cette approche fonctionne sur plusieurs versions framework, et obtient la matrice de taille correcte dès le départ, plutôt que de redimensionnement)OriginalL'auteur Marc Gravell
Chaque colonne de l'élément de type, qui peut être différente de la Chaîne, donc si vous voulez stocker chaque ligne de la valeur dans un tableau, vous devez le faire un par un avec une boucle, ou avec LINQ (je n'ai pas testé cet extrait mais c'est du boulot):
Les expressions de requête LINQ est un élément de C# 3.0+.
dois-je inclure toute particulière des espaces pour cela?
Système.Linq, si non inclus. Et votre projet doit avoir .net 3.5 ou 4.0 du framework cible.
Merci pour le code, je l'ai fait un peu différent, mais en se basant sur votre exemple. captchaResponse.errorcodes = (à partir de errMsg ((object[])jsonResults["error codes"]) sélectionnez errMsg.ToString()).ToArray();
OriginalL'auteur mamoo
Vous pouvez utiliser LINQ pour que:
Ce convertit chaque élément de la matrice à une chaîne en utilisant les méthodes ToString() et retourne une chaîne vide si l'élément est null.
OriginalL'auteur Oliver Hanappi
Comment à ce sujet: faire
string[] SingleRow
enobject[] SingleRow
, qui permettra à la ligne deexécuter correctement. Par la suite, lorsque vous avez besoin pour accéder à ses valeurs dans un tableau de chaînes de caractères, fonte ou LINQ sélectionner comme ceci:
Assurez-vous d'ajouter le suivant l'usage:
La version de .NET vous aide? Hum... j'ai aussi oublié de mentionner, vous devez les ajouter à l'aide du Système.Linq; using System.Les Collections.Générique;
c'est 3.5 SP1. J'ai ajouté ces "utilisation" des déclarations, mais je suis encore en train d'erreur du compilateur: Le nom de "objectArray" n'existe pas dans le contexte actuel
OriginalL'auteur code4life