Question

Je saisis un nom dans la zone de texte, par exemple. "John" et enregistrez-le dans la base de données, puis entrez à nouveau "John". qu'il ne sauve pas. Mais si je saisis "john", cela enregistre de nouveau cette information ... Il faut que je ne sauvegarde pas john et vice-versa.

ok, c’est donc la zone de texte qui est silencieuse:

 <asp:TextBox ID="TextBox2" runat="server" Width="80%" BorderColor="Black" 
                    MaxLength="127"></asp:TextBox>

et voici le code:

int k= 0
SqlConnection dataConnection = new SqlConnection();
            dataConnection.ConnectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
            SqlCommand dataCommand =
                    new SqlCommand("select Name from Groups", dataConnection);


            ArrayList names = new ArrayList();
            dataConnection.Open();
            SqlDataReader rdr = dataCommand.ExecuteReader();
            while (rdr.Read())
            {
                names.Add(rdr.GetString(0));
            }
            dataCommand.Dispose();
            dataConnection.Dispose();

            //to check if name already used..
            for (int i = 0; i < names.count; i++)
            {
                if (Name != (string)names[i])
                {
                    k = 1;

                }
                else
                {
                    Label1.Text = "Name is already present";
                    Label1.Visible = true;
                    k = 0;
                    break;
                }
            }
            if (k == 1)
            {
                Insertname();
            }
Était-ce utile?

La solution

if (Name != (string)names[i])
{
    ...
}

pourrait devenir

if (!Name.Equals((string)names[i], StringComparison.InvariantCultureIgnoreCase))
{
    ...
}

Autres conseils

Une façon de le faire est de le changer à la casse chaque fois avant de le présenter à la base de données.

Pour obtenir le bon cas, vous pouvez essayer la méthode ToTitleCase () dans System.Globalization.TextInfo .

Notez que ToTitleCase () fournit un comportement de casse arbitraire, pas un comportement linguistiquement correct. Par exemple, "Guerre et paix". devrait avoir un minuscule a en anglais. Cela est particulièrement problématique dans des cas tels que O'Brien, pour lequel ToTitleCase sera affiché en tant que O'brien.

En fin de compte, il serait peut-être plus simple de laisser la base de données enregistrer la chose.

Il est temps de prendre une douche froide.

Tout d'abord, si vous souhaitez vérifier si le nom existe et l'insérer dans le cas contraire, vous devez vérifier sur le serveur, sous un isolement et un contrôle des transactions appropriés. Ce que vous avez là, en plus d’être horriblement inefficace en vérifiant le nom par rapport à un tableau sur le client , est incorrect car il vérifie si le nom n’existe pas existait (au passé) . Il ne prend pas en compte la simultanéité et deux requêtes peuvent donc tenter d’insérer le même nom.

Deuxièmement, si vous avez besoin d’unicité dans la base de données, vous devez l’appliquer par des contraintes de table. Si vous souhaitez un nom unique ne respectant pas la casse, vous devez ajouter un contrainte UNIQUE à votre table dans la colonne Nom et assurez-vous que la colonne utilise une classement .

Pourquoi ne pas simplement forcer en majuscule (ou minuscule d'ailleurs) dans la logique de comparaison:

if (Name.ToUpper ()! = (chaîne) noms [i] .ToUpper)

HTH

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top