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

Procédure stockée dynamique ? [SQL Server 2005] - SQL/NoSQL - Programmation

Marsh Posté le 19-12-2006 à 11:56:14    

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:

Reply

Marsh Posté le 19-12-2006 à 11:56:14   

Reply

Marsh Posté le 19-12-2006 à 12:30:36    

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à...)

Reply

Marsh Posté le 19-12-2006 à 12:32:40    

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

Reply

Marsh Posté le 19-12-2006 à 12:39:02    

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 :)

Reply

Marsh Posté le 19-12-2006 à 12:41:46    

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 ...

Reply

Marsh Posté le 19-12-2006 à 12:41:49    

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
Reply

Marsh Posté le 19-12-2006 à 12:43:23    

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

Reply

Marsh Posté le 19-12-2006 à 12:53:28    

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();

Reply

Marsh Posté le 19-12-2006 à 12:54:38    

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 :)

Reply

Marsh Posté le 19-12-2006 à 16:18:12    

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

Reply

Marsh Posté le 19-12-2006 à 16:18:12   

Reply

Marsh Posté le 19-12-2006 à 16:45:59    

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

Reply

Marsh Posté le 20-12-2006 à 09:10:53    

UP

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed