À L'Aide De SQLAdapter.Mise à jour(Dataset) Déclenche une erreur “Pas de clé primaire dans la commande select”
En bref, C# me lance "génération SQL Dynamique pour le UpdateCommand n'est pas prise en charge sur une SelectCommand qui ne renvoie pas les informations de colonne de clé", tandis que le tableau en question N'ont une clé Primaire (Identité, puisque c'est MSSQL).
Mon code est comme suit:
void loaddata()
{
try
{
DS = new DataSet();
sqladapt = new SqlDataAdapter("SELECT servicetag,name,defect,primkey FROM " + Properties.Settings.Default.DBtableLaptops + "", sqlcon);
sqladapt.FillSchema(DS, SchemaType.Source);
sqladapt.Fill(DS);
commandBuilder = new SqlCommandBuilder(sqladapt);
DT = DS.Tables[0];
Laptops_datagridview.DataSource = DT; //I'm using a datagridview to edit the data.
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
void savedata()
{
//Doesn't work yet.
try
{
sqladapt.Update(DS); //<-- Throws the aforementioned error.
sqladapt.Dispose();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
De chargement de données etc fonctionne très bien, l'Ajout de nouvelles lignes fonctionne ainsi, et il le sauve. Mais à chaque fois que je mettre à jour ou supprimer une ligne, il génère l'erreur.
Primkey est ma clé primaire, c'est une auto-incrémentation entier.
J'ai cherché sur google tous les jours, mais en vain, le problème habituel de gens ont, c'est qu'il n'y a pas de clé primaire définie dans la première place, mais ce n'est pas le cas ici.
Toute entrée serait grandement apprécié, j'ai été fusil de chasse de débogage pour comme 6 heures maintenant.
EDIT:
Les instructions de création de la table en question est comme suit:
CREATE TABLE [dbo].[laptopregistratieDB_laptops](
[Servicetag] [text] NOT NULL,
[Name] [text] NOT NULL,
[Defect] [bit] NOT NULL,
[primkey] [int] IDENTITY(1,1) NOT NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
Je n'étais pas au courant, c'était différent, j'ai l'habitude de MySQL, et quand j'ai essayé de créer une base de données de MSSQL il ne fonctionne pas, après quelques recherches sur google j'ai trouvé que j'doivent utiliser 'identificateur' à la place..
OriginalL'auteur Alex | 2011-03-10
Vous devez vous connecter pour publier un commentaire.
Vous devez réellement faire de votre primkey colonne de clé primaire:
Vous pouvez également spécifier une telle contrainte lors de la création d'une table:
ou, si vous voulez SQL Server pour générer aléatoirement le nom de la contrainte (pas recommandé, mais certaines personnes ne le faire):
SQL Server sera également au hasard le nom de la contrainte si vous appliquez une contrainte de clé primaire en utilisant le concepteur de table (clic Droit à côté de la colonne que vous voulez être de la clé primaire, choisissez "Définir la Clé Primaire")
Toutes ces options peuvent également être utilisés pour spécifier plusieurs colonnes de clés primaires, à l'exception de la
[primkey] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY
variante. (Dans le concepteur de scénario, vous devez sélectionner plusieurs lignes avant de les cliquant à droite).OriginalL'auteur Damien_The_Unbeliever
Faites-vous pour avoir une clé primaire dans la table? Si oui, vérifier si la clé primaire est définie ou pas? Vérifiez la propriété
DS.DataTables[0].PrimaryKey
Définir la clé primaire dans la
DataTable
à l'intérieur de laDataSet
. Vous pouvez faire quelque chose comme:Ceci permettra de définir la clé primaire pour la mise à jour.
Si la clé primaire est un champ de texte (par exemple de type NVarChar), peut générer d'erreur si la longueur maxi est (MAX) plutôt que d'un nombre
OriginalL'auteur Kangkan
Erreur en ligne :
" sqladapt = new SqlDataAdapter("SELECT servicetag,name,defect,primkey FROM ...
, Parce que dans votre requête select ne pas inclure un champ de clé primaire ou unique.Vous avez besoin pour réparer votre sélectionnez SQL par l'ajout d'un principal champ dans votre table. Par exemple:
Espérons que cette aide!!!
OriginalL'auteur Quyền Đặng Quang