Строка или двоичные данные будут проигнорированы. Заявление было прекращено. при вставке в таблицу - PullRequest
0 голосов
/ 14 июля 2020

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

Я получаю сообщение об ошибке:

Строковые или двоичные данные будут усечены. Оператор завершен

в методе httppost. Я проверил значения tempdata в методе post, применив точку останова, и с этим нет проблем. Значения в базе данных имеют тип nvarchar, за исключением идентификатора типа int.

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

Вещи, которые я вставляю, в основном являются строками, а некоторые могут содержать специальный символ в строке, например * , \ et c и до 700 символов.

PS: В настоящее время я проигнорировал SQL угрозу инъекции

[HttpGet] 
public ActionResult Index() 
{ string connstr = "Here is the connection string"; 
SqlConnection conn = new SqlConnection(connstr); 
conn.Open(); 
SqlCommand cmd = new SqlCommand(" Select top(1) Id , Body , Email_subject , Queue , Intent , Tagging FROM
    table1 "); 
cmd.CommandType = System.Data.CommandType.Text;
cmd.Connection = conn; 
SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read()) 
{ 
var Did = reader["Id"].ToString();
TempData["id "] = Int64.Parse(Did);
TempData["subject "] = reader["Email_subject"].ToString();
TempData["body"] = reader["Body"].ToString(); 
TempData["intent"] = reader["Intent"].ToString();
TempData["queue"] = reader["Queue"].ToString(); 
TempData["tagging"] = reader["Tagging"].ToString();
    } 
conn.Close(); 
TempData.Keep(); 
return View(); 
} 



[HttpPost] 
public ActionResult Index(string Correctornot) 
{ TempData.Keep(); 
string connstr = My connection String;
SqlConnection conn = new SqlConnection(connstr); 
conn.Open(); 
SqlCommand cmd = new SqlCommand("SET IDENTITY_INSERT table2 ON ; INSERT INTO table2 ( Id ,Body, Response ,Queue , Intent , Tagging , Email_subject) VALUES ( '" + TempData["id"] + "' , '" + TempData["body"] + "'
    , '" + Correctornot + "' , '" + TempData["Queue"] + "' , '" + TempData["intent"] + "' , '" + TempData["tagging"] + "' , '" + TempData["subject"] + "');DELETE FROM table1 where Id = '" + TempData["id"] + "' ;");
 cmd.CommandType = System.Data.CommandType.Text;
 cmd.Connection = conn; 

SqlDataReader reader2 = cmd.ExecuteReader();
 
 SqlCommand cmd2 = new SqlCommand(" Select top(1) Id , Body , Email_subject , Queue , Intent , Tagging FROM table1");
cmd2.CommandType = System.Data.CommandType.Text; 
cmd2.Connection = conn; 
SqlDataReader reader3 = cmd2.ExecuteReader();
 while (reader3.Read()) 
{ 
var Did = reader3["Id"].ToString();
 TempData["id "] = Int64.Parse(Did);
 TempData["subject "] = reader3["Email_subject"].ToString();
 TempData["body"] = reader3["Body"].ToString(); 
TempData["intent"] = reader3["Intent"].ToString(); 
TempData["queue"] = reader3["Queue"].ToString(); 
TempData["tagging"] = reader3["Tagging"].ToString(); }
 conn.Close(); 
TempData.Keep();
 return View(); }

Решение:

Мне удалось решить проблему, но я до сих пор не знаю причину, стоящую за ней.

Проблема возникла из-за значения, возвращаемого при нажатии кнопки. Хотя значение было не слишком большим (оно было просто «правильным» и «неправильным»), когда я попытался вставить его в базу данных, он дал мне ошибку.

Я решил это с помощью оператора switch вместо того, чтобы напрямую добавлять его в оператор вставки.

ie

            switch (Correctornot)
            {
                case "Correct":
                        sql = "Insert INTO [dbo].[Labeler_Email_For_confirmation_Agents](Body , Response , Queue , Intent , Tagging , Email_subject ) Values (  '" + TempData["body"].ToString() + "' , 'yes' , '" + TempData["queue"].ToString() + "' , '" + TempData["intent"].ToString() + "' , '" + TempData["tagging"].ToString() + "' , '" + TempData["email_subject"].ToString() + "');";
                        break;
                case "Not Correct":
                    sql = "Insert INTO [dbo].[Labeler_Email_For_confirmation_Agents](Body , Response , Queue , Intent , Tagging , Email_subject ) Values (  '" + TempData["body"].ToString() + "' , 'no' , '" + TempData["queue"].ToString() + "' , '" + TempData["intent"].ToString() + "' , '" + TempData["tagging"].ToString() + "' , '" + TempData["email_subject"].ToString() + "');";
                    break;

   
            }

Ответы [ 2 ]

1 голос
/ 15 июля 2020

SQL Server 2016 SP2 CU6 и SQL Server 2017 CU12 представили флаг трассировки 460, чтобы возвращать подробные сведения о предупреждениях об усечении. Вы можете включить его на уровне запроса или на уровне сервера.

Уровень запроса

INSERT INTO dbo.TEST (ColumnTest)
VALUES (‘Test truncation warnings’)
OPTION (QUERYTRACEON 460);
GO

Уровень сервера

DBCC TRACEON(460, -1);
GO

С SQL Server 2019 вы можете включить его на уровне базы данных:

ALTER DATABASE SCOPED CONFIGURATION 
SET VERBOSE_TRUNCATION_WARNINGS = ON;

Старое сообщение вывода:

Msg 8152, Level 16, State 30, Line 13
String or binary data would be truncated.
The statement has been terminated.

Новое сообщение вывода:

Msg 2628, Level 16, State 1, Line 30
String or binary data would be truncated in table 'DbTest.dbo.TEST', column 'ColumnTest'. Truncated value: ‘Test truncation warnings‘'.

В будущей версии SQL Server 2019 сообщение 2628 по умолчанию заменит сообщение 8152.

0 голосов
/ 14 июля 2020

«Строковые или двоичные данные будут усечены. Оператор прерван» сообщает, что одно из значений, которые вы пытаетесь вставить, слишком велико для столбца SQL. Например, вы увидите эту ошибку, если попытаетесь вставить «Hello, World» в столбец SQL, который может содержать только 4 символа. Обрежьте значение перед вставкой или измените тип данных столбца SQL.

...