Se connecter / S'enregistrer
Votre question

probleme : La génération SQL dynamique c# asp.net

Tags :
  • Asp
  • OleDbDataAdapter
  • Programmation
Dernière réponse : dans Programmation
9 Mai 2012 01:52:14

bonjour,

dans mon exercice asp avec c# j'utilise un gridview et je veux inserer des donnees dans la base de donnees en mode deconnectéet je veux utiliser le commandbuilder pour economiser le travail :
  1. public void affichage_inserer(string tit, string sold)
  2. {
  3. conn = new OleDbConnection(
  4. @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\admin\Documents\Visual Studio 2010\WebSites\TpCompteModeDeconnecté\App_Data\baseCompte.accdb");
  5.  
  6. OleDbDataAdapter adapter = new OleDbDataAdapter(
  7. "SELECT '' as [id_compte], '' as [titulaire],'' as [solde] from Compte UNION SELECT [id_compte],[titulaire], [solde] FROM [Compte]", conn);
  8. OleDbCommandBuilder builder = new OleDbCommandBuilder(adapter);
  9. builder.QuotePrefix = "[";
  10. builder.QuoteSuffix = "]";
  11.  
  12. DataSet custDS = new DataSet();
  13.  
  14. conn.Open();
  15. adapter.Fill(custDS, "Compte");
  16.  
  17. // Code to modify data in the DataSet here.
  18. DataRow contactRow = custDS.Tables[0].NewRow();
  19. contactRow["titulaire"] = "travail ";
  20. contactRow["solde"] = "10090";
  21. custDS.Tables[0].Rows.Add(contactRow); //Ajoute la nouvelle ligne au dataSet courant
  22.  
  23. // Without the SqlCommandBuilder, this line would fail.
  24. adapter.Update(custDS, "Compte");
  25. conn.Close();
  26. GridView1.DataSource = dsCompte;
  27. GridView1.DataBind();
  28. }

et l'erreur :

La génération SQL dynamique n'est pas prise en charge pour un SelectCommand qui ne retourne pas des informations de table de base.

alors si j'execute le meme code dans un programme c# bureau (pas web) ca marche

est ce que vous avez une idée

merci bien

Autres pages sur : probleme generation sql dynamique asp net

a c 232 L Programmation
9 Mai 2012 08:41:44

Salut,

Essaie sans ta ligne que tu ajoutes manuellement vide (intérêt ?!)
m
0
l
9 Mai 2012 23:29:24

merci mais moi je veux inserer une ligne vide avant les enregistrements afin de l'utiliser pour l'insertion
m
0
l
Contenus similaires
a c 232 L Programmation
9 Mai 2012 23:44:03

il doit y avoir une option pour faire ca directement
m
0
l
11 Mai 2012 07:07:27

bonjour,

j'ai reussi enfin a inserer et modifier avec une methode ou je fais tous a la main

et en ce qui concerne la requette union pour inserer une ligen vide : je l'ai mis dans une methode init et je l'appelle aprres chaque maj
mais maintenant un probleme dans la suppression : voila le code de la methode :

  1. private static void MergeIdentityColumns(OleDbConnection connection, int choix)
  2. {
  3. using (connection)
  4. {
  5.  
  6. // Create a DataAdapter based on a SELECT query.
  7. daCompte = new OleDbDataAdapter(
  8. "SELECT id_compte, titulaire, solde FROM Compte",
  9. connection);
  10. switch (choix)
  11. {
  12. case 0:
  13. {
  14. // Create the INSERT command for the new category.
  15. daCompte.InsertCommand = new OleDbCommand(
  16. "INSERT INTO Compte (titulaire, solde) Values(?,?)", connection);
  17. daCompte.InsertCommand.CommandType = CommandType.Text;
  18.  
  19. // Add the parameter for the titulaire.
  20. daCompte.InsertCommand.Parameters.Add(
  21. "@titulaire", OleDbType.VarWChar, 15, "titulaire");
  22. daCompte.InsertCommand.Parameters.Add(
  23. "@titulaire", OleDbType.Integer, 15, "solde");
  24. daCompte.InsertCommand.UpdatedRowSource = UpdateRowSource.Both;
  25.  
  26. // Create a DataTable
  27. DataTable comptes = new DataTable();
  28.  
  29. // Create the id_compte column and set its auto
  30. // incrementing properties to decrement from zero.
  31. DataColumn column = new DataColumn();
  32. column.DataType = System.Type.GetType("System.Int32");
  33. column.ColumnName = "id_compte";
  34. column.AutoIncrement = true;
  35. column.AutoIncrementSeed = 0;
  36. column.AutoIncrementStep = -1;
  37. comptes.Columns.Add(column);
  38.  
  39. // Create the titulaire column.
  40. column = new DataColumn();
  41. column.DataType = System.Type.GetType("System.String");
  42. column.ColumnName = "titulaire";
  43. comptes.Columns.Add(column);
  44.  
  45. column = new DataColumn();
  46. column.DataType = System.Type.GetType("System.String");
  47. column.ColumnName = "solde";
  48. comptes.Columns.Add(column);
  49.  
  50. // Set the primary key on id_compte.
  51. DataColumn[] pKey = new DataColumn[1];
  52. pKey[0] = comptes.Columns["id_compte"];
  53. comptes.PrimaryKey = pKey;
  54.  
  55. // Fetch the data and fill the DataTable
  56. daCompte.Fill(comptes);
  57.  
  58. // Add a new row.
  59. DataRow newRow = comptes.NewRow();
  60. newRow["titulaire"] = "New Category";
  61. newRow["solde"] = "8894";
  62. comptes.Rows.Add(newRow);
  63.  
  64. // Add another new row.
  65. DataRow newRow2 = comptes.NewRow();
  66. newRow2["titulaire"] = "Another New Category";
  67. newRow2["solde"] = "2324";
  68. comptes.Rows.Add(newRow2);
  69.  
  70. // Add changed rows to a new DataTable that will be
  71. // used to post the inserts to the database.
  72. DataTable dataChanges = comptes.GetChanges();
  73.  
  74. // Include an event to fill in the Autonumber value.
  75. daCompte.RowUpdated +=
  76. new OleDbRowUpdatedEventHandler(OnRowUpdated);
  77.  
  78. // Update the database, inserting the new rows.
  79. daCompte.Update(dataChanges);
  80.  
  81.  
  82. // Merge the two DataTables.
  83. comptes.Merge(dataChanges);
  84.  
  85. // Commit the changes.
  86. comptes.AcceptChanges();
  87.  
  88. //dsCompte.Tables.Remove(dsCompte.Tables[0]);
  89. //dsCompte.Tables.Add(comptes);
  90. } break;
  91. case 1:
  92. {
  93. // Create the INSERT command for the new category.
  94. daCompte.UpdateCommand = new OleDbCommand(
  95. "UPDATE Compte set titulaire = ? , solde = ? where id_compte = 90 ", connection);
  96. daCompte.UpdateCommand.CommandType = CommandType.Text;
  97.  
  98.  
  99. daCompte.UpdateCommand.Parameters.Add(
  100. "@titulaire", OleDbType.VarWChar, 15, "titulaire");
  101. daCompte.UpdateCommand.Parameters.Add(
  102. "@solde", OleDbType.Integer, 15, "solde");
  103. daCompte.UpdateCommand.UpdatedRowSource = UpdateRowSource.Both;
  104.  
  105. // Create a DataTable
  106. DataTable comptes = new DataTable();
  107.  
  108. // Create the id_compte column and set its auto
  109. // incrementing properties to decrement from zero.
  110. DataColumn column = new DataColumn();
  111. column.DataType = System.Type.GetType("System.Int32");
  112. column.ColumnName = "id_compte";
  113. column.AutoIncrement = true;
  114. column.AutoIncrementSeed = 0;
  115. column.AutoIncrementStep = -1;
  116. comptes.Columns.Add(column);
  117.  
  118. // Create the titulaire column.
  119. column = new DataColumn();
  120. column.DataType = System.Type.GetType("System.String");
  121. column.ColumnName = "titulaire";
  122. comptes.Columns.Add(column);
  123.  
  124. column = new DataColumn();
  125. column.DataType = System.Type.GetType("System.String");
  126. column.ColumnName = "solde";
  127. comptes.Columns.Add(column);
  128.  
  129. // Set the primary key on id_compte.
  130. DataColumn[] pKey = new DataColumn[1];
  131. pKey[0] = comptes.Columns["id_compte"];
  132. comptes.PrimaryKey = pKey;
  133.  
  134. // Fetch the data and fill the DataTable
  135. daCompte.Fill(comptes);
  136.  
  137. DataRow contactRow = comptes.Rows.Find("91");
  138. //On signale le début de l'édition de la ligne
  139. contactRow.BeginEdit();
  140.  
  141. contactRow["titulaire"] = "encoreencore";
  142. contactRow["solde"] = "800";
  143. //Fin de l'édition du contactRow
  144. contactRow.EndEdit();
  145. DataTable dataChanges = comptes.GetChanges();
  146.  
  147. // Include an event to fill in the Autonumber value.
  148. daCompte.RowUpdated +=
  149. new OleDbRowUpdatedEventHandler(OnRowUpdated);
  150.  
  151. // Update the database, inserting the new rows.
  152. daCompte.Update(dataChanges);
  153.  
  154.  
  155. // Merge the two DataTables.
  156. comptes.Merge(dataChanges);
  157.  
  158. // Commit the changes.
  159. comptes.AcceptChanges();
  160.  
  161. //dsCompte.Tables.Remove(dsCompte.Tables[0]);
  162. //dsCompte.Tables.Add(comptes);
  163.  
  164. } break;
  165. case 2:
  166. {
  167.  
  168. // Create the INSERT command for the new category.
  169. daCompte.DeleteCommand = new OleDbCommand(
  170. "DELETE FROM Compte WHERE id_compte = 90", connection);
  171. /* daCompte.DeleteCommand.Parameters.Add("@id_compte",
  172.   OleDbType.Char, 5, "id_compte").SourceVersion =
  173.   DataRowVersion.Original;
  174.  
  175.   daCompte.DeleteCommand.CommandType = CommandType.Text;
  176.   */
  177. daCompte.DeleteCommand.UpdatedRowSource = UpdateRowSource.Both;
  178.  
  179. // Create a DataTable
  180. DataTable comptes = new DataTable();
  181.  
  182. // Create the id_compte column and set its auto
  183. // incrementing properties to decrement from zero.
  184. DataColumn column = new DataColumn();
  185. column.DataType = System.Type.GetType("System.Int32");
  186. column.ColumnName = "id_compte";
  187. column.AutoIncrement = true;
  188. column.AutoIncrementSeed = 0;
  189. column.AutoIncrementStep = -1;
  190. comptes.Columns.Add(column);
  191.  
  192. // Create the titulaire column.
  193. column = new DataColumn();
  194. column.DataType = System.Type.GetType("System.String");
  195. column.ColumnName = "titulaire";
  196. comptes.Columns.Add(column);
  197.  
  198. column = new DataColumn();
  199. column.DataType = System.Type.GetType("System.String");
  200. column.ColumnName = "solde";
  201. comptes.Columns.Add(column);
  202.  
  203. // Set the primary key on id_compte.
  204. DataColumn[] pKey = new DataColumn[1];
  205. pKey[0] = comptes.Columns["id_compte"];
  206. comptes.PrimaryKey = pKey;
  207.  
  208. // Fetch the data and fill the DataTable
  209. daCompte.Fill(comptes);
  210.  
  211. DataRow contactRow = comptes.Rows.Find(90);
  212.  
  213. comptes.Rows.Remove(contactRow);
  214. DataTable dataChanges = comptes.GetChanges();
  215.  
  216.  
  217. // Include an event to fill in the Autonumber value.
  218. daCompte.RowUpdated +=
  219. new OleDbRowUpdatedEventHandler(OnRowUpdated);
  220.  
  221. // Update the database, inserting the new rows.
  222. daCompte.Update(comptes);
  223.  
  224.  
  225. // Merge the two DataTables.
  226. comptes.Merge(dataChanges);
  227.  
  228. // Commit the changes.
  229. comptes.AcceptChanges();
  230.  
  231. //dsCompte.Tables.Remove(dsCompte.Tables[0]);
  232. //dsCompte.Tables.Add(comptes);
  233.  
  234. }break;
  235.  
  236. }
  237.  
  238. }
  239. }



et le probleme c'est dans cette ligne : daCompte.Update(dataChanges)

il me dis :

L'argument 'table' ne peut pas être null.
Nom du paramètre : table

sachant que j'ai modifier la table en supprimant une ligne



avez vous une idée ou une rectification du code ou ...

merci bien




m
0
l
a c 232 L Programmation
11 Mai 2012 09:46:01

Si tu pouvais mettre les balises code, que j'ai pas à les rajouter... merci

Pas logique ce que tu me dis.
Tu dis que tu as supprimé une ligne, donc ça devrait passer dans le case 2 si j'ai bien suivi.
Et dans le case 2, tu n'as pas de daCompte.Update(dataChanges)
m
0
l
11 Mai 2012 10:39:28

oui je m'excuse pour les balises code

Et dans le case 2, tu n'as pas de daCompte.Update(dataChanges)

=>tu as raison , je viens de la mettre
alors maintenant l'erreur c'est dans cette ligne que j'ai ajouté :
La valeur ne peut pas être null.
Nom du paramètre : dataTable

merci
m
0
l
a c 232 L Programmation
11 Mai 2012 10:51:56

Je comprends pas bien ce que tu fais là de toute manière avec ton data adapter.
Pourquoi tu recréé une autre table ? Il faut normalement faire un Update avec ta table initiale.

Un exemple rapide en ASP.Net : http://www.softwareexamples.com/ASPNET/Example400/Examp...
Edit: c'est en VB, mais c'est quasiment pareil...

Si on traduit le code VB (j'ai fait ça rapidement, y'a peut être des erreurs):
  1. string sql = "SELECT CustomerNumber, " +
  2. "Name, Address1, Address2, " +
  3. "City, State, Zip, " +
  4. "MTDSales, MTDCosts, YTDSales, CustomerType, [Active] " +
  5. "FROM CustomerMaster " +
  6. "where " +
  7. "CompanyNumber = '" + CompanyNumber + "' " +
  8. "order by CustomerNumber ";
  9.  
  10. string AccessConnect = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\IWS\Data\IWS.mdb";
  11. var conn = new OleDb.OleDbConnection();
  12. conn.ConnectionString = AccessConnect;
  13. conn.Open();
  14.  
  15. var ds = new DataSet();
  16.  
  17. var da = new OleDb.OleDbDataAdapter(sql, conn);
  18. da.Fill(ds, "CustomerMaster");
  19.  
  20. CustomerList.DataSource = ds;
  21. CustomerList.DataBind();
  22.  
  23. // clean up
  24. ds.Dispose();
  25. ds = null;
  26. da.Dispose();
  27. da = null;
  28. conn.Close();
  29. conn = null;
m
0
l
11 Mai 2012 10:57:26

j'ai fait ca comme pour le cas de insert et update mais ca pas marché
maintenant je l'ai supprimé je n'ai dans la case 2 laissé que :
  1. // Create the INSERT command for the new category.
  2. daCompte.DeleteCommand = new OleDbCommand(
  3. "DELETE FROM Compte WHERE id_compte = 94", connection);
  4. /* daCompte.DeleteCommand.Parameters.Add("@id_compte",
  5.   OleDbType.Char, 5, "id_compte").SourceVersion =
  6.   DataRowVersion.Original;
  7.  
  8.   daCompte.DeleteCommand.CommandType = CommandType.Text;
  9.   */
  10. daCompte.DeleteCommand.UpdatedRowSource = UpdateRowSource.Both;
  11.  
  12. // Create a DataTable
  13. DataTable comptes = new DataTable();
  14.  
  15. // Create the id_compte column and set its auto
  16. // incrementing properties to decrement from zero.
  17. DataColumn column = new DataColumn();
  18. column.DataType = System.Type.GetType("System.Int32");
  19. column.ColumnName = "id_compte";
  20. column.AutoIncrement = true;
  21. column.AutoIncrementSeed = 0;
  22. column.AutoIncrementStep = -1;
  23. comptes.Columns.Add(column);
  24.  
  25. // Create the titulaire column.
  26. column = new DataColumn();
  27. column.DataType = System.Type.GetType("System.String");
  28. column.ColumnName = "titulaire";
  29. comptes.Columns.Add(column);
  30.  
  31. column = new DataColumn();
  32. column.DataType = System.Type.GetType("System.String");
  33. column.ColumnName = "solde";
  34. comptes.Columns.Add(column);
  35.  
  36. // Set the primary key on id_compte.
  37. DataColumn[] pKey = new DataColumn[1];
  38. pKey[0] = comptes.Columns["id_compte"];
  39. comptes.PrimaryKey = pKey;
  40.  
  41. // Fetch the data and fill the DataTable
  42. daCompte.Fill(comptes);
  43.  
  44. DataRow contactRow = comptes.Rows.Find(61);
  45. Label myLabel = new Label();
  46. myLabel.Text = "Sample Label avant "+ comptes.Rows.Count;
  47.  
  48. comptes.Rows.Remove(contactRow);
  49. Label myLabel2 = new Label();
  50. myLabel.Text = "Sample Label apres " + comptes.Rows.Count;
  51. DataTable dataChanges = comptes.GetChanges(DataRowState.Deleted);
  52.  
  53.  
  54. // Include an event to fill in the Autonumber value.
  55. daCompte.RowUpdated +=
  56. new OleDbRowUpdatedEventHandler(OnRowUpdated);
  57.  
  58. // Update the database, inserting the new rows.
  59. daCompte.Update(comptes);
  60.  
  61.  
  62. // Merge the two DataTables.
  63. // comptes.Merge(dataChanges);
  64.  
  65. // Commit the changes.
  66. comptes.AcceptChanges();
  67.  
  68. //dsCompte.Tables.Remove(dsCompte.Tables[0]);
  69. //dsCompte.Tables.Add(comptes);


et maintenant aucune erreur et pas de suppression au niveau de a base
m
0
l
a c 232 L Programmation
11 Mai 2012 11:02:23

lis mon édit
m
0
l
11 Mai 2012 11:22:57

mais a quoi ca sert dans mon cas
m
0
l
a c 232 L Programmation
11 Mai 2012 11:29:19

A pas réinventer la roue ?
m
0
l
11 Mai 2012 11:43:07

je viens de trouver la solution
l'astuce c'etait d'utiliser delete au lieu de remove :
voila le code qui marche :
  1. case 2:
  2. {
  3.  
  4. // Create the INSERT command for the new category.
  5. daCompte.DeleteCommand = new OleDbCommand(
  6. "DELETE FROM Compte WHERE id_compte = 218", connection);
  7.  
  8. daCompte.DeleteCommand.UpdatedRowSource = UpdateRowSource.Both;
  9.  
  10. // Create a DataTable
  11. DataTable comptes = new DataTable();
  12.  
  13. // Create the id_compte column and set its auto
  14. // incrementing properties to decrement from zero.
  15. DataColumn column = new DataColumn();
  16. column.DataType = System.Type.GetType("System.Int32");
  17. column.ColumnName = "id_compte";
  18. column.AutoIncrement = true;
  19. column.AutoIncrementSeed = 0;
  20. column.AutoIncrementStep = -1;
  21. comptes.Columns.Add(column);
  22.  
  23. // Create the titulaire column.
  24. column = new DataColumn();
  25. column.DataType = System.Type.GetType("System.String");
  26. column.ColumnName = "titulaire";
  27. comptes.Columns.Add(column);
  28.  
  29. column = new DataColumn();
  30. column.DataType = System.Type.GetType("System.String");
  31. column.ColumnName = "solde";
  32. comptes.Columns.Add(column);
  33.  
  34. // Set the primary key on id_compte.
  35. DataColumn[] pKey = new DataColumn[1];
  36. pKey[0] = comptes.Columns["id_compte"];
  37. comptes.PrimaryKey = pKey;
  38.  
  39. daCompte.Fill(comptes);
  40.  
  41. DataRow contactRow = comptes.Rows.Find(218);
  42. contactRow.Delete();
  43. daCompte.Update(comptes);
  44. comptes.AcceptChanges();
  45. }break;



merci bien et a bientot
m
0
l
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS