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

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [SQL Server 2005] Procédure stockée dynamique ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[SQL Server 2005] Procédure stockée dynamique ?

n°1493301
kramik
Posté le 19-12-2006 à 11:56:14  profilanswer
 

Bonjour à tous,
j'ai un petit soucis que je n'arrive actuellement pas à résoudre.
 
Je dois faire un simple SELECT sur une table. Le problème, c'est que je ne connais pas à l'avance les colonnes de mon SELECT.
 
Je programme en C# et dans mon fichier config il y a une clé qui me donne le nom des champs de mon SELECT, par exemple LastName.FirstName ou LastName.Email, ...
 
J'utilise des procédures stockées, donc je ne sais pas comment je peux faire pour modifier celle-ci dynamiquement.
 
On m'a dit d'utiliser EXEC, mais je ne sais trop comment.
 
Pouvez-vous m'aider ?  :sweat:

mood
Publicité
Posté le 19-12-2006 à 11:56:14  profilanswer
 

n°1493326
MagicBuzz
Posté le 19-12-2006 à 12:30:36  profilanswer
 

C'est quoi ton problème exactement ?
 
SELECT * FROM cequetuveux
 
Pas besoin de connaître les colonnes :??:
 
(bon, ok, c'est goret et j'ai tendance à découper en rondelles ceux qui font des * à tout bout de champ, mais là...)

n°1493328
kramik
Posté le 19-12-2006 à 12:32:40  profilanswer
 

Ben en fait j'en ai aussi besoin pour un UPDATE.
Donc tu peux toujours essayer de faire un
 
UPDATE Users
SET * = ...
 
Mais j'ai trouvé.
 
J'ai fait comme ceci:
 
CREATE PROC [dbo].[SelectUsersTest]  
@ProcedureQuery VARCHAR(100)
AS
DECLARE @sql nvarchar(100)
SET @sql=@ProcedureQuery
EXEC dbo.sp_executesql @sql

n°1493330
MagicBuzz
Posté le 19-12-2006 à 12:39:02  profilanswer
 

ah ouais... c'est encore plus gore que ce que j'imaginais :D
 
sinon, tu peux décrire un peu plus ton problème ?
déjà, tu appelles ta base depuis quel langage ?
 
parcequ'à la base, tu as un paquet de moyen d'y arriver de façon plus propre que ça :)

n°1493333
kramik
Posté le 19-12-2006 à 12:41:46  profilanswer
 

Je travaille en C#.
 
Je dois mettre à jour les photos d'une table utilisateurs.
 
Dans cette table j'ai les colonnes UserId, LastName, FirstName, Email et Picture
 
Je dois donc mettre à jour le champ Picture mais sans savoir sur quoi je me base pour retrouver la ligne à mettre à jour.
 
Donc dans mon fichier config, l'utilisateur met par exemple LastName.FirstName.
 
Ca photo s'apellera donc [Chirac.Jacques].jpg et avec ca je dois faire mon update.
 
Et je sui sobligé d'utiliser une procédure stockée ...

n°1493334
MagicBuzz
Posté le 19-12-2006 à 12:41:49  profilanswer
 

arf, en C#.
 
donc, ton UPDATE, il porte sur quoi ? une table ?
 
pourquoi ne pas charger ta table dans un datatable ?
puis faire un fill shema.
un coup de CmdBuilder pour générer dynamiquement les requêtes d'insertion, supression, update que tu associes à ton datatable.
tu joues avec tes lignes : ajout, mise à jour, suppression dans ton datatable.
puis tu mets à jour au final avec un Update() sur un dataadapter lié à ton datatable ?


Message édité par MagicBuzz le 19-12-2006 à 12:41:54
n°1493336
kramik
Posté le 19-12-2006 à 12:43:23  profilanswer
 

Ben en fait c'est pas si simple que ca car ce sont des images que je dois mettre à jour et donc j'affiche une liste d'images dans une listview et je dois pouvoir en cocher plusieurs et quand je clique sur update tout se fait automatiquement lol

n°1493344
MagicBuzz
Posté le 19-12-2006 à 12:53:28  profilanswer
 

En gros, j'ai une application qui permet de faire ça.
 
Mettons la requête :
 


