2012-09-05 4 views
1

J'essaie d'utiliser NpgsqlCommandBuilder pour générer automatiquement des commandes SQL pour effectuer des opérations d'insertion/mise à jour/suppression sur un ensemble de données. L'ensemble de données sera lié à une grille de données (que je ne sais pas encore comment faire). Je ne vais donc pas modifier manuellement l'ensemble de données. Lorsque vous essayez de générer automatiquement les commandes SQL, il lancer une exception lorsque vous appelez NpgsqlDataAdaptor.Update()NpgsqlCommandBuilder GetUpdateCommand renvoie l'exception

Voici le schéma de la table db:

tblFee 
{ 
    character(4) dest, 
    character(4) id, 
    character(2) indicator, 
    double fee 
} 
the primary key is (dest, id, indicator) 

Voici mon code:

string m_strConnection = "Server=192.168.253.20;Port=5432;User Id=alex;Password=asdf;Database=mydb;"; 
DataSet m_ds = new DataSet("EcnFeeData"); 
NpgsqlConnection m_conn = new NpgsqlConnection(m_strConnection); 
NpgsqlDataAdapter m_dAdapter = new NpgsqlDataAdapter(); 
m_dAdapter.SelectCommand = new NpgsqlCommand("SELECT * FROM \"tblFee\"", m_conn); 
NpgsqlCommandBuilder builder = new NpgsqlCommandBuilder(m_dAdapter); 

m_conn.Open(); 

m_dAdapter.Fill(m_ds, "tblFee"); 

m_ds.Tables[0].Rows[0]["fee"] = 1; 

builder.GetUpdateCommand(); 

m_dAdapter.Update(m_ds, "tblFee"); 

Cette exception se sont jetés alors que la dernière ligne est en cours d'exécution:

A first chance exception of type 'System.InvalidOperationException' occurred in System.Data.dll 

Additional information: Update requires a valid UpdateCommand when passed DataRow collection with modified rows. 

La même chose se produit lorsque vous essayez d'insérer une ligne, seul le message d'exception est différent:

Additional information: Update requires a valid InsertCommand when passed DataRow collection with new rows. 

Le dernier exemple de code était une tentative d'utiliser la NpgsqlCommandBuilder de la même manière le SqlCommandBuilder est utilisé dans l'exemple qui est fourni par la documentation .NET 4.0. La documentation Npgsql ne fournit pas un exemple pour le faire de cette façon. Cette fonctionnalité n'est-elle pas prise en charge dans NpgsqlCommandBuilder? Je préférerais que NpgsqlCommandBuilder génère automatiquement les commandes sql, mais si cela ne fonctionne pas, je devrai les créer manuellement. Après avoir suivi l'exemple de la documentation de Npgsql pour générer manuellement l'InsertCommand, j'ai réussi à le faire fonctionner, mais je n'ai pas réussi à comprendre comment le faire pour UpdateCommand. Voici le code que j'utilisé pour créer le InsertCommand:

m_dAdapter.InsertCommand = new NpgsqlCommand("insert into \"tblFee\" (dest, id, indicator, fee) values (:a, :b, :c, :d)", m_conn); 
m_dAdapter.InsertCommand.Parameters.Add(new NpgsqlParameter("a", DbType.AnsiStringFixedLength)); 
m_dAdapter.InsertCommand.Parameters.Add(new NpgsqlParameter("b", DbType.AnsiStringFixedLength)); 
m_dAdapter.InsertCommand.Parameters.Add(new NpgsqlParameter("c", DbType.AnsiStringFixedLength)); 
m_dAdapter.InsertCommand.Parameters.Add(new NpgsqlParameter("d", DbType.Double)); 

m_dAdapter.InsertCommand.Parameters[0].Direction = ParameterDirection.Input; 
m_dAdapter.InsertCommand.Parameters[1].Direction = ParameterDirection.Input; 
m_dAdapter.InsertCommand.Parameters[2].Direction = ParameterDirection.Input; 
m_dAdapter.InsertCommand.Parameters[3].Direction = ParameterDirection.Input; 

