Member 10696161 Ответов: 2

Импорт данных из excel в базу данных mysql - как вставить параметр cmd datetime в формате гггг-ММ-ДД чч:мм:СС


На этот раз я создал что-то вроде "листа 5" в книге excel:

https://i.stack.imgur.com/HGkKu.png

Когда я загружаю данные из этого excel в datagridview, я получаю это представление (в datagridview, конечно):
+--------+---------+---------+-------------+---------+----------+-----------+--------------------------+----------------+
    |FNAME |LNAME  |ORDER_DESC|ORDER_NUMBER|MODULE NAME|PROJECT NAME|AMOUNT_OF_PRODUCTS|   BEGIN_DATE     |    END_DATE     |
    +--------+---------+---------+---------+------------+-----------+----------+--------------------------------------------+
    |Jonhy | Blank | make sth |    e/1     |S-BOX      |    box     |       20         | 22.05.2019 06:32 | 22.05.2019 15:13|
    +--------+---------+---------+----------------------+-----------+----------+--------------------------------------------+


Затем я хотел бы вставить в базу данных MYSQL:

for (int i = 0; i < datagrdStatus_order.Rows.Count; i++)
{
MySqlCommand cmd = new MySqlCommand("INSERT INTO project1.order_status(ID_WORKER, ID_ORDER, ID_MODULE, ID_PROJECT, AMOUNT_OF_PRODUCTS, BEGIN_DATE, END_DATE) SELECT workers.ID_WORKER, orders.ID_ORDER, module.ID_MODULE, projects.ID, @AMOUNT_OF_PRODUCTS, @BEGIN_DATE, @END_DATE FROM project1.workers INNER JOIN project1.orders INNER JOIN project1.modules INNER JOIN project1.projects WHERE workers.FNAME = @FNAME AND workers.LNAME = @LNAME AND orders.ORDER_DESC = @ORDER_DESC AND orders.ORDER_NUMBER = @ORDER_NUMBER AND modules.NAME = @MODULES_NAME AND projects.PROJECT_NAME = @PROJECT_NAME", connection);
cmd.Parameters.Add("@FNAME", MySqlDbType.VarChar).Value = datagrdStatus_order.Rows[i].Cells[0].Value.ToString();
cmd.Parameters.Add("@LNAME", MySqlDbType.VarChar).Value = datagrdStatus_order.Rows[i].Cells[1].Value.ToString();
cmd.Parameters.Add("@ORDER_DESC", MySqlDbType.VarChar).Value = datagrdStatus_order.Rows[i].Cells[2].Value.ToString();
cmd.Parameters.Add("@ORDER_NUMBER", MySqlDbType.VarChar).Value = datagrdStatus_order.Rows[i].Cells[3].Value.ToString();
cmd.Parameters.Add("@MODULES_NAME", MySqlDbType.VarChar).Value = datagrdStatus_order.Rows[i].Cells[4].Value.ToString();
cmd.Parameters.Add("@PROJECT_NAME", MySqlDbType.VarChar).Value = datagrdStatus_order.Rows[i].Cells[5].Value.ToString();
cmd.Parameters.Add("@AMOUNT_OF_PRODUCTS", MySqlDbType.Int64).Value = datagrdStatus_order.Rows[i].Cells[6].Value.ToString();
cmd.Parameters.AddWithValue("@BEGIN_DATE", MySqlDbType.DateTime).Value = datagrdStatus_order.Rows[i].Cells[7].Value.ToString();
cmd.Parameters.AddWithValue("@END_DATE", MySqlDbType.DateTime).Value = datagrdStatus_order.Rows[i].Cells[8].Value.ToString();
cmd.ExecuteNonQuery();
}


Этот приведенный выше код вставляет большую часть данных в базу данных, но по as for as BEGIN_DATE и END_DATE я получаю исключение ошибки, что эти значения вставляются как NULL (в смысле это как 0000-00-00 00:00:00).

Эта беда здесь:
cmd.Parameters.AddWithValue("@BEGIN_DATE", MySqlDbType.DateTime).Value = datagrdStatus_order.Rows[i].Cells[7].Value.ToString();
cmd.Parameters.AddWithValue("@END_DATE", MySqlDbType.DateTime).Value = datagrdStatus_order.Rows[i].Cells[8].Value.ToString();


Я не знаю, что я могу сделать? Могу я рассчитывать на чью-нибудь помощь? Заранее спасибо.

Вот мой код:

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 MySql.Data.MySqlClient;
using System.Collections;
using System.Data.OleDb;
using System.IO;
using System.Configuration;