select * from utilisateurs where age > 18


 
code (syntaxe inexacte, sorry, je fais ça à l'arrache ;))
 

Code :
  1. SqlConnection cnx = new SqlConnection(WebConfigurationManager.OpenWebConfiguration("/" ).ConnectionStrings.ConnectionStrings["LocalSqlServer"].ConnectionString);
  2. cnx.Open();
  3. string sql = "select * from utilisateurs where age > 18";
  4. cmd.CommandText = sql;
  5. cmd.CommandType = CommandType.Text;
  6. cmd.Prepare();
  7. DataTable dt = new DataTable();
  8. SqlDataAdapter da = new SqlDataAdapter(cmd);
  9. SqlCommandBuilder cmdBuilder = new SqlCommandBuilder(da);
  10. da.FillSchema(dt, SchemaType.Source);
  11. da.Fill(dt);
  12. da.InsertCommand = cmdBuilder.GetInsertCommand();
  13. da.DeleteCommand = cmdBuilder.GetDeleteCommand();
  14. da.UpdateCommand = cmdBuilder.GetUpdateCommand();
  15. dt.Rows.Add(newRow);
  16. dt.Rows[12]["FirstName"] = "David";
  17. dt.Rows[1].Delete();
  18. DataTable updDataTable = dt.GetChanges();
  19. if (updDataTable != null)
  20. {
  21.   SqlTransaction trans = cnx.BeginTransaction();
  22.   if (da.InsertCommand != null)
  23.   {
  24.     da.InsertCommand.Transaction = trans;
  25.   }
  26.   if (da.DeleteCommand != null)
  27.   {
  28.     da.DeleteCommand.Transaction = trans;
  29.   }
  30.   if (da.UpdateCommand != null)
  31.   {
  32.     da.UpdateCommand.Transaction = trans;
  33.   }
  34.   try
  35.   {
  36.     da.Update(dt);
  37.     trans.Commit();
  38.   }
  39.   catch (Exception e)
  40.   {
  41.     trans.Rollback();
  42.   }
  43.   finally
  44.   {
  45.     trans.Dispose();
  46.     trans = null;
  47.   }
  48. }
  49. cmdBuilder.Dispose();
  50. dt.Dispose();
  51. da.Dispose();
  52. cmd.Dispose();
  53. cnx.Close();
  54. cnx.Dispose();

n°1493345
MagicBuzz
Posté le 19-12-2006 à 12:54:38  profilanswer
 

kramik a écrit :

Ben en fait c'est pas si simple que ca car ce sont des images que je dois mettre à jour et donc j'affiche une liste d'images dans une listview et je dois pouvoir en cocher plusieurs et quand je clique sur update tout se fait automatiquement lol


Justement, tu Bind ton listview avec ta datatable, c'est encore plus simple ! Tu pourras faire les Delete() / Add() / Mises à jours à la volée dans les évènements du ListView :)

n°1493591
kramik
Posté le 19-12-2006 à 16:18:12  profilanswer
 

j'essaye de faire ca pour un Update, mais je n'y arrive pas.
 
Voici ma stored procédure:
 

Code :
  1. CREATE PROC [dbo].[UpdatePicture]
  2. @ProcedurePicture image,
  3. @ProcedureQuery VARCHAR(100)
  4. AS
  5. DECLARE @sql nvarchar(100)
  6. SET @sql=@ProcedureQuery
  7. EXEC dbo.sp_executesql @sql


 
Et ma fonction Update:
 

Code :
  1. public void UpdatePicture(string path, string updateQuery)
  2.         {
  3.             MessageBox.Show(path);
  4.             System.Diagnostics.Debug.WriteLine(path);
  5.             MessageBox.Show(updateQuery);
  6.             System.Diagnostics.Debug.WriteLine(updateQuery);
  7.             //Nom de la procédure embarquée
  8.             string storedProcedure = "UpdatePicture";
  9.             try
  10.             {
  11.                 FileStream fileStreamPicture = new FileStream(@path, FileMode.Open, FileAccess.Read);
  12.          BinaryReader binaryReaderPicture = new BinaryReader(fileStreamPicture);
  13.          byte[] fileToSave = binaryReaderPicture.ReadBytes((int)fileStreamPicture.Length);
  14.          //Déclaration de la connexion à la DB en allant chercher les paramètres dans le fichier de configuration
  15.                 SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["PhotosManagement.Properties.Settings.PhotosManagementConnectionString"].ConnectionString);
  16.          //Déclaration de la fonction à exécuter
  17.          SqlCommand command = new SqlCommand(storedProcedure,connection);
  18.          //Déclaration du type de fonction à exécuter
  19.          command.CommandType = CommandType.StoredProcedure;
  20.          //Déclaration des paramètres à envoyer
  21.                 SqlParameter parameterPicture = command.Parameters.Add("@ProcedurePicture", SqlDbType.Binary, fileToSave.Length, "Picture" );
  22.                 //Valeur des paramètres à envoyer
  23.                 parameterPicture.Value = fileToSave;
  24.                 SqlParameter parameterQuery = command.Parameters.AddWithValue("@ProcedureQuery", updateQuery);
  25.          //Ouverture de la connexion à la DB
  26.          connection.Open();
  27.          //Exécution de la procédure embarquée
  28.          SqlDataReader reader = command.ExecuteReader();
  29.          //Fermeture du reader
  30.          reader.Close();
  31.          //Fermeture de la connexion à la DB
  32.          connection.Close();
  33.          //Fermeture du file stream
  34.          fileStreamPicture.Close();
  35.          //Fermeture du binary reader
  36.          binaryReaderPicture.Close();
  37.             }
  38.             catch(Exception ex)
  39.             {
  40.                 MessageBox.Show(ex.ToString());
  41.             }
  42.         }


 
Qui m'affiche les bons paramètres à passer:
 
C:\Documents and Settings\mgh\Desktop\PhotosManagement\test\[a.b].gif
UPDATE Users SET Picture = @ProcedurePicture WHERE LastName = a AND FirstName = b

mood
Publicité
Posté le 19-12-2006 à 16:18:12  profilanswer
 

n°1493608
kramik
Posté le 19-12-2006 à 16:45:59  profilanswer
 

L'erreur que je reçois c'est que je dois déclarer le @ProcedurePicture alors que c'est fait ...

n°1493886
kramik
Posté le 20-12-2006 à 09:10:53  profilanswer
 

UP


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [SQL Server 2005] Procédure stockée dynamique ?

 

Sujets relatifs
[AJAX] Problème de chargement dynamique de CSSDéclaration et utilisation d'une procédure
[SQL Developper][SQL/Access] problème pour une requête en apparence assez simple
Affichage dynamique d'un lien[PHP] créer une possibilté d'identification SQL/PHP
Texte dynamique sur image[PL/SQL] Aide sur un like
[PHP/MySQL] compter nombre requetes SQL ?[SQL] Petit coup de main dans une requête svp!
Plus de sujets relatifs à : [SQL Server 2005] Procédure stockée dynamique ?


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