2013-03-01 4 views
0

Je suis (nouveau à et) travailler avec une base de données SQL CE qui sera plus tard connectée à un projet où nous envoyons et recevons des informations à un périphérique sur un SerialPort. Cette base de données va stocker des informations sur chaque partie de la communication. Je suis un peu coincé quand il s'agit de mettre à jour un Dataset et de mettre ces données à jour dans la base de données.SQL CE & Dataset - Ligne n'existe pas

data = new DataSet(); 
adapter = new SqlCeDataAdapter("SELECT * FROM " + [table_name]) 
builder = new SqlCeCommandBuilder(adapter); 
adapter.Fill(data, [table_name]); 

data.Tables[table_name].Rows[identity_value][a_column] = a_column_value; 
adapter.Update(data, [table_name]); 

Avant exécuter cette méthode, je suis assurer que j'ai un enregistrement de la table à la valeur d'identité 1. Cependant, je reçois un IndexOutOfRangeException There is no row at position 1 avant d'appeler la adapter.Update(). Je suppose que j'ai mal compris comment utiliser et mettre à jour un jeu de données. Aucun conseil?

J'ai essayé d'examiner le jeu de données avant d'essayer de mettre à jour la ligne, mais le débogueur ne semble pas me laisser scruter l'ensemble de données, est-il possible de le faire?

+0

l'utilisation DataSet n'est pas la façon la plus performante pour accéder Compact – ErikEJ

+0

SQL Server Je pense que vous devez appeler builder.GetInsertCommand(), builder.GetUpdateCommand(), builder.GetDeleteComm et(), avant de tenter de mettre à jour l'adaptateur de données. – Derek

+0

Ce n'était pas ma décision de conception cependant que recommanderiez-vous? –

Répondre

0

essayez ceci:

var rows = data.Tables[table_name].Select(String.Format("[Id] = {0}",identity_value)); 

if (rows.Length == 1) 
{ 
    rows[0][a_column] = a_column_value; 
} 

vous interprétez mal la propriété Rows

data.Tables[table_name].Rows[ROWINDEX][COLUMNINDEX] 

RowIndex est l'index du tableau et non l'identité

Une suggestion:

si vous avez pour utiliser DataSet puis charger le schéma de la table une information aussi avec SqlCeDataAdapter.FillSchema:

adapter.FillSchema(data.Tables[table_name], SchemaType.Mapped); 

adapter.Fill(data, [table_name]); cette charge uniquement les données:

Ensuite, si vous avez au moins une colonne désignée comme une colonne de clé primaire dans le DataTable vous pouvez obtenir la ligne avec DataRowCollection.Find Method:

DataRow foundRow = data.Tables[table_name].Rows.Find(identity_value); 
+0

Merci pour une solution (fonctionne!), Je me demandais si vous pouvez m'expliquer quel est le problème avec mon tentative était? –

+0

@SimonJohnson ajouté dans la réponse – giammin

+0

Il n'y a donc pas de moyen (élégant) de saisir directement une ligne dans un ensemble de données (par le champ d'identité de la ligne) et de modifier certaines données? –