Member 12314309 Ответов: 2

Импорт данных в SQL server


я импортирую данные в sql server из CSV файла теперь я получаю эту проблему
String was not recognized as a valid DateTime.Couldn't store <20180526> in Date Column.  Expected type is DateTime.


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

Код добавлен из ответов;

here is my complete code

using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.SqlClient;
using System.Data.OleDb;
using System.IO;
using System.Configuration;



namespace BindGridviewFromCSVFile
{
    public partial class BindGridview : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
       
        }

        protected void btnFileUpload_Click(object sender, EventArgs e)
        {
            
            
            //Creating object of datatable  
            //Upload and save the file.
            //getting full file path of Uploaded file  
            string CSVFilePath = Server.MapPath(FileUpload1.PostedFile.FileName);

            //Reading All text  
            string ReadCSV = File.ReadAllText(CSVFilePath);

            DataTable dt = new DataTable("HR");
            //DataColumn dateColumn = new DataColumn();
            
            //dateColumn.ColumnName = "Date";
            //dt.Columns.AddRange(new DataColumn[5] { new DataColumn("Empcode", typeof(int)),
            //new DataColumn("Days", typeof(int)),
            // new DataColumn("Date", typeof(int)),
            //DateTime Date = Convert.ToDateTime("Date");
        //    table.Columns.Add("SaleDate", typeof(DateTime));


            //  new DataColumn("Time", typeof(int)),
            //   new DataColumn("IN/OUT", typeof(int)),});

            // Create Column 1: SaleDate
       

            DataColumn DaysColumn = new DataColumn();
            // dateColumn.DataType = Type.GetType("System.int");     
            DaysColumn.ColumnName = "Days";

      

            DataColumn dateColumn = new DataColumn();
            dateColumn.DataType = Type.GetType("System.DateTime");
         
            dateColumn.ColumnName = "Date";

            
            
       


            // Create Column 2: ProductName
            DataColumn timeNameColumn = new DataColumn();
            timeNameColumn.ColumnName = "Time";

            // Create Column 3: TotalSales
            DataColumn INOUTColumn = new DataColumn();
          //  totalSalesColumn.DataType = Type.GetType("System.int");
           INOUTColumn.ColumnName = "IN/OUT";

           //  EmpcodeColumn.DataType = Type.GetType("int");
           DataColumn EmpcodeColumn = new DataColumn();
           EmpcodeColumn.ColumnName = "Empcode";

            // Add the columns to the ProductSalesData DataTable
           dt.Columns.Add(DaysColumn);
           dt.Columns.Add(dateColumn);
           dt.Columns.Add(timeNameColumn);
           dt.Columns.Add(INOUTColumn);
           dt.Columns.Add(EmpcodeColumn);
           // Let's populate the datatable with our stats.
           // You can add as many rows as you want here!

           // Create a new row
           //DataRow dailyProductSalesRow = dt.NewRow();
           //dailyProductSalesRow["Empcode"] = "";
           //dailyProductSalesRow["Days"] = "";

           //dailyProductSalesRow["Date"] = DateTime.Today;
           //dailyProductSalesRow["Time"] = "";
           //dailyProductSalesRow["IN/OUT"] = "";



          string csvData = File.ReadAllText(CSVFilePath);
            foreach (string row in csvData.Split('\n'))
            {
                if (!string.IsNullOrEmpty(row))
                {
                    dt.Rows.Add();
                    int i = 0;
                    foreach (string cell in row.Split(','))
                    {
                        dt.Rows[dt.Rows.Count - 1][i] = cell;
                        i++;
                    }
                }
            }

            SqlConnection con = new SqlConnection("Data Source=.;Initial Catalog=Institute;Integrated Security=True");
            //        con.Open();
            {
                using (SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(con))
                {
                    //Set the database table name.
                    sqlBulkCopy.DestinationTableName =

F-ES Sitecore

Похоже, что есть проблема с вашим кодом, но поскольку вы не показали нам код, невозможно дать явный совет.

Member 12314309

вот мой полный код

использование системы;
использование системы.Сеть;
использование System.Web.UI;
используя системы.Веб.Пользовательского интерфейса.WebControls;
использование System.Data;
используя системы.Данных.Поставщики sqlclient;
использование System.Data.Для oledb;
использование системы.ИО;
использование системы.Конфигурация;



пространство имен BindGridviewFromCSVFile
{
общественный разделяемого класса BindGridview : система.Веб.Пользовательского интерфейса.Страницы
{
охраняемых недействительными в(объект отправителя, EventArgs в электронной)
{

}

охраняемых недействительными btnFileUpload_Click(объект отправителя, EventArgs в электронной)
{


//Создание объекта datatable
//Загрузите и сохраните файл.
//получение полного пути к загруженному файлу
строка CSVFilePath = сервер.MapPath(FileUpload1.PostedFile.имя файла);

//Чтение всего текста
строка ReadCSV = файл.ReadAllText(CSVFilePath);

DataTable dt = новый DataTable("HR");
//DataColumn dateColumn = новый столбец данных();

//dateColumn.ColumnName = "Дата";
//ДТ.колонки.AddRange(new DataColumn[5] { new DataColumn("Empcode", typeof(int)),
//new DataColumn("Days", typeof(int)),
// new DataColumn("Date", typeof(int)),
//DateTime Date = Конвертировать.ToDateTime("Дата");
// стол.Столбцы.Добавить("SaleDate", typeof(DateTime));


// new DataColumn("Time", typeof(int)),
// new DataColumn("IN/OUT", typeof(int)),});

// Создать Столбец 1: SaleDate


Объект datacolumn столбец дней = новый объект datacolumn();
// dateColumn.Тип = Тип.Метод Gettype (Системы".инт");
Дневная колонка.ColumnName = "Дни";



DataColumn dateColumn = новый столбец данных();
dateColumn.Тип = Тип.GetType("Система.значение datetime");

dateColumn.ColumnName = "Дата";






// Создать Столбец 2: Марка
DataColumn timeNameColumn = новый столбец данных();
timeNameColumn.ColumnName = "Время";

// Создать Столбец 3: Итоговые Продажи
DataColumn INOUTColumn = новый столбец данных();
// totalSalesColumn.Тип = Тип.Метод Gettype (Системы".инт");
INOUTColumn.ColumnName = "IN/OUT";

// EmpcodeColumn.Тип = Тип.GetType("int");
DataColumn EmpcodeColumn = новый столбец данных();
EmpcodeColumn.ColumnName = "Empcode";

// Добавьте столбцы в таблицу ProductSalesData DataTable
ДТ.колонны.Добавить(Столбец Дней);
ДТ.колонны.Добавить(dateColumn);
ДТ.колонны.Добавить(timeNameColumn);
ДТ.колонны.Добавить(INOUTColumn);
ДТ.колонны.Добавить(EmpcodeColumn);
// Давайте заполним datatable нашей статистикой.
// Вы можете добавить здесь столько строк, сколько захотите!

// Создать новую строку
//DailyProductSalesRow строкаданных = ДТ.Невров();
//dailyProductSalesRow["Empcode"] = "";
//dailyProductSalesRow["дни"] = "";

//dailyProductSalesRow["Date"] = DateTime.Сегодня;
//dailyProductSalesRow["время"] = "";
//dailyProductSalesRow["IN/OUT"] = "";



строка csvData = файл.ReadAllText(CSVFilePath);
foreach (строка строки в csvData.Split('\n'))
{
если (!строка.IsNullOrEmpty(строка))
{
ДТ.Строк.Добавить();
int i = 0;
foreach (строковая ячейка в строке.Расщеплять(','))
{
dt.Rows[dt.Rows.Count - 1][i] = ячейка;
я++;
}
}
}

SqlConnection con = new SqlConnection("источник данных=.;начальный каталог=институт;Интегрированная безопасность=True");
// кон.Открыть();
{
использование (SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(con))
{
//Задайте имя таблицы базы данных.
sqlBulkCopy.DestinationTableName =

Vincent Maverick Durano

Пожалуйста, используйте ссылку действия "улучшить вопрос" и разместите там свой код. Также скажите нам, какая строка вызывает ошибку.

2 Ответов

Рейтинг:
1

Vincent Maverick Durano

Спасибо, что вы обновили свой вопрос с помощью кода.

Глядя на ваш код, вы видите эту строку ниже:

dt.Rows[dt.Rows.Count - 1][i] = cell;


Похоже, что вы рассматриваете все ценности как string тип но ваш DataTable содержит а System.DateTime колонка. Вам нужно идентифицировать Column это имеет нестроковый тип и выполняет преобразование перед присвоением значения.

Быстрый и грязный пример, основанный на вашем коде, - это сделать что-то вроде этого:

foreach (string row in csvData.Split('\n'))
            {
                if (!string.IsNullOrEmpty(row))
                {
                    dt.Rows.Add();
                    int i = 0;
    
                    foreach (string cell in row.Split(','))
                    {
                        //means you are looking for the 2nd Column which of type DateTime
                        //note that index starts at 0, so we use 1 for locating 2nd column
                        if(i = 1){
                            //convert string to datetime
                            DateTime documentDate = DateTime.MinValue;
                            if(DateTime.TryParse(cell, out documentDate)){
                              dt.Rows[dt.Rows.Count - 1][i] = documentDate;
                            }
                         
                        }
                        else{
                            dt.Rows[dt.Rows.Count - 1][i] = cell;
                        }
                        i++;
                    }
                }
            }


Дело в том, чтобы держать там записку, которую мы используем DateTime.TryParse чтобы убедиться, что мы передаем в столбец допустимое строковое значение datetime.

Вы также можете посмотреть на эту статью, которая использует schema.ini чтобы импортировать CSV в базу данных SQL: ASP.NET WebForms: загрузка и импорт CSV-файла на SQL Server[^]


Member 12314309

теперь получаю эту ошибку
Заданное значение типа String из источника данных не может быть преобразовано в тип datetime указанного целевого столбца.

Vincent Maverick Durano

Вы должны сказать нам, какая строка вызывает ошибку. Главное, что нужно иметь в виду, - это то, что вам нужно убедиться, что тип, который вы передаете в своей базе данных SQL, должен совпадать с типом столбца вашей таблицы.

Member 12314309

Теперь данные импортируются пустыми в таблицу sql server, и никакой ошибки не происходит.

Vincent Maverick Durano

Тогда это время, когда вы отлаживаете свой код. Установите точку останова на линии, где вы связываете данные, и шагните в нее, чтобы выяснить, что пошло не так.

Рейтинг:
0

RickZeeland

Вероятно, вам нужно преобразовать строковое значение в DateTime с помощью значение datetime.Разбор().
Смотрите примеры здесь: https://www.dotnetperls.com/datetime-parse[^]