IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET Discussion :

Problème SQLServer / C#


Sujet :

ASP.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2008
    Messages : 114
    Par défaut Problème SQLServer / C#
    Bonjour, je veux faire une recherche dans ma base par rapport à un ou des mots-clés tapés dans une textbox.

    Mais j'obtiens une erreur me disant que mon nom de colonne est non valide, ce nom de colonne étant mon mot-clé...

    Ma méthode addFilter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    public void AddFilter (string sqlField, string val, bool caseInsensitive, bool bAddQuotes, string filterOperator) {
                string cs = caseInsensitive ? " COLLATE SQL_Latin1_General_CP1_CI_AS " : "";
     
                if (val != null) {
                    if (val.IndexOf(',') == -1) {
                        if (!_rowFilter.EndsWith(" and "))
                            _rowFilter += " and " +  sqlField + cs + filterOperator + AddQuotes(val, bAddQuotes) + " and ";
                        else
                            _rowFilter +=  sqlField + cs + filterOperator + AddQuotes(val, bAddQuotes) + " and ";
                    }
                    else {
                        //multiple values, comma separated
                        string filter = "(";
                        char[] separator = { ',' };
                        string[] vals = val.Split(separator);
     
                        for (int i=0; i<vals.Length; i++) {
                            filter += sqlField + cs + filterOperator + AddQuotes(vals[i], bAddQuotes) + " or ";
                        }
     
                        _rowFilter += filter.Substring(0, filter.Length-4) + ") and ";
                    }
                }
            }
    Mon erreur:
    Erreur lors de l'exécution de la commande de type StoredProcedure sur la base SQL Serveur : Nom de colonne non valide : 'test'.
    L'appel à ma Proc Stockée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    public static DataTable GetTicketsByKeywords (int maxResults, string rowFilter, int userId) {
     
     
     
                DataSet obj = null;
     
                SQLServerManager sql = new SQLServerManager(System.Configuration.ConfigurationManager.ConnectionStrings["ticketmanager"].ConnectionString);
     
                List<System.Data.SqlClient.SqlParameter> parameters = new List<SqlParameter>();
                parameters.Add( new SqlParameter("@maxResults",maxResults) );
                parameters.Add(new SqlParameter("@rowFilter", rowFilter));
                parameters.Add(new SqlParameter("@userId", userId));
     
                try {
                    return sql.ExecuteDataTable("TCK_SP_GetKeywordTickets", ref parameters);
                    //obj = dbSQL.ExecuteDataSet(dbCommand);
                }
                catch (DBConnectionException) {
                    throw;
                }
                catch (Exception ex) {
                    throw new TicketDataLayerException(ex);
                }
                finally {
                    if (sql != null)
                        sql.Close();
                }
            }
    Merci d'avance à tous ceux qui s'intéresseront à la question.

    Erazion.

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 298
    Par défaut
    Je comprends pas tu construis une requête et il essaie d'appeller une proc stockée ?

  3. #3
    Membre confirmé
    Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2008
    Messages : 114
    Par défaut
    Tout d'abord je récupère le mot clé tapé dans la textbox.

    Ensuite, j'appelle ma fonction qui créée le filtre pour la requête SQL:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    public static Filter BuildFilter (string name, TagCollection keywords) {
     
     
                BuildWhereClause clause = new BuildWhereClause();
                string res = string.Empty;
                for (int i=0; i<keywords.Count; i++)
                    if (keywords[i].Value != null &&  keywords[i].Value.Length  >= 3) {
                        if (res == "")
                            res = "'%" + keywords[i].Value + "%'";
                        else
                            res += ",'%" + keywords[i].Value + "%'";
                    }
     
                clause.AddLikeFilter("TagKeyword", res, true);
                //clause.AddEqualFilter("TagKeyword", res,true);
                Filter f = new Filter();
                f.Name = name;
                f.OwnerID = ClientUserSynchroManager.GetMyIdentity().Informations.Id;
                f.TabOwner = 2;
                f.Value = clause.WhereClause;
                return f;
    Après, appel de la procédure stockée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    public static DataTable GetTicketsByKeywords (int maxResults, string rowFilter, int userId) {
     
                /*DataSet obj = null;
                SqlDatabase dbSQL = DatabaseFactory.CreateDatabase("ticketmanager") as SqlDatabase;
                string sqlCommand = "TCK_SP_GetKeywordTickets";
                DbCommand dbCommand = dbSQL.GetStoredProcCommand(sqlCommand);
                dbSQL.AddInParameter(dbCommand, "maxResults", DbType.Int32, maxResults);
                dbSQL.AddInParameter(dbCommand, "rowFilter", DbType.String, rowFilter);
                dbSQL.AddInParameter(dbCommand, "userId", DbType.Int32, userId);
                try{obj = dbSQL.ExecuteDataSet(dbCommand);}
                catch (DBConnectionException){throw;}
                catch (Exception ex){throw new TicketDataLayerException(ex);}
                finally{if (dbCommand.Connection != null) {dbCommand.Connection.Close();}
                if (obj != null && obj.Tables.Count > 0)return obj.Tables[0];
                else return null;*/
     
     
                SQLServerManager sql = new SQLServerManager(System.Configuration.ConfigurationManager.ConnectionStrings["ticketmanager"].ConnectionString);
                List<System.Data.SqlClient.SqlParameter> parameters = new List<SqlParameter>();
                parameters.Add( new SqlParameter("@maxResults",maxResults) );
                parameters.Add(new SqlParameter("@rowFilter", rowFilter));
                parameters.Add(new SqlParameter("@userId", userId));
                try {
                    return sql.ExecuteDataTable("TCK_SP_GetKeywordTickets", ref parameters);
                }
                catch (DBConnectionException) {
                    throw;
                }
                catch (Exception ex) {
                    throw new TicketDataLayerException(ex);
                }
                finally {
                    if (sql != null)
                        sql.Close();
                }
    Et ca me retourne l'erreur précédente...

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 298
    Par défaut
    Passe en debug et vient poster ici la requête que tu as construite après ta fonction...

    Juste avant de faire le execute...

    A mon avis la requête est mal construite du coup t'as une erreur sql.... genre il doit manquer un = ou un autre caractère......


    Il faut ce qu'il y a dans
    TCK_SP_GetKeywordTickets

    + rowfilter...

  5. #5
    Membre confirmé
    Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2008
    Messages : 114
    Par défaut
    Voila la proc stock:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    ALTER PROCEDURE [dbo].[TCK_SP_GetKeywordTickets]
    	(
    		@rowFilter nvarchar(4000),
    		@maxResults int,
    		@userId int
    	)
    AS
    SET NOCOUNT ON
     
     
    if @rowFilter is null or @rowFilter = ''
    	set @rowFilter = '1=1'
     
    set @rowFilter = N'
    	select top ' + cast(@maxResults as nvarchar(5)) + ' *	
    		from
    			(
    			select TicketID, TicketCreationDtm, TicketClosingDtm, TicketTitle, FK_AuthorID, AuthorFullName, SubjectID, SubjectName, FK_PriorityID, 
                          PriorityName, FK_StateID, StateName, FK_AllocatedGroupID, AllocatedSingleUser, TicketLastUpdateDtm,  FK_LastUpdateByID, PudoId, LastUpdateAuthorCompanyID, LastUpdateAuthorFullName, AllocatedCompanyID, AuthorCompanyID, FK_WfmID,AllocatedGroupAttributionType, BusinessKeys, dbo.TCK_FCT_IsRssFeedActivated (TicketID,' + str(@UserID) + ') as RssFeedActivated, dbo.TCK_FCT_CheckTicketUpdates(TicketID,' + str(@UserID) + ') as TicketNews, tagid, tagkeyword
    			from
    				dbo.[ViewKeywords]
    			where
    				' + @rowFilter + '
    			) aa
    		ORDER BY 
    			aa.TicketLastUpdateDtm DESC
    	'
    exec(@rowFilter)
     
     
    RETURN
    Le BuildFilter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    public static Filter BuildFilter (string name, TagCollection keywords) {
     
     
                BuildWhereClause clause = new BuildWhereClause();
                string res = string.Empty;
                for (int i=0; i<keywords.Count; i++)
                    if (keywords[i].Value != null &&  keywords[i].Value.Length  >= 3) {
                        if (res == "")
                            res = "'%" + keywords[i].Value + "%'";
                        else
                            res += ",'%" + keywords[i].Value + "%'";
                    }
     
                clause.AddLikeFilter("TagKeyword", res, true);
                //clause.AddEqualFilter("TagKeyword", res,true);
                Filter f = new Filter();
                f.Name = name;
                f.OwnerID = ClientUserSynchroManager.GetMyIdentity().Informations.Id;
                f.TabOwner = 2;
                f.Value = clause.WhereClause;
                return f;
            }
    Le AddFilter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    public void AddFilter (string sqlField, string val, bool caseInsensitive, bool bAddQuotes, string filterOperator) {
                string cs = caseInsensitive ? " COLLATE SQL_Latin1_General_CP1_CI_AS " : "";
     
                if (val != null) {
                    if (val.IndexOf(',') == -1) {
                        if (!_rowFilter.EndsWith(" and "))
                            _rowFilter += " and " +  sqlField + cs + filterOperator + AddQuotes(val, bAddQuotes) + " and ";
                        else
                            _rowFilter +=  sqlField + cs + filterOperator + AddQuotes(val, bAddQuotes) + " and ";
                    }
                    else {
                        //multiple values, comma separated
                        string filter = "(";
                        char[] separator = { ',' };
                        string[] vals = val.Split(separator);
     
                        for (int i=0; i<vals.Length; i++) {
                            filter += sqlField + cs + filterOperator + AddQuotes(vals[i], bAddQuotes) + " or ";
                        }
     
                        _rowFilter += filter.Substring(0, filter.Length-4) + ") and ";
                    }
                }
            }
    S'il vous faut autre chose dites le moi.

    Merci de vous y intéresser en tout cas

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 298
    Par défaut
    le plus simple ca serait de debugger ta proc stockée et de récupérer la requête complete... Si t'as pas le débug fait une petit modif pour mettre ta requête complète dans un string et la renvoyer dans une variable retour....

    Comme ca après tu la post ici (la requête textuelle)..

    Comme ça on peut regarder la requuête trouver l'erreur et ensuite on verra la construction par le code ou est le soucis...

    Faut bosser par étape....


    Mais si je peux me permettre ton code me parait très permissif vis à vis du sql injection

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de connexion SqlServer avec JNDI
    Par s.lakhlifi dans le forum JDBC
    Réponses: 5
    Dernier message: 09/06/2006, 13h28
  2. Problème de compatibilité de types avec Delphi et SQLServer
    Par scrat88 dans le forum Bases de données
    Réponses: 2
    Dernier message: 22/05/2006, 11h31
  3. Problème de recherche avec ASP & sqlserver
    Par salmer dans le forum ASP
    Réponses: 2
    Dernier message: 13/04/2006, 10h00
  4. Acess vs SQLServer, un problème de booleen
    Par SkYsO dans le forum Bases de données
    Réponses: 2
    Dernier message: 07/11/2005, 08h24
  5. [SQLserver2000][SQLServer CE] problème de requête SQL
    Par JBernn dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 27/01/2005, 09h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo