текстовое поле или код не чувствителен к регистру
-
05-07-2019 - |
Вопрос
Я ввожу имя в текстовое поле, например.«Джон» и сохраняю его в базе данных, что и происходит, затем я снова ввожу «Джон», но он не сохраняется.Но если я введу «Джон», оно снова сохранится...Мне это нужно, чтобы не спасти Джона, и наоборот.
ОК, это текстовое поле, которое вполне нормальное:
<asp:TextBox ID="TextBox2" runat="server" Width="80%" BorderColor="Black"
MaxLength="127"></asp:TextBox>
и вот код:
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();
}
Решение
if (Name != (string)names[i])
{
...
}
может стать
if (!Name.Equals((string)names[i], StringComparison.InvariantCultureIgnoreCase))
{
...
}
Другие советы
Один из способов сделать это - каждый раз менять его на соответствующий регистр, прежде чем представлять его в базу данных.
Чтобы привести его к правильному случаю, вы можете попробовать метод ToTitleCase ()
в System.Globalization.TextInfo
.
Обратите внимание, что ToTitleCase ()
обеспечивает произвольное поведение в регистре, а не лингвистически правильное поведение. Например, «Война и мир». должен иметь строчную букву А на английском языке. Это особенно проблематично для таких случаев, как O'Brien, который ToTitleCase
будет выводить как O'brien.
В конце концов, может быть проще позволить базе данных сохранить объект. Р>
Время для холодного душа.
Во-первых, если вы хотите проверить, существует ли имя, и вставить его, если его нет, вы должны проверить его на сервере, при условии надлежащей изоляции и контроля транзакций. То, что у вас есть, помимо того, что вы ужасно неэффективны, сравнивая имя с массивом на клиенте , неверно, потому что оно проверяет, не существует ли имя (прошедшее время) , Он не учитывает параллелизм, и в результате два запроса могут пытаться вставить одно и то же имя.
Во-вторых, если вам нужна уникальность в базе данных, то вы применяете ее с помощью ограничений таблицы. Если вам нужно уникальное имя без учета регистра, вам следует добавить уникальное ограничение к вашей таблице в столбце «Имя» и убедитесь, что в столбце используется сортировка без учета регистра . р>
Почему бы просто не использовать верхний регистр (или нижний регистр, если уж на то пошло) в логике сравнения:
if (Name.ToUpper() != (строка)names[i].ToUpper)
ХТХ