Member 13435649 Ответов: 1

Как бы я получил эту форму входа для приема данных в таблицу SQL


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

Как бы я мог заставить свою форму входа принимать данные из текстовых полей в базу данных SQL для хранения в соответствующих столбцах: имя,организация и время??
Мой текущий код

Обновлено для включения параметризованных запросов

Новые проблемы: System.Data.SqlClient. SqlException: 'преобразование не удалось при преобразовании даты и/или времени из символьной строки.' @ 'var NamRes = CmdDatabase.ExecuteReader (); ' Строка


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
        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");
            TxtbxTimeIn.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)
            {
                TxtbxName.Clear();
                TxtbxTimeIn.Clear();
                TxtbxOrg.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()
        {
            SqlConnection Mycon = new SqlConnection(connectionString);
            string Query = "INSERT INTO dbo.Person(Name,Organisation,TimeIn) VALUES('@Name','@Organisation','@TimeIn');";
            SqlConnection ConDB = new SqlConnection(connectionString);
            SqlCommand CmdDatabase = new SqlCommand(Query, ConDB);
            {
                ConDB.Open();
                var NameParam = new SqlParameter("Name", SqlDbType.VarChar);
                NameParam.Value = TxtbxName.Text;
                var OrgParam = new SqlParameter("Organisation", SqlDbType.VarChar);
                OrgParam.Value = TxtbxOrg.Text;
                var TimeInParam = new SqlParameter("TimeIn", SqlDbType.VarChar);
                TimeInParam.Value = TxtbxTimeIn.Text;
                CmdDatabase.Parameters.Add(NameParam);
                var NamRes = CmdDatabase.ExecuteReader();
                CmdDatabase.Parameters.Add(OrgParam);
                var OrgRes = CmdDatabase.ExecuteReader();
                CmdDatabase.Parameters.Add(TimeInParam);
                var TimeInRes = CmdDatabase.ExecuteReader();

            }

            SqlDataReader SqlReader;
            try
            {
                ConDB.Open();
                SqlReader = CmdDatabase.ExecuteReader();
                MessageBox.Show("Added to the database");
                while(SqlReader.Read())
                {
                    
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

        }
    }


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

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

OriginalGriff

"я знаю, что это зависит от sql-инъекций, однако это будет исправлено позже"
Нет, это не так - но если бы это было так, это не было бы исправлено. Люди говорят это все время, но никогда не возвращаются, чтобы сделать это. Заведите привычку всегда использовать параметризованные запросы, и этого не произойдет. Кроме того, чертовски легче увидеть, что ваш код правильный или неправильный, прежде чем вы его запустите...

Мы не можем комментировать ваши предыдущие неудачи, потому что у нас нет кода, который вы использовали, который потерпел неудачу!
Покажи нам это, и у нас появится шанс помочь тебе-без этого? На самом деле мы не так уж много можем сделать.
Используйте виджет" улучшить вопрос", чтобы отредактировать свой вопрос и предоставить более подробную информацию.

Richard MacCutchan

Посмотрите на свой код.
1. Откройте соединение с базой данных.
2. Создайте новый пустой набор данных, который будет уничтожен, как только этот блок кода достигнет конца.
3. Дисплей бессмысленное сообщение.
4. Закройте базу данных.

Чего именно вы ожидали от этого?

Member 13435649

это было просто для того, чтобы проверить, что он подключен к базе данных, это была форма отладки на моей половине

Richard MacCutchan

Так какое это имеет отношение к вашему вопросу?

Member 13435649

Ничего такого, что я не хотел бы держать в себе, теперь я обновил этот код

Richard MacCutchan

Вы используете конкатенацию строк, чтобы сделать свой SQL-оператор, который вам уже сказали не делать. Начните с того, что вы хотите продолжить, и используйте правильные параметризованные запросы. И не просто предполагайте, что ваши текстовые поля содержат допустимые данные. Добавьте несколько проверок, чтобы убедиться, что входные данные действительны, и поместите их (возможно, просто значения) в параметры команды.

Member 13435649

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

Richard MacCutchan

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

Nelek

- почти?

Member 13435649

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

Вот почему я прошу так много помощи, поскольку у меня есть от 6 месяцев до года опыта работы с c# и около 2 недель с SQL

Richard MacCutchan

Что ж, мне очень жаль, что вам поручили сделать то, что выходит за рамки ваших навыков. Однако здесь не место изучать ни Windows Forms, ни C#, ни SQL. Вам нужно вернуться к своему менеджеру, объяснить свои трудности и получить некоторую местную помощь. Шансы на то, что вы сделаете это правильно, разместив здесь вопросы, не очень высоки.

Member 13435649

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

Richard MacCutchan

И почему вы пытаетесь выполнить инструкцию INSERT с помощью DataReader. Как я уже предлагал в вашем другом вопросе, вам следует потратить некоторое время на изучение некоторых учебных пособий по SQL (и Windows Forms).

1 Ответов

Рейтинг:
1

Patrice T

Я бы начал с замены

string Query = "INSERT INTO dbo.Person(Name,Organisation,TimeIn) VALUES('@Name','@Organisation','@TimeIn');";

с
string Query = "INSERT INTO dbo.Person(Name,Organisation,TimeIn) VALUES(@Name,@Organisation,@TimeIn);";

и посмотрим, что будет дальше.

SqlReader = CmdDatabase.ExecuteReader();

Обратите внимание, что "запрос вставки" не возвращает набор данных.
Как уже заметил Ричард.