m_dAdapter.InsertCommand.Parameters[0].SourceColumn = "dest"; 
m_dAdapter.InsertCommand.Parameters[1].SourceColumn = "id"; 
m_dAdapter.InsertCommand.Parameters[2].SourceColumn = "indicator"; 
m_dAdapter.InsertCommand.Parameters[3].SourceColumn = "fee"; 
m_dAdapter.InsertCommand.Connection = m_conn; 

Voici ma tentative de faire UpdateCommand, qui ne fonctionne pas:

m_dAdapter.UpdateCommand = new NpgsqlCommand("update \"tblFee\" set dest = :a, id = :b, indicator = :c, fee = :d where dest = :e and id = :f and indicator = :g"); 
m_dAdapter.UpdateCommand.Parameters.Add(new NpgsqlParameter("a", DbType.AnsiStringFixedLength)); 
m_dAdapter.UpdateCommand.Parameters.Add(new NpgsqlParameter("b", DbType.AnsiStringFixedLength)); 
m_dAdapter.UpdateCommand.Parameters.Add(new NpgsqlParameter("c", DbType.AnsiStringFixedLength)); 
m_dAdapter.UpdateCommand.Parameters.Add(new NpgsqlParameter("d", DbType.Double)); 
m_dAdapter.UpdateCommand.Parameters.Add(new NpgsqlParameter("e", DbType.AnsiStringFixedLength)); 
m_dAdapter.UpdateCommand.Parameters.Add(new NpgsqlParameter("f", DbType.AnsiStringFixedLength)); 
m_dAdapter.UpdateCommand.Parameters.Add(new NpgsqlParameter("g", DbType.AnsiStringFixedLength)); 

m_dAdapter.UpdateCommand.Parameters[0].Direction = ParameterDirection.Input; 
m_dAdapter.UpdateCommand.Parameters[1].Direction = ParameterDirection.Input; 
m_dAdapter.UpdateCommand.Parameters[2].Direction = ParameterDirection.Input; 
m_dAdapter.UpdateCommand.Parameters[3].Direction = ParameterDirection.Input; 
m_dAdapter.UpdateCommand.Parameters[4].Direction = ParameterDirection.Input; 
m_dAdapter.UpdateCommand.Parameters[5].Direction = ParameterDirection.Input; 
m_dAdapter.UpdateCommand.Parameters[6].Direction = ParameterDirection.Input; 

m_dAdapter.UpdateCommand.Parameters[0].SourceColumn = "dest"; 
m_dAdapter.UpdateCommand.Parameters[1].SourceColumn = "id"; 
m_dAdapter.UpdateCommand.Parameters[2].SourceColumn = "indicator"; 
m_dAdapter.UpdateCommand.Parameters[3].SourceColumn = "fee"; 
m_dAdapter.UpdateCommand.Parameters[4].SourceColumn = "dest_orig"; 
m_dAdapter.UpdateCommand.Parameters[5].SourceColumn = "id_orig"; 
m_dAdapter.UpdateCommand.Parameters[6].SourceColumn = "indicator_orig"; 
m_dAdapter.UpdateCommand.Connection = m_conn; 

Toute aide serait grandement appréciée.

Alex

Répondre

0

Pour utiliser le NpgsqlCommandBuilder vous devez:

m_dAdapter.InsertCommand = builder.GetInsertCommand(m_ds.Tables[0].Rows[0]); 
m_dAdapter.UpdateCommand = builder.GetUpdateCommand(m_ds.Tables[0].Rows[0]); 
m_dAdapter.DeleteCommand = builder.GetDeleteCommand(m_ds.Tables[0].Rows[0]); 

Essayez et laissez-nous savoir si cela fonctionne pour vous. En fait, je ne sais pas pourquoi SqlCommandBuilder fonctionne pour vous si vous n'indiquez pas à quelle carte associer les commandes.

Questions connexes