Adel Sulami Ответов: 2

Как я могу выбрать значение из таблицы и сохранить его в переменной?


Привет ребята,

пожалуйста, мне нужна ваша помощь. У меня есть код, который получает максимальное значение из таблицы запросов и сохраняет возвращенное значение в переменную. затем используйте эту переменную с инструкцией insert для сохранения в таблице Vacation, чтобы использовать ее, когда я хочу отобразить запросы. Вот мой код

<pre lang="c#">
использование системы;
использование системы.Коллекции.Общий;
использование System.Linq;
использование системы.Сеть;
использование System.Web.UI;
используя системы.Веб.Пользовательского интерфейса.WebControls;
использование System.Data;
используя системы.Данных.Поставщики sqlclient;
использование системы.Конфигурация;

общественный разделяемого класса Vavation : система.Веб.Пользовательского интерфейса.Страницы
{
Dbclass db = новый Dbclass();
строка s = "";
строка d = "";
int R;
string firstVariable = строка.Пустой;
охраняемых недействительными в(объект отправителя, EventArgs в электронной)
{
пробовать
{
если(!IsPostBack)
{
tbid.Text = Session["uid"].Метод toString();
лблдепт.Text = Session["Did"].Метод toString();
lblid.Текст = tbid.Текст;
строка s = "Select * From Employee where National_ID='" + lblid.Текст + "'";
DataTable dt = db.getTable(s);
if (dt != null && dt.строки.Count > 0)
{
tbid.Text = dt.Rows[0]["National_ID"].Метод toString();
tbname.Text = dt.Rows[0]["FirstName"].ToString() + '' + dt.Rows[0]["фамилия"].Метод toString();
лблдепт.Text = dt.Rows[0]["Dept_ID"].Метод toString();
}
строка d = "SELECT Balance FROM Vacation WHERE (National_ID = '" + lblid.Текст + "') и (начальная дата =(выбрать Макс(начальная дата) из отпуска, где (National_ID ='" + lblid.Текст + "'))) И (баланс = (выбрать минимум(остаток) из отпуска, где (National_ID ='" + lblid.Текст + "')))";
DataTable t = db.getTable(d);
if (t != null && t.строки.Count > 0)
{
lbldays.Text = t.Rows[0]["баланс"].Метод toString();
}
}

}
поймать(исключение бывший)
{
лберр.Текст = ex.сообщение;
}
}

охраняемых недействительными btnadd_Click(объект отправителя, EventArgs в электронной)
{
AddVaction();
GetMax();
инт сохранилась = конвертировать.ToInt32(lbldays.Текст);
Начать датавремя = Датавремя.Синтаксический анализ(tbstartvaca.Текст).Дата;
если (сохранилась &ЛТ;= 30 &&усилителя; сохранилась и gt;= 0 &амп;&амп; старт &ГТ;= Датавремя.Сейчас)
{
Сроки remaindate;
DateTime end = Дата-Время.Синтаксический анализ(tbendvaca.Текст).Дата;
Отпуск период = период.Синтаксический анализ(lbldays.Текст);
int Balance = (int)отпуск.TotalDays;
TimeSpan общее;
if (start > end)
{
лберр.Текст = "пожалуйста, проверьте еще раз дату начала";
вернуть;
}

remaindate = конец - начало;
int days = (int)remaindate.TotalDays;
лберр.Текст = "вы ушли с" + remaindate.Всего дней + "дней.";
итого = отпуск - остаток;
int T = (int)итого.TotalDays;
lbldays.Текст = "вы ушли с" + итого.Всего дней + "дней.";

с = "вставить в отпуске (баланс, National_ID, NoOfDays, начальная дата, конечная дата, dept_id, в, Req_date, Req_ID) значения ('" + Т + "', '" + lblid.Текст + "', '" + дни + "', '" + tbstartvaca.Текст + "', '" + tbendvaca.Текст + "', '" + lblDept.Текст + "', '" + Дата-Время.Теперь + "', '" + R + "')";
дБ.Бежать(с);

}
еще
{
лберр.Текст = "у вас нет остатка отпуска или начала отпуска меньше даты Дня ";
}

}

частная пустота GetMax()
{
d = "выберите MAX(Req_ID) из запроса";
lblReq.Текст = d;
DataTable dt = db.getTable(d);
if (dt != null && dt.строки.Count > 0)
{
R = Преобразовать.ToInt32(dt.Rows[0]["Req_ID"].Метод toString());

}

}

частный недействительными AddVaction()
{
s = "вставить в запрос (National_ID, Type_Req, Dept_ID,Date) значения ('" + lblid.Текст + "', 'отпуск','" + lblDept.Текст + "', '" + Дата-Время.Сейчас + "')";
дБ.Бежать(с);

}
}

когда я запускаю код, я получаю Max Req_ID "ноль", хотя код работает без ошибок, и Max Req_ID должен быть последним значением.

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

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

Я перепробовал много кодов, но не смог получить никакой ценности.

2 Ответов

Рейтинг:
12

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;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

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

А на веб-сайте? Где любой человек в мире может получить доступ? Вы должны исправить это немедленно во всем вашем программном обеспечении - или ваша БД (и сайт, который она обслуживает) не будет длиться долго...


Laxmidhar tatwa technologies

Удачное решение

Рейтинг:
11

Dave Sexton

Глядя на этот код, я почти уверен, что проблема заключается в коде.

У меня нет решения для вас, но я дам вам несколько практических советов, которые могут помочь вам найти решение:
• Ваш код уязвим для атаки SQL - инъекций-параметризуйте свои входные данные и не полагайтесь на них, чтобы быть безопасным для использования в вашем SQL-операторе.
• Переключитесь на использование ORM.
• Ваши методы слишком "заняты" - пусть каждый метод делает только одну вещь. Лучше иметь более простые методы, чем только несколько действительно сложных.
• Метод GetMax() пусто - А давайте его вместо того, чтобы возвращать значение.