добавить многозначный столбец в базу данных [duplicate]

Я думаю, что когда вы определяете String, вы определяете объект. Поэтому вам нужно использовать .equals(). Когда вы используете примитивные типы данных, вы используете ==, но с String (и любым объектом) вы должны использовать .equals().

185
задан Donald Duck 27 November 2017 в 23:30
поделиться

11 ответов

Из ответа @ gmmastros

Всякий раз, когда вы видите сообщение ....

string or binary data would be truncated 

Подумайте о себе ... Поле НЕ достаточно большой для хранения моих данных.

Проверьте структуру таблицы для таблицы клиентов. Я думаю, вы обнаружите, что длина одного или нескольких полей НЕ достаточна для хранения данных, которые вы пытаетесь вставить. Например, если поле «Телефон» является полем varchar (8), и вы пытаетесь поместить в него 11 символов, вы получите эту ошибку.

499
ответ дан Eonasdan 15 August 2018 в 21:02
поделиться
  • 1
    Также обратите внимание, что поля, подверженные воздействию, могут быть в триггере. Надеюсь, я помню это в следующий раз, когда это произойдет ... – Kevin Pope 8 September 2015 в 18:20
  • 2
    Есть ли способ увидеть в отладке, какое поле будет усечено? – DailyFrankPeter 12 December 2017 в 10:54
  • 3
    Эта ошибка возникает из-за того, что ваш столбец не может хранить данные после фиксированной длины. Например; Firstname nvarchar(5) Если вы введете более 5 символов, вы получите сообщение об ошибке – user3036123 8 August 2018 в 11:39

У меня была эта проблема, хотя длина данных была меньше длины поля. Оказалось, что проблема заключалась в наличии другой таблицы журналов (для контрольного журнала), заполненной триггером в главной таблице, где также должен был быть изменен размер столбца.

15
ответ дан alterfox 15 August 2018 в 21:02
поделиться
  • 1
    Благодарю. Моя была потому, что столбец sql в таблице A является varchar (100). Он также вставляет в другую таблицу, в которой столбцом является varchar (50). – Hnin Htet Htet Aung 5 June 2017 в 07:39
  • 2
    Та же проблема была и в моем случае. Преступником была операция триггера. – autopilot 13 May 2018 в 06:36

В одном из операторов INSERT вы пытаетесь вставить слишком длинную строку в столбец строки [varchar или nvarchar).

Если не очевидно, что INSERT злоумышленник простым взглядом на скрипт, вы можете считать строки <1 row affected>, которые появляются перед сообщением об ошибке. Полученный номер плюс один дает вам номер выписки. В вашем случае это, по-видимому, второй INSERT, который вызывает ошибку.

17
ответ дан Andriy M 15 August 2018 в 21:02
поделиться
  • 1
    У меня такая же проблема, как найти, какой столбец вызывает ошибку? – André Bastos 11 April 2018 в 09:24
  • 2
    @ AndréBastos: Возможно, вы могли бы представить это как вопрос (если кто-то еще этого не сделал, в этом случае может быть какой-то готовый ответ). – Andriy M 11 April 2018 в 09:33

Просто хочу внести дополнительную информацию: у меня была такая же проблема, и из-за того, что поле было недостаточно большим для входящих данных, и этот поток помог мне решить его (главный ответ проясняет все).

НО, но очень важно знать, каковы возможные причины, которые могут вызвать его.

В моем случае я создавал таблицу с таким полем:

Select '' as  Period, * From Transactions Into #NewTable

Поэтому поле «Период» имеет длину «Нуль» и приводит к сбою операций Insert. Я изменил его на «XXXXXX», то есть на длину входящих данных, и теперь он работал правильно (потому что у поля теперь было 6%).

Надеюсь, это поможет кому-то с той же проблемой:)

5
ответ дан Blaise 15 August 2018 в 21:02
поделиться

Когда я попытался выполнить мою хранимую процедуру, у меня была такая же проблема, потому что размер столбца, который мне нужно добавить, несколько короче, чем данные, которые я хочу добавить. Вы можете увеличить размер типа данных столбца или уменьшить длину ваших данных.

0
ответ дан Chamila Maddumage 15 August 2018 в 21:02
поделиться

на сервере sql вы можете использовать SET ANSI_WARNINGS OFF следующим образом:

        using (SqlConnection conn = new SqlConnection("Data Source=XRAYGOAT\\SQLEXPRESS;Initial Catalog='Healthy Care';Integrated Security=True"))
        {
            conn.Open();

            using (var trans = conn.BeginTransaction())
            {
                try
                {
                    using cmd = new SqlCommand("", conn, trans))
                    { 

                    cmd.CommandText = "SET ANSI_WARNINGS OFF";
                    cmd.ExecuteNonQuery();

                    cmd.CommandText = "YOUR INSERT HERE";
                    cmd.ExecuteNonQuery();

                    cmd.Parameters.Clear();

                    cmd.CommandText = "SET ANSI_WARNINGS ON";
                    cmd.ExecuteNonQuery();

                    trans.Commit();
                    }
                }
                catch (Exception)
                {

                    trans.Rollback();
                }

            }

            conn.Close();

        }
6
ответ дан Esperento57 15 August 2018 в 21:02
поделиться

Другая ситуация, в которой вы можете получить эту ошибку, следующая:

