2011-07-19 4 views
1

Cela fait quelques jours que je regarde cela et j'ai fait beaucoup de tests mais je n'arrive toujours pas à le faire fonctionner. J'utilise Npgsql 2.0.11.91 (j'ai essayé 2.0.11 aussi) et PostgreSQL 9.04. En utilisant l'exemple du manuel de l'utilisateur pour Npgsql qui peut être trouvé hereErreur de syntaxe Npgsql à ou près de ":"

Recherchez "Travailler avec des ensembles de données .NET" pour voir l'exemple. Cela fonctionne bien pour moi, mais j'essaie de le modifier pour répondre à mes besoins.

Mon code est ci-dessous. Peu importe ce que j'essaie, j'ai une sorte d'erreur. En utilisant le code ci-dessous qui est à peu près exactement ce qui est dans le manuel d'utilisation, je reçois un NpgsqlException a été non gérée par le code utilisateur

ERROR: 42601: syntax error at or near ":". 
private void tryThis() 
{ 
    // This method expects the following table in the backend: 
    // 
    // create table customers(code varchar, reference varchar, description varchar, street varchar, suburb varchar, postcode varchar); 
    // 
    // 

    NpgsqlConnection conn = new NpgsqlConnection("Server=127.0.0.1;Port=5432;User Id=postgres;Password=password;Database=testdatabase;"); 
    conn.Open(); 

    DataSet ds = new DataSet(); 

    NpgsqlDataAdapter da = new NpgsqlDataAdapter("select * from customers", conn); 

    da.InsertCommand = new NpgsqlCommand("insert into customers(code, reference, description, street, suburb, postcode) " + 
           " values (:a, :b, :c, :d, :e, :f)", conn); 

    da.InsertCommand.Parameters.Add(new NpgsqlParameter("a", NpgsqlDbType.Varchar)); 
    da.InsertCommand.Parameters.Add(new NpgsqlParameter("b", NpgsqlDbType.Varchar)); 
    da.InsertCommand.Parameters.Add(new NpgsqlParameter("c", NpgsqlDbType.Varchar)); 
    da.InsertCommand.Parameters.Add(new NpgsqlParameter("e", NpgsqlDbType.Varchar)); 
    da.InsertCommand.Parameters.Add(new NpgsqlParameter("e", NpgsqlDbType.Varchar)); 
    da.InsertCommand.Parameters.Add(new NpgsqlParameter("f", NpgsqlDbType.Varchar)); 

    da.InsertCommand.Parameters[0].Direction = ParameterDirection.Input; 
    da.InsertCommand.Parameters[1].Direction = ParameterDirection.Input; 
    da.InsertCommand.Parameters[2].Direction = ParameterDirection.Input; 
    da.InsertCommand.Parameters[3].Direction = ParameterDirection.Input; 
    da.InsertCommand.Parameters[4].Direction = ParameterDirection.Input; 
    da.InsertCommand.Parameters[5].Direction = ParameterDirection.Input; 

    da.InsertCommand.Parameters[0].SourceColumn = "code"; 
    da.InsertCommand.Parameters[1].SourceColumn = "reference"; 
    da.InsertCommand.Parameters[2].SourceColumn = "description"; 
    da.InsertCommand.Parameters[3].SourceColumn = "street"; 
    da.InsertCommand.Parameters[4].SourceColumn = "suburb"; 
    da.InsertCommand.Parameters[5].SourceColumn = "postcode"; 

    da.Fill(ds); 

    DataTable dt = ds.Tables[0]; 

    DataRow dr = dt.NewRow(); 
    dr["code"] = "CUST1"; 
    dr["reference"] = "C"; 
    dr["description"] = "Customer 1"; 
    dr["street"] = "1 Big Street"; 
    dr["suburb"] = "BRISBANE QLD"; 
    dr["postcode"] = "4000"; 
    dt.Rows.Add(dr); 

    DataSet ds2 = ds.GetChanges(); 

    da.Update(ds2); 

    ds.Merge(ds2); 
    ds.AcceptChanges(); 
} 

Toutes les idées?

Pete.

+0

Utilisation des classes ADO.NET droites, normalement vous spécifiez le nom entier de paramètre (par exemple, si vous mettez '@ id' dans la requête, le nom du paramètre doit être '" @id "', pas '" id "'). Essayez d'ajouter les deux-points aux noms des paramètres? –

Répondre

4

Vous ajoutez le e deux fois param sans ajouter le tout d param ...

EDIT (à partir de votre code ci-dessus):

da.InsertCommand.Parameters.Add(new NpgsqlParameter("e", NpgsqlDbType.Varchar)); 
da.InsertCommand.Parameters.Add(new NpgsqlParameter("e", NpgsqlDbType.Varchar)); 
+1

Wow c'est embarrassant. Merci! Je pense qu'il est temps de faire une pause. – user526549

+1

Il y a 3 façons d'essayer de trouver ce problème. 1. NpgsqlException a une propriété ErrorSql qui vous indique quel sql a donné le problème. 2. Vous pouvez activer la journalisation Npgsql et vérifier quel sql Npgsql envoie au serveur. 3. Vous pouvez activer la journalisation du serveur postgresql et vérifier les requêtes reçues. J'espère que ça aide. –

1

j'eu aussi des problèmes, à la suite de la documentation Npgsql , et obtenir des erreurs lors de la déclaration des paramètres avec les deux points. Il se trouve dans la dernière version, vous pouvez utiliser le style .NET AddWithValue, par exemple,

cmd.Parameters.AddWithValue("@paramName", paramValue); 
Questions connexes