Проблема с форматом DateTime C# - PullRequest
0 голосов
/ 20 апреля 2020

Мне нужна помощь с моим кодом. Я хочу вставить таблицу данных в таблицу Sql. Я написал код для этого, но я получаю ошибку формата, которую я не могу решить? В моей таблице SQl установлен формат: гггг-мм-дд чч: мм: сс: 000, но в формате данных у меня есть формат: 15.04.2020 06:01:33

Я получено сообщение об ошибке:

Тип исключения коммитов: System.FormatException Сообщение: строка '04 / 15/2020 06:01:33 AM 'не была распознана как действительный DateTime.

using System;
using System.Data;
using System.Data.SqlClient;
using System.Globalization;
    DataTable dt = new DataTable();


        dt.Columns.Add("BP_Queue");
        dt.Columns.Add("BP_Key");
        dt.Columns.Add("BP_Status");
        dt.Columns.Add("BP_Loaded");
        dt.Columns.Add("BP_Deferred");
        dt.Columns.Add("BP_Completed");
        dt.Columns.Add("BP_Excepted");
        dt.Columns.Add("BP_Exception_Type");
        dt.Columns.Add("BP_Exception_Reason");


        DataRow r = dt.NewRow();
        r[0] = "test";
        r[1] = "123";
        r[2] = "Completed";
        r[3] = "4/15/2020 06:01:33 AM";
        r[4] = null;
        r[5] = "4/15/2020 06:01:33 AM";
        r[6] = null;
        r[7] = null;
        r[8] = null;

        dt.Rows.Add(r);

        string connectionstring = null;
        string username = @"test";
        string password = @"1234";
        string servername = @"server";
        string database = "test";
        string sqlQuery = "INSERT INTO RPA_QUEUES_BASIC_DATA (BP_Queue,BP_Key,BP_Status,BP_Loaded,BP_Deferred,BP_Completed,BP_Excepted,BP_Exception_Type,BP_Exception_Reason) VALUES (@BP_Queue,@BP_Key,@BP_Status,@BP_Loaded,@BP_Deferred,@BP_Completed,@BP_Excepted,@BP_Exception_Type,@BP_Exception_Reason);";
        SqlConnection conn;
        SqlTransaction transaction;
        connectionstring = "Server="+servername+";Database="+ database + ";User Id="+username+";Password="+password+";";

        using (conn = new SqlConnection(connectionstring))
        {
            conn.Open();
            transaction = conn.BeginTransaction("Transaction");
            string customerInsert = sqlQuery;

            using (SqlCommand query = new SqlCommand(customerInsert))
            {

                query.Connection = conn;
                query.Transaction = transaction;
                query.Parameters.Add("@BP_Queue", SqlDbType.NVarChar, 255);
                query.Parameters.Add("@BP_Key", SqlDbType.NVarChar, 255);
                query.Parameters.Add("@BP_Status", SqlDbType.NVarChar, 50);
                query.Parameters.Add("@BP_Loaded", SqlDbType.DateTime);
                query.Parameters.Add("@BP_Deferred", SqlDbType.DateTime);
                query.Parameters.Add("@BP_Completed", SqlDbType.DateTime);
                query.Parameters.Add("@BP_Excepted", SqlDbType.DateTime);
                query.Parameters.Add("@BP_Exception_Type", SqlDbType.NVarChar, 255);
                query.Parameters.Add("@BP_Exception_Reason", SqlDbType.NVarChar,-1);
                try
                {
                    using (SqlTransaction tr = transaction)
                    {
                        foreach (DataRow row in dt.Rows)
                        {
                            //query.Parameters.Clear();
                            query.Parameters["@BP_Queue"].Value = row["BP_Queue"];
                            query.Parameters["@BP_Key"].Value = row["BP_Key"];
                            query.Parameters["@BP_Status"].Value = row["BP_Status"];
                            query.Parameters["@BP_Loaded"].Value = row["BP_Loaded"].ToString() == "" ? DateTime.ParseExact("1/01/1900 00:00:00 AM", "M/dd/yyyy H:mm:ss tt", CultureInfo.InvariantCulture) : DateTime.ParseExact(row["BP_Loaded"].ToString(), "M/dd/yyyy H:mm:ss tt", CultureInfo.InvariantCulture);
                            query.Parameters["@BP_Deferred"].Value = row["BP_Deferred"].ToString() == "" ? DateTime.ParseExact("1/01/1900 00:00:00 AM", "M/dd/yyyy H:mm:ss tt", CultureInfo.InvariantCulture) : DateTime.ParseExact(row["BP_Deferred"].ToString(), "M/dd/yyyy H:mm:ss tt", CultureInfo.InvariantCulture);
                            query.Parameters["@BP_Completed"].Value = row["BP_Completed"].ToString() == "" ? DateTime.ParseExact("1/01/1900 00:00:00 AM", "M/dd/yyyy H:mm:ss tt", CultureInfo.InvariantCulture) : DateTime.ParseExact(row["BP_Completed"].ToString(), "M/dd/yyyy H:mm:ss tt", CultureInfo.InvariantCulture);
                            query.Parameters["@BP_Excepted"].Value = row["BP_Excepted"].ToString() == "" ? DateTime.ParseExact("1/01/1900 00:00:00 AM", "M/dd/yyyy H:mm:ss tt", CultureInfo.InvariantCulture) : DateTime.ParseExact(row["BP_Excepted"].ToString(), "M/dd/yyyy H:mm:ss tt", CultureInfo.InvariantCulture);
                            query.Parameters["@BP_Exception_Type"].Value = row["BP_Exception_Type"];
                            query.Parameters["@BP_Exception_Reason"].Value = row["BP_Exception_Reason"];
                            query.ExecuteNonQuery();
                        };
                        tr.Commit();
                    }
                    conn.Close();
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Commit Exception Type: {0}", ex.GetType());
                    Console.WriteLine("   Message: {0}", ex.Message);

                    try
                    {
                        transaction.Rollback();
                    }
                    catch (Exception ex2)
                    {
                        Console.WriteLine("Rollback Exception Type: {0}", ex2.GetType());
                        Console.WriteLine("   Message: {0}", ex2.Message);
                    }
                };
            };
        };

