Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2174 connectés 

  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  [C#] [RESOLU] FillSchema et Parameters incompatible ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C#] [RESOLU] FillSchema et Parameters incompatible ?

n°1406039
Arjuna
Aircraft Ident.: F-MBSD
Posté le 13-07-2006 à 01:38:20  profilanswer
 

J'ai un problème...
 
Je fais un select que je récupère dans un DataTable
J'ai besoin de connaître la clé primaire qui se cache derrière la requête, car je vais devoir faire des mises à jour dedans.
FillSchema me donne cette info sans problème, et aussi je peux me servir de CommandBuilder pour créer les commandes d'insertion, suppression et mise à jour.
 
Seulement, dès que me requête a un paramètre (sans toucher au reste de la requête), FillSchema ne rapporte plus de clé, et le sqlDataAdapter n'accepte plus les commandes d'insertion etc.
 
J'ai raté un truc ou y'a un bug dans ADO.NET ?
 
PS : .NET 2.0 (C#), SQL Server 2005 Express, sqlClient


Message édité par Arjuna le 13-07-2006 à 16:26:31
mood
Publicité
Posté le 13-07-2006 à 01:38:20  profilanswer
 

n°1406221
Arjuna
Aircraft Ident.: F-MBSD
Posté le 13-07-2006 à 11:40:39  profilanswer
 

Voici un exemple simple de ce qui déconne :
 
http://magicsite.manga-torii.com/test.aspx
 
Le "case 1", c'est la consultation d'une table (select * from test where 1 = 1), et mise en gras des champs faisant partie de la PK.
Le "case 2", c'est rigoureusement la même chose, mise à part que la requête contient un paramètre (select * from test where @test = 1 avec @test = 1). Plus d'information de PK.
 
De la même façon, si je met un object command dans les "da2.InsertCommand" et autres, ça plantera, alors que pour le da1, je n'ai pas de problème... Moi ça ne me va pas du tout cette histoire :/
 

Code :
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections;
  4. using System.Data;
  5. using System.Data.SqlClient;
  6. using System.IO;
  7. using System.Text;
  8. using System.Web;
  9. using System.Web.Configuration;
  10. using System.Web.UI;
  11. using System.Xml;
  12. using System.Xml.Xsl;
  13. public partial class Default : System.Web.UI.Page
  14. {
  15.     private SqlConnection cnx = new SqlConnection(WebConfigurationManager.OpenWebConfiguration("/" ).ConnectionStrings.ConnectionStrings["LocalSqlServer"].ConnectionString);
  16.     protected void Page_Load(object sender, EventArgs e)
  17.     {
  18.         // HTTP headers
  19.         Response.Expires = 0;
  20.         Response.ContentType = "text/html";
  21.         Response.ContentEncoding = Encoding.UTF8;
  22.         output.Text = string.Empty;
  23.         // ***********************************************************
  24.         // CASE 1
  25.         // ***********************************************************
  26.        
  27.         // Prepare query
  28.         SqlCommand cmd1 = cnx.CreateCommand();
  29.         cmd1.CommandText = "select * from test where 1 = 1";
  30.         cmd1.CommandType = CommandType.Text;
  31.         cmd1.Prepare();
  32.         // Get data
  33.         DataTable dt1 = new DataTable();
  34.         SqlDataAdapter da1 = new SqlDataAdapter(cmd1);
  35.         da1.Fill(dt1);
  36.         da1.FillSchema(dt1, SchemaType.Mapped);
  37.         // Header
  38.         output.Text += "Case 1<br/>Nb cols in PK: " + dt1.PrimaryKey.Length.ToString() + "<br/><table border=\"1\"><tr>";
  39.         foreach (DataColumn col in dt1.Columns)
  40.         {
  41.             output.Text += "<th>" + col.ColumnName + "</th>";
  42.         }
  43.         output.Text += "</th>";
  44.         // Contents
  45.         foreach (DataRow row in dt1.Rows)
  46.         {
  47.             output.Text += "<tr>";
  48.             foreach (DataColumn col in dt1.Columns)
  49.             {
  50.                 bool isPk = false;
  51.                 foreach (DataColumn pk in dt1.PrimaryKey)
  52.                 {
  53.                     if (pk.ColumnName == col.ColumnName)
  54.                     {
  55.                         isPk = true;
  56.                         break;
  57.                     }
  58.                 }
  59.                 if (isPk)
  60.                 {
  61.                     output.Text += "<td><b>" + row[col].ToString() + "</b></td>";
  62.                 }
  63.                 else
  64.                 {
  65.                     output.Text += "<td>" + row[col].ToString() + "</td>";
  66.                 }
  67.             }
  68.             output.Text += "</tr>";
  69.         }
  70.         output.Text += "</table><hr/>";
  71.         // ***********************************************************
  72.         // CASE 2
  73.         // ***********************************************************
  74.         // Prepare query
  75.         cnx.Open();
  76.         SqlCommand cmd2 = cnx.CreateCommand();
  77.         cmd2.CommandText = "select * from test where @test = 1";
  78.         cmd2.CommandType = CommandType.Text;
  79.         SqlParameter paramTest = cmd2.CreateParameter();
  80.         paramTest.DbType = DbType.Decimal;
  81.         paramTest.Direction = ParameterDirection.Input;
  82.         paramTest.IsNullable = false;
  83.         paramTest.ParameterName = "test";
  84.         paramTest.Precision = 9;
  85.         paramTest.Scale = 0;
  86.         paramTest.Size = 28;
  87.         paramTest.Value = 1;
  88.         cmd2.Parameters.Add(paramTest);
  89.         cmd2.Prepare();
  90.         // Get data
  91.         DataTable dt2 = new DataTable();
  92.         SqlDataAdapter da2 = new SqlDataAdapter(cmd2);
  93.         da2.Fill(dt2);
  94.         da2.FillSchema(dt2, SchemaType.Mapped);
  95.         // Header
  96.         output.Text += "Case 2<br/>Nb cols in PK: " + dt2.PrimaryKey.Length.ToString() + "<br/><table border=\"1\"><tr>";
  97.         foreach (DataColumn col in dt2.Columns)
  98.         {
  99.             output.Text += "<th>" + col.ColumnName + "</th>";
  100.         }
  101.         output.Text += "</th>";
  102.         // Contents
  103.         foreach (DataRow row in dt2.Rows)
  104.         {
  105.             output.Text += "<tr>";
  106.             foreach (DataColumn col in dt2.Columns)
  107.             {
  108.                 bool isPk = false;
  109.                 foreach (DataColumn pk in dt2.PrimaryKey)
  110.                 {
  111.                     if (pk.ColumnName == col.ColumnName)
  112.                     {
  113.                         isPk = true;
  114.                         break;
  115.                     }
  116.                 }
  117.                 if (isPk)
  118.                 {
  119.                     output.Text += "<td><b>" + row[col].ToString() + "</b></td>";
  120.                 }
  121.                 else
  122.                 {
  123.                     output.Text += "<td>" + row[col].ToString() + "</td>";
  124.                 }
  125.             }
  126.             output.Text += "</tr>";
  127.         }
  128.         output.Text += "</table><hr/>";
  129.         // Close objetcs and release resources
  130.         dt1.Dispose();
  131.         da1.Dispose();
  132.         cmd1.Dispose();
  133.         dt2.Dispose();
  134.         da2.Dispose();
  135.         cmd2.Dispose();
  136.         // Destroy objects
  137.         dt1 = null;
  138.         da1 = null;
  139.         cmd1 = null;
  140.         dt2 = null;
  141.         da2 = null;
  142.         cmd2 = null;
  143.         // Close connections
  144.         cnx.Close();
  145.         cnx.Dispose();
  146.         cnx = null;
  147.     }
  148. }


Message édité par Arjuna le 13-07-2006 à 11:51:30
n°1406352
Arjuna
Aircraft Ident.: F-MBSD
Posté le 13-07-2006 à 14:26:58  profilanswer
 

Solution temporaire ici :
http://forum.hardware.fr/forum2.ph [...] 0#t1406351
 
Mais c'est vraiment gore :/

n°1406491
Arjuna
Aircraft Ident.: F-MBSD
Posté le 13-07-2006 à 16:12:34  profilanswer
 

Un début de "vraie solution" (merci Fred)

Citation :


Dans ce cas, tu fait une premiere passe bidon pour recuperer la structure de ta table genre :
Select * from table where 1 = 2.
Puis tu fais ta requete en mergeant les 2 dataTables (il te suffit de faire un mapping pour ta seconde requete qui revoie le resultat dans la premiere datatable lue, normalement ca rajoute les donnees sur le fill sans problemes).


 
Ce qui fonctionne en effet.
 
SAUF que je ne peux toujours pas faire de update(), donc c'est cool, j'ai la PK pour retrouver les lignes à modifier, mais une fois que je les ai modifiée, je plante comme un âne à l'enregistrement :sweat:
 
Tiens, je viens d'avoir une idée... I'll be back :D

n°1406509
Arjuna
Aircraft Ident.: F-MBSD
Posté le 13-07-2006 à 16:23:54  profilanswer
 

J'AI TROUVE !!!!!
 
Je suis un génie, un dieu, un un un, y'a pas de mot pour décrire ma grandeur intellectuelle
 
(sisi c'est vrai, faut bien s'envoyer des fleurs de temps en temps, personnes le fait jamais sinon :spamafote:)
 
Donc, la démarche, en reprenant la méthode de Fred :
=> je crée DEUX sqldataadapter et deux datatable avec le schema (et pas de données, grâce à une clause bidon "where null is not null" )
=> je rajoute dans le premier mes données
=> je fais mes modifs dans le premier
=> je crée mes commandes d'insertion, suppression, ajout dans le second
=> je recopie mes données modifiées dans mon second
=> je lance l'update
 
et ça marche !!!
 
tout ça pour contourner un bug de merde dans le framework... merci microsoft :o


Message édité par Arjuna le 13-07-2006 à 16:26:02
n°1416131
Roodie
Posté le 30-07-2006 à 20:23:45  profilanswer
 

T'as oublié de faire un try-catch  :pt1cable:


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  [C#] [RESOLU] FillSchema et Parameters incompatible ?

 

Sujets relatifs
latin_general_ci et pourtant des caractere utf8 apparaissent! [résolu][rèsolu]probleme machine virtuelle
[ASP.NET] [Résolu] Limiter la taille de la textbox d'un boundfield[résolu]modulo en VB
[ resolu] Pb avec un combobox[Résolu]Problème de CSS avec Firefox
[résolu] Insert un peu compliquéEquivalent du system("pause") sous solaris [RESOLU]
[resolu] Initialisation d'un tableau[Résolu] Bug d'IE avec les caractères accentués.
Plus de sujets relatifs à : [C#] [RESOLU] FillSchema et Parameters incompatible ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR