Goran Bibic Ответов: 2

Нужна строка, если har row показать значение, иначе будет ----


Нужна строка, если har row показать значение, иначе будет ----

Я попробую это сделать
В чем я ошибся?

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

string redni_broj = "";
           using (SqlConnection openCon8 = new SqlConnection(Con))
           {
               SqlDataReader reader8;
               SqlCommand cmd8 = new SqlCommand();
               cmd8.CommandText = "select FORMAT(redni_broj, '00000') from mp_faktura_lista where id=" + id_fakture;
               cmd8.Connection = openCon8;
               openCon8.Open();
               reader8 = cmd8.ExecuteReader();
               if (reader8.HasRows)
               {
                   while (reader8.Read())
                   {
                       redni_broj = reader8[0].ToString();
                   }
               }
               else
               {
                   redni_broj = "-----";
               }
               openCon8.Close();
           }

MadMyche

Пожалуйста, обновите свой вопрос, используя Улучшить Вопрос виджет для добавления в приложение:
1. Что такое тип данных redni_broj- Какова действительная стоимость?
2. что возвращает эта функция в данный момент? Есть ли ошибки?

Goran Bibic

1. Какой тип данных redni_broj? int
Какова действительная стоимость? acutal имеет значение null
2. что возвращает эта функция в данный момент? добавляемся если это значение null (пусто), если имеет значение exmp 1 (запись 00001)
Есть ли ошибки? Нет никаких ошибок

2 Ответов

Рейтинг:
16

OriginalGriff

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

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:

SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?

Во-вторых, вам не нужен while - ваш код просто установит его на последнее значение в считывателе, так что вам, вероятно, лучше использовать вместо него if:
reader8 = cmd8.ExecuteReader();
if (reader8.Read())
{
   redni_broj = reader8[0].ToString();
}
else
{
   redni_broj = "-----";
}
Или даже просто
reader8 = cmd8.ExecuteReader();
redni_broj = reader8.Read() ? reader8[0].ToString() : "-----";


Goran Bibic

reader8 = cmd8.Метода executereader();
redni_broj = reader8.Read() ? reader8[0].ToString() : "-----";

Это не работает результат равен нулю

OriginalGriff

Нет, это не так: проверьте отладчик, и вы увидите.

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

Что показывает вам отладчик? И вы исправили проблему SQL-инъекции во всем своем приложении?

Goran Bibic

Если положить значение в db 1 результат будет 00001
Если поставить значение Инд дБ нулевой результат пустой (надо быть -----)

OriginalGriff

И что же показывает вам отладчик, что происходит?

Goran Bibic

Я решаю

reader8 = cmd8.Метода executereader();
пока (reader8.Читать())
{
if (reader8[0] != null && reader8[0] != DBNull.Ценность)
{
redni_broj = reader8.GetString(0);
}
еще
{
redni_broj = " -----";
}
}
openCon8.Рядом();

И работать

Рейтинг:
1

MadMyche

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

string qry = "SELECT Format(redni_broj, '00000') FROM mp_faktura_lista WHERE id= @id";
SqlCommand cmd8 = new SqlCommand(qry, openCon8);
cmd8.Parameters.AddWithValue("@id", id_fakture);
SqlDataReader и ExecuteReader
Ваш код предназначен для возврата одного и только одного значения; нет никаких причин использовать этот метод, скорее вы должны использовать ExecuteScalar() метод
openCon8.Open();
var result = cmd8.ExecuteScalar();
if (result != null) { redni_broj = result.ToString(); }
else { redni_broj = "-----"; }
openCon8.Close();
Мое личное предпочтение
Я бы рекомендовал не использовать Format() функция в SQL. Причина в том, что фактический формат, который показывается, является уровень представления беспокойства и не должно быть в бизнес-логике. Другая веская причина заключается в том, что функции sting в SQL не так эффективны, как в прикладном коде.
Что бы я сделал, так это просто вернул значение как есть (или нулевой) и использовать код приложения для его форматирования. Вы уже вызываете метод ToSting (), поэтому можете также использовать его метод перегрузки.

Рекомендации:
Свойство sqlcommand.Метод ExecuteScalar (System.Data.SqlClient) | Microsoft Docs[^]