2010-05-11 5 views
2

J'utilise une base de données SQLite et Entity Framework (avec .net framework 3.5). J'essaie d'exécuter une commande SQL sans requête simple pour créer une nouvelle table dans cette base de données. Mon Entity Framework contient déjà le modèle d'objet pour cette table: Je veux juste générer la table correspondante en utilisant une commande.Exécuter une commande SQlite avec Entity Framework

(Soit dit en passant, il y a peut-être une meilleure façon de le faire. Toutes les idées de quelqu'un :)

Mon problème est que je ne suis pas en mesure d'exécuter une commande, même les commandes simples.

Voici mon code:

EntityConnection entityConnection = new EntityConnection(entitiesConnectionString); 
Entities db = new Entities(entityConnection); 

DbCommand command = db.Connection.CreateCommand(); 
command.CommandText ="CREATE TABLE MyTable (Id int NOT NULL, OtherTable_Id nchar(40)   REFERENCES OtherTable (Id) On Delete CASCADE On Update NO ACTION, SomeData nvarchar(1024) NOT NULL, Primary Key(Id));"; 
command.ExecuteNonQuery(); 

Je suis cette erreur:

System.Data.EntitySqlException: The query syntax is not valid., near identifier 'TABLE', line 1, column 8. 
    at System.Data.Common.EntitySql.CqlParser.yyerror(String s) 
    at System.Data.Common.EntitySql.CqlParser.yyparse() 
    at System.Data.Common.EntitySql.CqlParser.Parse(String query) 
    at System.Data.Common.EntitySql.CqlQuery.Parse(String query, ParserOptions parserOptions) 
    at System.Data.Common.EntitySql.CqlQuery.Compile(String query, Perspective perspective, ParserOptions parserOptions, Dictionary`2 parameters, Dictionary`2 variables, Boolean validateTree) 
    at System.Data.EntityClient.EntityCommand.MakeCommandTree() 
    at System.Data.EntityClient.EntityCommand.CreateCommandDefinition() 
    at System.Data.EntityClient.EntityCommand.TryGetEntityCommandDefinitionFromQueryCache(EntityCommandDefinition& entityCommandDefinition) 
    at System.Data.EntityClient.EntityCommand.GetCommandDefinition() 
    at System.Data.EntityClient.EntityCommand.InnerPrepare() 
    at System.Data.EntityClient.EntityCommand.ExecuteReader(CommandBehavior behavior) 
    at System.Data.EntityClient.EntityCommand.ExecuteScalar[T_Result](Func`2 resultSelector) 

Il y a semble être une erreur de syntaxe, mais je ne peux pas où est le problème et comment résoudre il. Le entityConnection est ok parce que je peux utiliser toutes les entités générées avec EF.

J'ai essayé avec une autre commande simple, mais il jette une autre exception:

DbCommand command = db.Connection.CreateCommand(); 
command.CommandText = "SELECT COUNT(Id) From OtherTable;"; 
int result = (int)command.ExecuteScalar(); 

Et je suis arrivé cette erreur, sorcière est pas la même chose, mais peut aider:

System.Data.EntitySqlException: 'Groupe' could not be resolved in the current scope or context. Make sure that all referenced variables are in scope, that required schemas are loaded, and that namespaces are referenced correctly., near simple identifier, line 1, column 23. 
    at System.Data.Common.EntitySql.CqlErrorHelper.ReportIdentifierError(Expr expr, SemanticResolver sr) 
    at System.Data.Common.EntitySql.SemanticAnalyzer.ConvertIdentifier(Expr expr, SemanticResolver sr) 
    at System.Data.Common.EntitySql.SemanticAnalyzer.Convert(Expr astExpr, SemanticResolver sr) 
    at System.Data.Common.EntitySql.SemanticAnalyzer.ProcessAliasedFromClauseItem(AliasExpr aliasedExpr, SemanticResolver sr) 
    at System.Data.Common.EntitySql.SemanticAnalyzer.ProcessFromClauseItem(FromClauseItem fromClauseItem, SemanticResolver sr) 
    at System.Data.Common.EntitySql.SemanticAnalyzer.ProcessFromClause(FromClause fromClause, SemanticResolver sr) 
    at System.Data.Common.EntitySql.SemanticAnalyzer.ConvertQuery(Expr expr, SemanticResolver sr) 
    at System.Data.Common.EntitySql.SemanticAnalyzer.Convert(Expr astExpr, SemanticResolver sr) 
    at System.Data.Common.EntitySql.SemanticAnalyzer.ConvertRootExpression(Expr astExpr, SemanticResolver sr) 
    at System.Data.Common.EntitySql.SemanticAnalyzer.ConvertGeneralExpression(Expr astExpr, SemanticResolver sr) 
    at System.Data.Common.EntitySql.CqlQuery.AnalyzeSemantics(Expr astExpr, Perspective perspective, ParserOptions parserOptions, Dictionary`2 parameters, Dictionary`2 variables) 
    at System.Data.Common.EntitySql.CqlQuery.Compile(String query, Perspective perspective, ParserOptions parserOptions, Dictionary`2 parameters, Dictionary`2 variables, Boolean validateTree) 
    at System.Data.EntityClient.EntityCommand.MakeCommandTree() 
    at System.Data.EntityClient.EntityCommand.CreateCommandDefinition() 
    at System.Data.EntityClient.EntityCommand.TryGetEntityCommandDefinitionFromQueryCache(EntityCommandDefinition& entityCommandDefinition) 
    at System.Data.EntityClient.EntityCommand.GetCommandDefinition() 
    at System.Data.EntityClient.EntityCommand.InnerPrepare() 
    at System.Data.EntityClient.EntityCommand.ExecuteReader(CommandBehavior behavior) 
    at System.Data.EntityClient.EntityCommand.ExecuteScalar[T_Result](Func`2 resultSelector) 

Répondre

2

Je pense que le problème est peut-être que vous utilisez EnitityConnection. Avez-vous essayé d'utiliser OleDbConnection ou OdbcDbConnection?

OdbcDbConnection entityConnection = new OdbcDbConnection(entitiesConnectionString); 
Entities db = new Entities(entityConnection); 

DbCommand command = db.Connection.CreateCommand(); 
command.CommandText ="CREATE TABLE MyTable (Id int NOT NULL, OtherTable_Id nchar(40)   REFERENCES OtherTable (Id) On Delete CASCADE On Update NO ACTION, SomeData nvarchar(1024) NOT NULL, Primary Key(Id));"; 
command.ExecuteNonQuery(); 

Il y a aussi un fournisseur de ADO.Net pour SQLite situé ici: http://sourceforge.net/projects/sqlite-dotnet2/ Je ne l'ai pas utilisé, mais il semble que vous pouvez utiliser:

SQLiteConnection cnn = new SQLiteConnection(entitiesConnectionString); 
0

Pourquoi êtes-vous écrire des commandes SQL sur une collection d'entités? Si vous voulez faire cela, utilisez les composants ADO.NET pour SQLite, sinon utilisez LINQ to Entities pour interroger les données de votre base de données SQLite.

1

Merci pour les réponses de la vôtre, vous avez enregistré mon jour :)

Je voulais limiter le nombre de connexion et j'ai utilisé le EntityConnection actuel pour vérifier la base de données avant d'essayer de le modifier. Mais j'ai essayé ce code et ça marche bien maintenant:

SQLiteConnection connection = new SQLiteConnection(sqliteConnString); 
connection.Open(); 

DataRow[] result = connection.GetSchema("Tables").Select("Table_Name = 'MyTable'"); 
if (result == null || result.Length == 0) 
{     
    SQLiteCommand cmd = new SQLiteCommand(
         "CREATE TABLE MyTable (Id int NOT NULL, OtherTable_Id nchar(40) REFERENCES OtherTable (Id) On Delete CASCADE On Update NO ACTION, SomeData nvarchar(1024) NOT NULL, Primary Key(Id));" 
    , connection); 

    cmd.ExecuteNonQuery(); 
} 

connection.Close(); 
Questions connexes