Когда я ввожу данные, длина которых превышает длину столбца, в ASP.NET не возникает исключение - PullRequest
5 голосов
/ 29 марта 2011

Вопрос прост.

В моей базе данных есть столбец с типом данных NVARCHAR (20) .. поэтому, когда я пытаюсь ввести в этот столбец данные, которые, например, содержат 22 символа, он просто игнорирует последние 2 символа, а не выдает исключение!

Это нормально? .. а как обезопасить базу данных от такой проблемы?

PS: Конечно, я использую элементы управления проверкой и проверкой сервера, но как защитить базу данных, есть ли какое-то расширенное ограничение, не просто указывающее длину столбца, поэтому оно выдает исключение и не принимает введенную дату ??


Редактировать

try
{
    using (SqlConnection conn = new SqlConnection(ConnStr))
    {
        string Command = "SET NOCOUNT ON; INSERT INTO [Countries] (CountryName, IsVisible) VALUES (@Name, @IsVisible);";

        using (SqlCommand comm = new SqlCommand(Command, conn))
        {
            comm.Parameters.Add("@Name", System.Data.SqlDbType.NVarChar, 20);
            comm.Parameters["@Name"].Value = Name;

            comm.Parameters.Add("@IsVisible", System.Data.SqlDbType.Bit);
            comm.Parameters["@IsVisible"].Value = IsVisible;

            conn.Open();
            comm.ExecuteNonQuery();

            return "Successfully added " + Name + " to the countries.";

        }
    }
}
catch (SqlException SqlEx)
{
    string ErrorMessage = "";

    for (int i = 0; i < SqlEx.Errors.Count; i++)
    {
        ErrorMessage += SqlEx.Errors[i].Number + " : " + SqlEx.Errors[i].Message + "\n";
    }
    return ErrorMessage;
}

Хорошо, это код, который я использую, и между прочим, я просто попытался вставить данные большего размера, чем длина столбца, непосредственно из Sql Management Studio, и он фактически отобразил сообщение, которое вы только что описали!

Ответы [ 2 ]

9 голосов
/ 29 марта 2011

Проблема между этими двумя строками.

   comm.Parameters.Add("@Name", System.Data.SqlDbType.NVarChar, 20);
   comm.Parameters["@Name"].Value = Name;

SQL Server НИКОГДА не видит более 20 символов. .Net выполняет усечение.

Я не могу вспомнить документацию для SQLParameter, поиск в Google был быстрее.

http://www.eggheadcafe.com/software/aspnet/30873895/sqlparameter-question.aspx

Теперь, если вы указали длину SqlParam равной 40, тогда .NET будет автоматически обрезает строку до 40 символов для вас .. и нет возникнет ошибка (но вы можете потерять данные и не знать об этом).

2 голосов
/ 29 марта 2011

Есть несколько областей, в которых данные будут обрезаться до того, как они достигнут таблицы без ошибок.

Как указал @Richard для вашего конкретного случая, он усекается ADO.

Если вы вызвали хранимую процедуру с параметром varchar (20) и передали ей 22 символа данных, механизм обработки параметров в SQL-сервере также урезал бы ее.

Однако, если вы написали состояние вставки, в котором пытались вставить 22 символа в столбец varchar (20), вы увидите ошибку.

По сути, обработка параметров молча "исправляет" это. Принимая во внимание, что если вы избавитесь от параметров, то это потерпит неудачу. Вот почему этот вопрос действительно является точной копией того, на который ссылается @gbs.

Очевидно, что избавление от параметров - это FAR от идеала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...