namespace ControlDataBase
{
    public partial class New_Tables : Form
    {
        public New_Tables()
        {
            InitializeComponent();
        }
        Form1 frm1 = (Form1)Application.OpenForms["Form1"];

        private void btnClose_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void ImportData_Click(object sender, EventArgs e)
        {
            using (OpenFileDialog ofd = new OpenFileDialog() { Filter = "Excel Files|*.xlsx;*.xlsm;*.xlsb;*.xltx;*.xltm;*.xls;*.xlt;*.xls;*.xml;*.xml;*.xlam;*.xla;*.xlw;*.xlr;", ValidateNames = true })
            {
                if (ofd.ShowDialog() == DialogResult.OK)
                {
                    FileInfo fi = new FileInfo(ofd.FileName);
                    string FileName1 = ofd.FileName;

                    string excel = fi.FullName;

                    if (ofd.FileName.EndsWith(".xlsx"))
                    {
                        StrConn = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + excel + ";Extended Properties=\"Excel 12.0;\"";
                    }

                    if (ofd.FileName.EndsWith(".xls"))
                    {
                        StrConn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + excel + ";Extended Properties=\"Excel 1.0;HDR=Yes;IMEX=1\"";
                    }
                    OleDbConnection oledbconn = new OleDbConnection(StrConn);

                    OleDbDataAdapter dta5 = new OleDbDataAdapter("SELECT * FROM [Sheet5$]", oledbconn);
                    oledbconn.Open();

                    DataSet dsole5 = new DataSet();
                    dta5.Fill(dsole5, "Sheet5$");
                    datagrdStatus_order.DataSource = dsole5.Tables["Sheet5$"];

                    oledbconn.Close();

                    MySqlConnection connection = new MySqlConnection("datasource=localhost;port=3306;username=root;password=");
                    connection.Open();

                    for (int i = 0; i < datagrdStatus_order.Rows.Count; i++)
                    {
                        MySqlCommand cmd = new MySqlCommand("INSERT INTO project1.order_status(ID_WORKER, ID_ORDER, ID_MODULE, ID_PROJECT, AMOUNT_OF_PRODUCTS, BEGIN_DATE, END_DATE) SELECT workers.ID_WORKER, orders.ID_ORDER, module.ID_MODULE, projects.ID, @AMOUNT_OF_PRODUCTS, @BEGIN_DATE, @END_DATE FROM project1.workers INNER JOIN project1.orders INNER JOIN project1.modules INNER JOIN project1.projects WHERE workers.FNAME = @FNAME AND workers.LNAME = @LNAME AND orders.ORDER_DESC = @ORDER_DESC AND orders.ORDER_NUMBER = @ORDER_NUMBER AND modules.NAME = @MODULES_NAME AND projects.PROJECT_NAME = @PROJECT_NAME", connection);
                        cmd.Parameters.Add("@FNAME", MySqlDbType.VarChar).Value = datagrdStatus_order.Rows[i].Cells[0].Value.ToString();
                        cmd.Parameters.Add("@LNAME", MySqlDbType.VarChar).Value = datagrdStatus_order.Rows[i].Cells[1].Value.ToString();
                        cmd.Parameters.Add("@ORDER_DESC", MySqlDbType.VarChar).Value = datagrdStatus_order.Rows[i].Cells[2].Value.ToString();
                        cmd.Parameters.Add("@ORDER_NUMBER", MySqlDbType.VarChar).Value = datagrdStatus_order.Rows[i].Cells[3].Value.ToString();
                        cmd.Parameters.Add("@MODULES_NAME", MySqlDbType.VarChar).Value = datagrdStatus_order.Rows[i].Cells[4].Value.ToString();
                        cmd.Parameters.Add("@PROJECT_NAME", MySqlDbType.VarChar).Value = datagrdStatus_order.Rows[i].Cells[5].Value.ToString();
                        cmd.Parameters.Add("@AMOUNT_OF_PRODUCTS", MySqlDbType.Int64).Value = datagrdStatus_order.Rows[i].Cells[6].Value.ToString();
                        cmd.Parameters.AddWithValue("@BEGIN_DATE", MySqlDbType.DateTime).Value = datagrdStatus_order.Rows[i].Cells[7].Value.ToString();
                        cmd.Parameters.AddWithValue("@END_DATE", MySqlDbType.DateTime).Value = datagrdStatus_order.Rows[i].Cells[8].Value.ToString();
                        cmd.ExecuteNonQuery();
                    }
                    connection.Close();
                    MessageBox.Show("The data are imported correctly");

                    loaddataalldatagridview();
                }
            }
        }

        private void loaddataalldatagridview()
        {
            frm1.loaddata5();
        }
    }
}


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

