2010-01-07 8 views
0

Bonjour: Je m'apprends Linq à Sql en C#. Comme j'utilise une base de données SqlCE, j'ai dû utiliser SqlMetal pour générer le fichier dbml. Cela s'est bien passé et j'ai ajouté le fichier dbml à mon programme. Je ne peux pas savoir comment générer un DataContext pour la base de données, mais je peux interroger la base de données, mais je ne peux pas insérer une ligne. Voici un exemple de ce qui ne fonctionne pas:Problème Linq to Sql

Journal est la base de données, l'exercice est la seule table de la base de données.

string con = Properties.Settings.Default.JournalConnectionString; 
      Journal db = new Journal(con); 

      Exercise ne = new Exercise(); 

      ne.Date = Convert.ToDateTime("2009-10-25T14:35:00"); 
      ne.Length = Convert.ToDouble(3.0); 
      ne.Elapsed = "00:53:35"; 

      db.SubmitChanges(); 

Quelqu'un peut-il suggérer ce que je fais mal avec l'insert? Merci beaucoup.

+0

J'ai couru la commande SQLMetal/code: pour générer le fichier de données par DanThMan, et maintenant je la commande db.Exercise.InsertOnSubmit (ne) disponible, mais je reçois cette erreur: Erreur Les arguments de type pour la méthode 'System.Data.Linq.Table .InsertAllOnSubmit (System.Collections.Generic.IEnumerable )' ne peuvent pas être déduits de l'utilisation. Essayez de spécifier explicitement les arguments de type. Je m'excuse pour mon manque de connaissances, mais tout cela est nouveau pour moi. –

Répondre

2

Vous avez oublié d'ajouter l'enregistrement, à la table.

db.Exercises.InsertOnSubmit(ne); 

Depuis que vous apprenez ce, aussi une bonne idée d'utiliser using

 using(Journal db = new Journal(con)) 
     { 

      Exercise ne = new Exercise(); 

      ne.Date = Convert.ToDateTime("2009-10-25T14:35:00"); 
      ne.Length = Convert.ToDouble(3.0); 
      ne.Elapsed = "00:53:35"; 

      db.Exercises.InsertOnSubmit(ne); //add this line to add rec to table 
      db.SubmitChanges(); 
     } 
+0

J'ai refait les commandes SqlMetal/dbml et/code, et ça a marché. Merci pour la réponse, et le conseil sur l'utilisation. –

2

Vous n'invoquaient DataContext.InsertOnSubmit:

db.Exercises.InsertOnSumbit(ne); 
db.SubmitChanges(); 

Si vous souhaitez insérer plusieurs Exercise de l'utilisation DataContext.InsertAllOnSubmit:

// exercises is IEnumerable<Exercise> 
db.Exercises.InsertAllOnSubmit(exercises); 
db.SubmitChanges(); 
+0

+1 @Jason, je n'oublie pas qu'ils ont changé Add to InsertOnSubmit –

0

Vous devez ajouter la ligne

db.Exercises.InsertOnSubmit(ne); 

avant de faire SubmitChanges.

0

Vous devez indiquer le contexte d'insérer votre objet. Par exemple:

db.Exercises.InsertOnSubmit(ne); 
db.SubmitChanges(); 
0

Pour générer le DataContext, vous devez exécuter deux commandes différentes avec SqlMetal.exe.

Voici un fichier batch que je l'ai utilisé que vous aidera je l'espère à:

set tool_path="C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\sqlmetal" 
set project_root="C:\Documents\...\Solution\Your_Project_Name" 

%tool_path% /server:.\SQLEXPRESS /database:Your_Database_Name /dbml:%project_root%\Models\Your_Dbml_Name.dbml 
if errorlevel 1 goto BuildEventFailed 

%tool_path% /server:.\SQLEXPRESS /database:Your_Database_Name /language:csharp /namespace:Your_Namespace.Models /code:%project_root%\Models\Your_DataContext_Class_Name.cs 
if errorlevel 1 goto BuildEventFailed 

goto BuildEventOK 

:BuildEventFailed 
exit 1 

:BuildEventOK 

Vous devrez modifier .\SQLEXPRESS à la carte à votre serveur de base de données.

Le problème avec votre tentative d'insertion est que vous créez l'objet que vous voulez insérer, mais vous ne demandez pas à LinqToSql de l'insérer. Vous devez appeler InsertOnSubmit() sur votre contexte de données.

+0

Je l'ai fait, mais je n'ai toujours pas de DataContext. Je ne sais pas si c'est à cause du Compact Edition SQL ou quoi. –

1

Peut également vouloir vérifier PLINQO. Il ajoute vraiment beaucoup de fonctionnalités à LINQ to SQL et enlève beaucoup de points de douleur.

http://www.plinqo.com/