Member 14630006 Ответов: 1

Как решить значение не может быть нулевым


это мой код и он работает нормально у меня есть 10 контактов и когда я нажимаю кнопку lbl19
увеличьте, чтобы показать следующий идентификатор, но когда lbl19 находится на 11 выше идентификатора контактов, форма останавливается и получает значение ошибки не может быть нулевым, я пытаюсь решить его, как когда проект получает нулевое значение, он показывает сообщение, что это Макс контактов ur, но не работает, можете ли вы мне помочь? и я получаю ошибку на ImageByte.value ik это неправильно, но это то, что я получаю

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

if (ImageByte.Value = null)
           {
               MessageBox.Show("This is max of ur contacts");
           }
           else
           {
               string sql = "select Attachments.FileData from Contacts where ID =" + lbl19.Text;//Attachments.FileData
               OleDbCommand vcom = new OleDbCommand(sql, cn);
               ImageByte = (byte[])vcom.ExecuteScalar(); //contains 20 extra bytes
               MemoryStream MemStream = new MemoryStream(ImageByte.Skip(20).ToArray()); //Read bytes starting at position 20
               Image image = Image.FromStream(MemStream); //Will work now
               pictureBox1.Image = image;
           }

Richard Deeming

string sql = "select Attachments.FileData from Contacts where ID =" + lbl19.Text;

Не делай этого так!

Пока ты здесь возможно безопасно в этом случае, поскольку пользователь (предположительно) не может изменить значение вашей метки, использование конкатенации строк для построения SQL-запросов может и приведет к SQL-инъекция[^] факторы уязвимости.

НИКОГДА используйте конкатенацию строк для построения SQL-запроса. ВСЕГДА используйте параметризованный запрос.

const string sql = "select Attachments.FileData from Contacts where ID = ?";
using (OleDbCommand vcom = new OleDbCommand(sql, cn))
{
    vcom.Parameters.AddWithValue("ID", lbl19.Text);
    ImageByte = (byte[])vcom.ExecuteScalar();
}


Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов | OWASP[^]

Richard Deeming

Кроме того, сделайте себе одолжение и дайте своим элементам управления значимые имена, а не принимайте имена Visual Studio по умолчанию.

Конечно, вы можете вспомнить, что lbl42 представляет сегодня но через шесть недель, когда вы вернетесь, чтобы отредактировать свой код, вы забудете. Тогда как если это называется что-то вроде lblTheAnswer- по крайней мере , у тебя будет ключ к разгадке. :)

1 Ответов

Рейтинг:
0

Richard MacCutchan

if (ImageByte.Value = null) // *** this sets ImageByte.Value to null.
// it should be 
if (ImageByte.Value == null) // equality test, not assignment


Member 14630006

второй тестовый я получил ошибку по значению

0x01AA

Но if (ImageByte.Value = null) даже не компилировался бы с помощью c#. Во всяком случае, 5.

Richard MacCutchan

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

Member 14630006

как добраться до значения null эта ошибка сказала

Richard MacCutchan

Измените оператор на двойной == как я вам уже показывал. Вам действительно нужно зафиксировать эти операторы в своей голове, чтобы избежать таких простых ошибок, как эта. Это то, что мы все делали в прошлом, но тщательное чтение кода является полезным методом поиска очевидных ошибок.

Member 14630006

я так и сделал я сказал вам второй я имею в виду двойной но ошибка по значению все еще

Richard MacCutchan

Какая ошибка? Пожалуйста, помните, что мы не можем видеть вас на экране, так сказать - У меня ошибка" это нам ничего не говорит. Вам нужно четко объяснить, что такое сообщение об ошибке и в какой именно строке оно появляется.

Member 14630006

ошибка включена (ImageByte.Value == null) ERROR = 'System.Array' не содержит определения для 'Value' и никакого метода расширения 'Value', принимающего первый аргумент типа 'System.Массив' может быть найден (пропущена директива using или ссылка на сборку?)

Richard MacCutchan

Почему вы пытаетесь сослаться на свойство, которого не существует? Перейдите к документации для SystemArray и посмотрите, какие фактические свойства там доступны.

Member 14630006

хорошо спасибо