Я попробовал 2 метода:

1) попытка синтаксического анализа формата:

cmd.Parameters.AddWithValue("@BEGIN_DATE", MySqlDbType.DateTime).Value = datagrdStatus_order.Rows[i].Cells[7].Value.ToString("yyyy-MM-dd HH:mm:ss");
cmd.Parameters.AddWithValue("@END_DATE", MySqlDbType.DateTime).Value = datagrdStatus_order.Rows[i].Cells[8].Value.ToString("yyyy-MM-dd HH:mm:ss");


Но у меня есть ошибка:

Цитата:
Никакая перегрузка метода "ToString" не принимает следующее количество аргументов: "1"


2) присвоить 2 последние строки коды по "практическое руководство для" петли, как, что:

//if (datagrdStatus_zl.Rows[i].Cells[7].Value is DateTime)
//   cmd.Parameters.AddWithValue("@DATA_ROZPOCZECIA", MySqlDbType.DateTime).Value = (DateTime)datagrdStatus_zl.Rows[i].Cells[7].Value;
//if (datagrdStatus_zl.Rows[i].Cells[8].Value is DateTime)
//    cmd.Parameters.AddWithValue("@DATA_ZAKONCZENIA", MySqlDbType.DateTime).Value = (DateTime)datagrdStatus_zl.Rows[i].Cells[8].Value;


После запуска приложения я тоже получаю ошибку:

Цитата:
"Неправильная проекция из элемента 'DateTime' в элемент 'Int32'.

2 Ответов

Рейтинг:
1

lmoelleb

yyyy-MM-dd HH:mm:ss это формат "для потребления человеком". Это не очень хороший формат для базы данных и не очень хороший формат для программы. И это, конечно, не очень хороший формат для программы для связи с базой данных. Это даже не очень хороший формат для Excel, поэтому, скорее всего, это не то, что хранится в вашем листе excel - я ожидаю, что он будет хранить дату/время и использовать текущие настройки пользователя (или настройки форматирования ячеек) для преобразования этого значения в строковое представление при рендеринге значения в ячейке.

Вы должны пройти через эти шаги один за другим. Не переходите от одного шага к другому, пока не будете уверены, что он завершен:

Убедитесь, что ваша база данных настроена на хранение даты (или поля datetime)

Убедитесь, что Вы читаете DateTime или DateTimeOffset из Excel, а не строку (проверьте с помощью отладчика). Если вы не можете заставить это работать, погуглите эту конкретную проблему: чтение datetime из Excel, а не как сохранить его в своей базе данных. Всегда гуглите, как решить один шаг в вашей проблеме, а не все решение, которое вы пытаетесь построить.

Проверьте часовой пояс, как и ожидалось. Датавремя придется либо системе местного или мирового времени. DateTimeOffset может указывать точное смещение от UTC и, следовательно, представлять любое местное время (и UTC, конечно, это просто смещение 0).

Убедитесь, что вы добавили DateTime или DateTimeOffset в параметры команды SQL. Не вызывайте ToString на нем. Преобразование между ними .Чистый родной формат даты и времени формат даты времени база будет сделано за вас автоматически.

Проверьте данные в базе данных. Помните, что он не будет храниться в yyyy-MM-dd HH:mm:ss формат, поэтому, если он отображается по-другому, это не значит, что он хранится неправильно. Это просто означает, что любое программное обеспечение, которое вы используете для проверки значений, выбирает для отображения его в другом формате. :)

Если вы застряли, то попросите помощи о конкретном шаге.


Рейтинг:
0

mohamedenew

//Попробуйте использовать такой метод ...
cmd.параметры.AddWithValue("@DATA_ROZPOCZECIA", (DateTime)datagrdStatus_zl.Rows[i].Ячейки[7].Значение);

// в противном случае я могу помочь вам на вашем компьютере ..


Member 10696161

Я протестировал эту строку и вставил их все но после этого я вызвал исключение na:

System.NullReferenceException: "ссылка на объект не была установлена на экземпляр объекта."

и это видно в строке кода:

cmd.Parameters.Add("@FNAME", MySqlDbType.VarChar).Value = datagrdStatus_zl.Rows[i].Ячейки[0].Значение.Метод toString();

Можете ли вы помочь, как решить эту проблему дальше? Я должен изменить параметры.Добавить в Параметры.AddWithValue?

mohamedenew

Может быть datagrdStatus_zl.Rows[i].Ячейки[0].значение не имеет значения
datagrdStatus_zl.Строки[я].Ячейки[0].значение!=null ?datagrdStatus_zl.Строки[я].Ячейки[0].Значение.Метод toString():"";