В C# &амп; с SQL и применение
Я хотел бы попросить некоторую помощь в создании формы входа и выхода на основе c#, которая использует локальную базу данных sql для хранения людей, входящих и выходящих снова
Нет никаких ошибок, однако форма не будет принимать никаких данных, и выпадающее окно формы выхода не будет заполняться именами людей из таблицы persons я хотел бы помочь сделать эту работу, пожалуйста.
Мне нужна серьезная помощь, чтобы убедиться, что:
данные принимаются из формы входа в базу данных по столбцам имени, времени входа и организации
после этого сохранить
затем при выходе из системы combobox заполняется всеми именами людей которые вошли в систему
Затем чтобы выйти из таблицы используйте имя в выпадающем списке чтобы найти связанный с ним столбец тайм аут и вставить в него тайм аут
Затем для этого требуется вычисляемый столбец, в котором таблица sql будет отображать время хранения каждого пользователя
Затем это должно быть отображено в виде графика на странице администратора
Если у кого-то есть какие-либо примеры чего-то подобного или он хочет работать над моей программой, не могли бы они написать мне по адресу: [адрес электронной почты удален] (только электронная почта, к которой у меня есть доступ в менуэте)
Что я уже пробовал:
Мой текущий код
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Configuration; using System.Data.SqlClient; namespace SignInAndOutForm { public partial class SignIn : Form { bool dataAccepted = false; string connectionString = (@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Register.mdf;Integrated Security=True"); //mainly used as a note rather than placeholder // also uses this as the link to the DATABASE SqlConnection Connection; public SignIn() { InitializeComponent(); } private void textBox2_TextChanged(object sender, EventArgs e) { //allows for automated time when clicked provided by local system string AutoTime = DateTime.Now.ToString("HH:mm"); textBox2.Text = AutoTime; } private void SignIn_Load(object sender, EventArgs e) { //Loads oddly enough } private void button1_Click(object sender, EventArgs e) { //ACCEPT SOME DATA, by calling the subroutine AcceptData(); // then close the form, it hides it to stop if (dataAccepted == true) { textBox1.Clear(); textBox2.Clear(); textBox3.Clear(); this.Hide(); } } // this tries to create a connection to the current database of PEOPLE and then tried to input the data required private void AcceptData() { using (Connection = new SqlConnection(connectionString)) { Connection.Open(); using (SqlDataAdapter adapter = new SqlDataAdapter("UPDATE ", Connection))//INPUT changed to INSERT Allowing data to be accepted //keep for a later date INSERT INTO Person SELECT * FROM PERSON WHERE TimeOut IS NULL { DataTable RegisterTable = new DataTable(); adapter.Fill(RegisterTable); //Initialisation fixed using .open() command string name = textBox1.Text; string organisation = textBox3.Text; DateTime Time = DateTime.Parse(textBox2.Text); string strDateTimeIn = Time.ToString("yyyy-MM-dd HH:mm:ss.ffff"); string query = "INSERT INTO Person (Name,Organisation,TimeIn) VALUES('" + name + "','" + organisation + "','" + strDateTimeIn + "')"; SqlCommand SignIn = new SqlCommand(query, Connection); SignIn.ExecuteNonQuery(); // this should be fine currently dataAccepted = true; } } } } }
выход
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Configuration; using System.Data.SqlClient; namespace SignInAndOutForm { public partial class SignOut : Form { public SignOut() { InitializeComponent(); BindComboName(); } private void textBox1_TextChanged(object sender, EventArgs e) { string AutoTime = DateTime.Now.ToString("HH:mm"); textBox1.Text = AutoTime; } private void button1_Click(object sender, EventArgs e) { if (textBox1.Text == null || textBox1.Text == "") { MessageBox.Show("Please click the time box and press a key"); } else { DateTime timeOut = DateTime.Parse(textBox1.Text); string strDateTimeOut = timeOut.ToString("yyyy-MM-dd HH:mm:ss.ffff"); string queryOut = "UPDATE Person SET TimeOut = '" + strDateTimeOut+ "' FROM Person p1 WHERE p1.TimeOut IS NULL AND p1.TimeIn = (SELECT MAX(TimeIn) FROM Person p2 WHERE p2.Name = p1.Name AND p2.TimeOut IS NULL)" ; } // ACCEPT SOME DATA textBox1.Clear(); this.Hide(); } private void SignOut_Load(object sender, EventArgs e) { } private void BindComboName() { using (SqlConnection sqlConnection = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Register.mdf;Integrated Security=True")) { SqlCommand sqlCmd = new SqlCommand("SELECT Name FROM Person WHERE TimeOut IS NULL GROUP BY Name ORDER BY Name", sqlConnection); sqlConnection.Open(); SqlDataReader sqlReader = sqlCmd.ExecuteReader(); while (sqlReader.Read()) { comboBox1.Items.Add(sqlReader["Name"].ToString()); } sqlReader.Close(); } } } }
Member 13435649
Если вы хотите, чтобы файл был отправлен вам по электронной почте, я могу сделать это для вас, чтобы помочь отредактировать его и объяснить, как все работает, я хотел бы получить любое объяснение с комментариями, пожалуйста, чтобы помочь мне понять его и детали того, что и как работают части кода, заранее спасибо
Том
Richard Deeming
Ваш код уязвим для SQL-инъекция[^]. НИКОГДА используйте конкатенацию строк для построения SQL-запроса. ВСЕГДА используйте параметризованный запрос.
Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов / OWASP[^]
Richard MacCutchan
В вашем коде может и не быть ошибок компиляции, но это ничего не значит.
Почему вы используете текстовое поле для даты и времени? Используйте элемент управления календарем, чтобы всегда получать достоверные данные. Кроме того, вы изменяете текст Textbox2 внутри обработчика событий textBox2_TextChanged, поэтому вы автоматически запускаете новое событие.
Graeme_Grant
Пора научиться пользоваться отладчиком. Отладка так же важна, как и знание того, как создавать код. Если вы не понимаете, как отлаживать, это видео покажет вам, как это сделать.: Базовая отладка с помощью Visual Studio 2010-YouTube[^]
Кроме того, никогда не выдавайте свой адрес электронной почты на таком публичном форуме, как этот, если только вы не хотите быть перегружены спамом!
Member 13435649
Спасибо всем вам за ввод данных, но я хотел бы знать, как сначала принять данные в таблицу SQL, так как по какой-то причине это не работает, как только это будет сделано, я сосредоточусь на том, чтобы убедиться, что она не уязвима для SQL-инъекции, и я благодарю вас за помощь мне в этом
Заранее спасибо том
Richard MacCutchan
Возможно, вам поможет изучение нескольких учебников по SQL.