У меня была такая же ошибка, и причина в том, что в инструкции INSERT, которая получала данные из UNION, порядок столбцов был отличается от оригинальной таблицы. Если вы измените порядок в # table3 на a, b, c, вы исправите ошибку.

select a, b, c into #table1
from #table0

insert into #table1
    select a, b, c from #table2
    union
    select a, c, b from #table3
4
ответ дан hola77 15 August 2018 в 21:02
поделиться

Некоторые из ваших данных не могут вписаться в столбец базы данных (маленький). Нелегко найти, что не так. Если вы используете C # и Linq2Sql, вы можете указать поле, которое будет усечено:

Сначала создайте вспомогательный класс:

public class SqlTruncationExceptionWithDetails : ArgumentOutOfRangeException
{
    public SqlTruncationExceptionWithDetails(System.Data.SqlClient.SqlException inner, DataContext context)
        : base(inner.Message + " " + GetSqlTruncationExceptionWithDetailsString(context))
    {
    }

    /// <summary>
    /// PArt of code from following link
    /// http://stackoverflow.com/questions/3666954/string-or-binary-data-would-be-truncated-linq-exception-cant-find-which-fiel
    /// </summary>
    /// <param name="context"></param>
    /// <returns></returns>
    static string GetSqlTruncationExceptionWithDetailsString(DataContext context)
    {
        StringBuilder sb = new StringBuilder();

        foreach (object update in context.GetChangeSet().Updates)
        {
            FindLongStrings(update, sb);
        }

        foreach (object insert in context.GetChangeSet().Inserts)
        {
            FindLongStrings(insert, sb);
        }
        return sb.ToString();
    }

    public static void FindLongStrings(object testObject, StringBuilder sb)
    {
        foreach (var propInfo in testObject.GetType().GetProperties())
        {
            foreach (System.Data.Linq.Mapping.ColumnAttribute attribute in propInfo.GetCustomAttributes(typeof(System.Data.Linq.Mapping.ColumnAttribute), true))
            {
                if (attribute.DbType.ToLower().Contains("varchar"))
                {
                    string dbType = attribute.DbType.ToLower();
                    int numberStartIndex = dbType.IndexOf("varchar(") + 8;
                    int numberEndIndex = dbType.IndexOf(")", numberStartIndex);
                    string lengthString = dbType.Substring(numberStartIndex, (numberEndIndex - numberStartIndex));
                    int maxLength = 0;
                    int.TryParse(lengthString, out maxLength);

                    string currentValue = (string)propInfo.GetValue(testObject, null);

                    if (!string.IsNullOrEmpty(currentValue) && maxLength != 0 && currentValue.Length > maxLength)
                    {
                        //string is too long
                        sb.AppendLine(testObject.GetType().Name + "." + propInfo.Name + " " + currentValue + " Max: " + maxLength);
                    }

                }
            }
        }
    }
}

Затем подготовьте обертку для SubmitChanges:

public static class DataContextExtensions
{
    public static void SubmitChangesWithDetailException(this DataContext dataContext)
    {
        //http://stackoverflow.com/questions/3666954/string-or-binary-data-would-be-truncated-linq-exception-cant-find-which-fiel
        try
        {
            //this can failed on data truncation
            dataContext.SubmitChanges();
        }       
        catch (SqlException sqlException) //when (sqlException.Message == "String or binary data would be truncated.")
        {

            if (sqlException.Message == "String or binary data would be truncated.") //only for EN windows - if you are running different window language, invoke the sqlException.getMessage on thread with EN culture
                throw new SqlTruncationExceptionWithDetails(sqlException, dataContext);
            else
                throw;
        }
    }
}

Подготовить глобальный обработчик исключений и подробности обрезания журнала:

protected void Application_Error(object sender, EventArgs e)
{
    Exception ex = Server.GetLastError();
    string message = ex.Message;
    //TODO - log to file
}

Наконец, используйте код:

Datamodel.SubmitChangesWithDetailException();
9
ответ дан qub1n 15 August 2018 в 21:02
поделиться

Другая ситуация, в которой эта ошибка может возникнуть, находится в SQL Server Management Studio. Если в вашей таблице есть поля «text» или «ntext», независимо от того, какое поле вы обновляете (например, бит или целое число). Похоже, что Studio не загружает все поля «ntext», а также обновляет ВСЕ поля вместо измененного. Чтобы решить проблему, исключите поля «текст» или «текст» из запроса в Management Studio

-1
ответ дан Sevast 15 August 2018 в 21:02
поделиться
  • 1
    Пожалуйста, перефразируйте свой ответ, добавив запятые, периоды и исправляя ошибки грамматики. – George Pamfilis 12 May 2018 в 15:56

У меня была такая же проблема. Длина моей колонки была слишком короткой. Что вы можете сделать, это либо увеличить длину, либо сократить текст, который вы хотите поместить в базу данных.

5
ответ дан user2983359 15 August 2018 в 21:02
поделиться

Также возникла эта проблема на поверхности веб-приложения. В конце концов выяснилось, что одно и то же сообщение об ошибке происходит из инструкции SQL update в конкретной таблице.

Наконец, выяснилось, что определение колонии в таблице (-ях) связанной истории не отображает исходную длину столбца столбца типов nvarchar в некоторых конкретных случаях.

Надеюсь, этот намек поможет и кому-то другому.;)

6
ответ дан webMac 15 August 2018 в 21:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: