Ron Anders Ответов: 3

Глупый SQL... Где условие, вызывающее: "строковые или двоичные данные будут усечены.\r\n заявление было прекращено."


i - это целое число строк. Где R = 'RowNumber' не будет работать. дает:
- Строковые или двоичные данные будут усечены.\r\n заявление было прекращено."

Весь день.

For(i=0.....)
{
                    string RowNumber = i.ToString();
                    string UpdateCmd = "UPDATE [Monthly Service] SET Location = '" + data.Location + "' , Address = '" + data.Address
                    + "', Name = '" + data.Name + "', Testing = '" + data.Testing + "', Fill_Time = '" + data.FillTime + "', Notes = '" + data.Notes
                    + "', Code_Key = '" + data.CodeKey + "', Phone = '" + data.Phone + "' Where R = 'RowNumber'";  

                    SqlCommand ThisUpdateCommand = new SqlCommand(UpdateCmd, myConnection);
                    try
                    {
                        ThisUpdateCommand.ExecuteNonQuery();
                    }
                    catch (Exception e)
                    {
                        
                    }


Что я уже пробовал:

Неужели? - Мне так надоело гуглить и так сегодня...

Afzaal Ahmad Zeeshan

- Строковые или двоичные данные будут усечены.\r\n заявление было прекращено."

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

3 Ответов

Рейтинг:
2

Patrice T

string UpdateCmd = "UPDATE [Monthly Service] SET Location = '" + data.Location + "' , Address = '" + data.Address
+ "', Name = '" + data.Name + "', Testing = '" + data.Testing + "', Fill_Time = '" + data.FillTime + "', Notes = '" + data.Notes
+ "', Code_Key = '" + data.CodeKey + "', Phone = '" + data.Phone + "' Where R = 'RowNumber'";

Не обязательно решение вашего вопроса, но у вас есть еще одна проблема.
Никогда не создавайте SQL-запрос путем объединения строк. Рано или поздно вы сделаете это с помощью пользовательских вводов, и это откроет дверь к уязвимости под названием "SQL-инъекция", она опасна для вашей базы данных и подвержена ошибкам.
Одна кавычка в имени - и ваша программа выйдет из строя. Если пользователь вводит имя, например "Брайан О'Коннер", может привести к сбою вашего приложения, это уязвимость SQL-инъекции, и сбой-это наименьшая из проблем, вредоносный пользовательский ввод, и он продвигается к командам SQL со всеми учетными данными.
SQL-инъекция - Википедия[^]
SQL-инъекция[^]
Атаки SQL-инъекций на примере[^]
PHP: SQL-инъекция - руководство пользователя[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? - Обмен Стеками Информационной Безопасности[^]


Ron Anders

Я знаком с проблемой апострфии и занимался ею в других местах.
Я также лучше знаком с проблемами SQL-инъекций, эта программа находится на стадии POC, поэтому я просто иду по пути наименьшего сопротивления в данный момент.

Рейтинг:
2

Ron Anders

Я его "починил". Это был синтаксис.
Я еще глупее, чем sql.

Кто-то у власти, Пожалуйста, удалите эту тему, она не достойна CP.


CHill60

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

MadMyche

Пожалуйста, обновите этот ответ с помощью "фиксированного" кода, используя Improve Solution виджет.
Хотя вы можете думать, что все это было глупо, другие могут извлечь из этого урок.

Ron Anders

Я только получил его, чтобы не генерировать и исключение. Поэтому я не опубликовал "исправление". Это не сработало, просто не умерло.

@ MadMyche

Я ввел в игру твой код, который ты выложил. Очень красиво и очень аккуратно. спасибо.
Однако после того, как все это будет сказано и сделано, где R=@Row генерирует то же самое: {"строка или двоичные данные будут усечены.\r\n оператор был прерван."} ошибка, как будто мы пытаемся назначить. Я не просто хочу обновить запись, которая соответствует строке.

Что касается того, что Row является char: изначально у меня был он как int, но json stringify в представлении обнулил его, так что все, что я получил для номера строки, было "". K, прекрасно, просто чтобы заставить это работать, чтобы я мог доказать свое мышление, быть varchar, и мы пока бросим его сюда, в контроллер. если вы погуглите эту ошибку, то каждый отдельный возврат-это проблема назначения. Вот это сравнение! Глупый SQL - который я утверждаю в шутку кстати. :-)

Рейтинг:
0

MadMyche

Ваша фактическая ошибка исходит от WHERE R = 'RowNumber' Это жестко заданное значение, а не переменная, которую вы присвоили переменной Функция rownumber.

Во-вторых, это проблема SQL-инъекции. Достаточно легко сделать это правильно с первого раза. И это также исправляет вышеупомянутую проблему с номером строки.

string RowNumber = i.ToString();

string UpdateCmd = "UPDATE [Monthly Service] SET Location=@Lo, Address=@Ad, Name=@Nm, Testing=@Ts, FillTime=@FT, Notes=@Ns, Code_Key=@CK, Phone=@Ph WHERE R=@Row";

SqlCommand ThisUpdateCommand = new SqlCommand(UpdateCmd, myConnection);

ThisUpdateCommand.Parameters.AddWithValue("@Lo", data.Location);
ThisUpdateCommand.Parameters.AddWithValue("@Ad", data.Address);
ThisUpdateCommand.Parameters.AddWithValue("@Nm", data.Name);
ThisUpdateCommand.Parameters.AddWithValue("@Ts", data.Testing);
ThisUpdateCommand.Parameters.AddWithValue("@FT", data.FillTime);
ThisUpdateCommand.Parameters.AddWithValue("@Ns", data.Notes);
ThisUpdateCommand.Parameters.AddWithValue("@CK", data.CodeKey);
ThisUpdateCommand.Parameters.AddWithValue("@Ph", data.Phone);
ThisUpdateCommand.Parameters.AddWithValue("@Row", RowNumber);

Я подвергаю сомнению схему базы данных, сохраняя INTs в виде строки (R:RowNumber) и нескольких имен столбцов, которые являются специальными/зарезервированными словами в SQL Server (имя, адрес, местоположение).

Последнее, что это происходит в течение FOR...NEXT Было бы намного меньше накладных расходов, если бы вы объявили команду SQL до а затем все, что вам нужно сделать, это переназначить параметры внутри цикла.
string UpdateCmd = "UPDATE [Monthly Service] SET Location=@Lo, Address=@Ad, Name=@Nm, Testing=@Ts, FillTime=@FT, Notes=@Ns, Code_Key=@CK, Phone=@Ph WHERE R=@Row";
SqlCommand ThisUpdateCommand = new SqlCommand(UpdateCmd, myConnection);

For(i=0.....)
{
   ThisUpdateCommand.Parameters.Clear();   
   ThisUpdateCommand.Parameters.AddWithValue("@Lo", data.Location);
   ThisUpdateCommand.Parameters.AddWithValue("@Ad", data.Address);
   ThisUpdateCommand.Parameters.AddWithValue("@Nm", data.Name);
   ThisUpdateCommand.Parameters.AddWithValue("@Ts", data.Testing);
   ThisUpdateCommand.Parameters.AddWithValue("@FT", data.FillTime);
   ThisUpdateCommand.Parameters.AddWithValue("@Ns", data.Notes);
   ThisUpdateCommand.Parameters.AddWithValue("@CK", data.CodeKey);
   ThisUpdateCommand.Parameters.AddWithValue("@Ph", data.Phone);
   ThisUpdateCommand.Parameters.AddWithValue("@Row", i.ToString());


Dave Kreskowiak

О том, как просто создать команду SQL и параметры вне цикла, а затем просто присвоить значения параметров внутри цикла.