Member 13435649 Ответов: 1

В 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 MacCutchan

В вашем коде может и не быть ошибок компиляции, но это ничего не значит.

Почему вы используете текстовое поле для даты и времени? Используйте элемент управления календарем, чтобы всегда получать достоверные данные. Кроме того, вы изменяете текст Textbox2 внутри обработчика событий textBox2_TextChanged, поэтому вы автоматически запускаете новое событие.

Graeme_Grant

Пора научиться пользоваться отладчиком. Отладка так же важна, как и знание того, как создавать код. Если вы не понимаете, как отлаживать, это видео покажет вам, как это сделать.: Базовая отладка с помощью Visual Studio 2010-YouTube[^]

Кроме того, никогда не выдавайте свой адрес электронной почты на таком публичном форуме, как этот, если только вы не хотите быть перегружены спамом!

Member 13435649

Спасибо всем вам за ввод данных, но я хотел бы знать, как сначала принять данные в таблицу SQL, так как по какой-то причине это не работает, как только это будет сделано, я сосредоточусь на том, чтобы убедиться, что она не уязвима для SQL-инъекции, и я благодарю вас за помощь мне в этом

Заранее спасибо том

Richard MacCutchan

Возможно, вам поможет изучение нескольких учебников по SQL.

1 Ответов

Рейтинг:
0

Patrice T

string query = "INSERT INTO Person (Name,Organisation,TimeIn) VALUES('" + name + "','" + organisation + "','" + strDateTimeIn + "')";

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