Спасибо за любую помощь!

Ответы [ 2 ]

0 голосов
/ 21 апреля 2020

Проблема заключалась в том, что ячейки столбцов имели нулевые значения. Я мог бы решить проблему, в которой я написал метод для преобразования данных в формат DataTime следующим образом:

query.Parameters["@BP_Loaded"].Value = ExtractDate(row["BP_Loaded"].ToString());
query.Parameters["@BP_Deferred"].Value = ExtractDate(row["BP_Deferred"].ToString());
query.Parameters["@BP_Completed"].Value = ExtractDate(row["BP_Completed"].ToString());
query.Parameters["@BP_Excepted"].Value = ExtractDate(row["BP_Excepted"].ToString());

Метод:

    public static SqlDateTime ExtractDate(string myDate)
            {
                //Set default value if error
                SqlDateTime result = SqlDateTime.MinValue;
                if (myDate != "")
                {
                    try
                    {
                        result = SqlDateTime.Parse(myDate);
                    }
                    catch (Exception)
                    {
                        return (result);
                    }
                }
                return (result);
            }

Надеюсь, что это может помочь другим.

0 голосов
/ 20 апреля 2020
using System.Globalization;

Тогда код:

DateTimeFormatInfo df1 = new DateTimeFormatInfo();
df1.DateSeparator = "/";
df1.TimeSeparator = ":";
df1.PMDesignator = "pm";
df1.AMDesignator = "am";

DateTime d = DateTime.MinValue;

DateTime.TryParseExact("4/15/2020 06:01:33 AM", "M/d/yyyy hh:mm:ss tt", df1, DateTimeStyles.AllowWhiteSpaces, out d);

string sqlDate = d.ToString("yyyy-MM-dd HH:mm:ss");

Я полагаю, вы можете установить значение даты непосредственно в SQL базу данных, например:

DateTime dateLoaded = DateTime.MinValue;
DateTime.TryParseExact(row["BP_Loaded"].ToString(), "M/d/yyyy hh:mm:ss tt", df1, DateTimeStyles.AllowWhiteSpaces, out dateLoaded);
query.Parameters["@BP_Loaded"].Value = dateLoaded;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...