Я думаю, что когда вы определяете String
, вы определяете объект. Поэтому вам нужно использовать .equals()
. Когда вы используете примитивные типы данных, вы используете ==
, но с String
(и любым объектом) вы должны использовать .equals()
.
Из ответа @ gmmastros
Всякий раз, когда вы видите сообщение ....
string or binary data would be truncated
Подумайте о себе ... Поле НЕ достаточно большой для хранения моих данных.
Проверьте структуру таблицы для таблицы клиентов. Я думаю, вы обнаружите, что длина одного или нескольких полей НЕ достаточна для хранения данных, которые вы пытаетесь вставить. Например, если поле «Телефон» является полем varchar (8), и вы пытаетесь поместить в него 11 символов, вы получите эту ошибку.
У меня была эта проблема, хотя длина данных была меньше длины поля. Оказалось, что проблема заключалась в наличии другой таблицы журналов (для контрольного журнала), заполненной триггером в главной таблице, где также должен был быть изменен размер столбца.
В одном из операторов INSERT
вы пытаетесь вставить слишком длинную строку в столбец строки [varchar
или nvarchar
).
Если не очевидно, что INSERT
злоумышленник простым взглядом на скрипт, вы можете считать строки <1 row affected>
, которые появляются перед сообщением об ошибке. Полученный номер плюс один дает вам номер выписки. В вашем случае это, по-видимому, второй INSERT, который вызывает ошибку.
Просто хочу внести дополнительную информацию: у меня была такая же проблема, и из-за того, что поле было недостаточно большим для входящих данных, и этот поток помог мне решить его (главный ответ проясняет все).
НО, но очень важно знать, каковы возможные причины, которые могут вызвать его.
В моем случае я создавал таблицу с таким полем:
Select '' as Period, * From Transactions Into #NewTable
Поэтому поле «Период» имеет длину «Нуль» и приводит к сбою операций Insert. Я изменил его на «XXXXXX», то есть на длину входящих данных, и теперь он работал правильно (потому что у поля теперь было 6%).
Надеюсь, это поможет кому-то с той же проблемой:)
Когда я попытался выполнить мою хранимую процедуру, у меня была такая же проблема, потому что размер столбца, который мне нужно добавить, несколько короче, чем данные, которые я хочу добавить. Вы можете увеличить размер типа данных столбца или уменьшить длину ваших данных.
на сервере 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();
}
Другая ситуация, в которой вы можете получить эту ошибку, следующая:
У меня была такая же ошибка, и причина в том, что в инструкции 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
Некоторые из ваших данных не могут вписаться в столбец базы данных (маленький). Нелегко найти, что не так. Если вы используете 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();
Другая ситуация, в которой эта ошибка может возникнуть, находится в SQL Server Management Studio. Если в вашей таблице есть поля «text» или «ntext», независимо от того, какое поле вы обновляете (например, бит или целое число). Похоже, что Studio не загружает все поля «ntext», а также обновляет ВСЕ поля вместо измененного. Чтобы решить проблему, исключите поля «текст» или «текст» из запроса в Management Studio
У меня была такая же проблема. Длина моей колонки была слишком короткой. Что вы можете сделать, это либо увеличить длину, либо сократить текст, который вы хотите поместить в базу данных.
Также возникла эта проблема на поверхности веб-приложения. В конце концов выяснилось, что одно и то же сообщение об ошибке происходит из инструкции SQL update в конкретной таблице.
Наконец, выяснилось, что определение колонии в таблице (-ях) связанной истории не отображает исходную длину столбца столбца типов nvarchar
в некоторых конкретных случаях.
Надеюсь, этот намек поможет и кому-то другому.;)
Firstname nvarchar(5)
Если вы введете более 5 символов, вы получите сообщение об ошибке – user3036123 8 August 2018 в 11:39