在c#中使用SQL批量复制并删除字符串头

本文关键字:复制 删除 字符串 SQL | 更新日期: 2023-09-27 17:52:11

我使用下面的代码将存储在txt文件中的数据插入到sql:

 public void extract_data()
    {
        openFileDialog1.ShowDialog();
        DataTable dt = new DataTable();
        StreamReader sr = new StreamReader(openFileDialog1.FileName);
        string input;
        dt.Columns.Add(new DataColumn("Counter", typeof(string)));
        dt.Columns.Add(new DataColumn("Machine", typeof(string)));
        dt.Columns.Add(new DataColumn("Employee_Number", typeof(string)));
        dt.Columns.Add(new DataColumn("In_Out", typeof(string)));
        dt.Columns.Add(new DataColumn("DateTime", typeof(string)));
        while ((input = sr.ReadLine()) != null)
        {
            string[] s = input.Split(new char[] { ''t' });
            DataRow dr = dt.NewRow();
            dr["Counter"] = s[0];
            dr["Machine"] = s[1];
            dr["Employee_Number"] = s[2];
            dr["In_Out"] = s[5];
            dr["DateTime"] = s[6];
            dt.Rows.Add(dr);
        }
        using (SqlBulkCopy sqbc = new SqlBulkCopy(@"Data Source=DBASE;Network Library=DBMSSOCN;Initial Catalog=DB;User ID=sa;Password=123"))
        {
            sqbc.BatchSize = 10000;
            sqbc.BulkCopyTimeout = 10000;
            sqbc.ColumnMappings.Add("Counter", "Counter");
            sqbc.ColumnMappings.Add("Machine", "Machine");
            sqbc.ColumnMappings.Add("Employee_Number", "Employee_Number");
            sqbc.ColumnMappings.Add("In_Out", "In_Out");
            sqbc.ColumnMappings.Add("DateTime", "DateTime");
            sqbc.DestinationTableName = "tblExtract";
            sqbc.WriteToServer(dt);
        }
    }

正如你所看到的,我不能将我的列DateTime转换为sqlserver中的DateTime,因为我们可以将txtfile中的头分类为字符串。批量复制将返回一个错误,因为它不能在datetime格式列中插入字符串,所以我被迫将datetime列声明为string来适应这一点。但我想改变它。我想把它申报到日期时间。我怎么能忽略标题文本,而做sqlbulk复制?我想跳过标题文本只复制数据

在c#中使用SQL批量复制并删除字符串头

试试这个:

string format = "MM/dd/yyyy hh:mm:ss.fff";
DateTime d =DteTime.ParseExact(s[6],format,System.Globalization.CultureInfo.InvariantCulture);
dr["DateTime"]=d;

更改格式,如"MM/dd/yyyy"或"MM/dd/yyyy hh: MM "等

如果你总是有一个你想要跳过的标题行,只需读取该行,而不需要通过在If()中包装现有的while()来处理它。

if ((input = sr.ReadLine()) != null)
{
     // already read line #1 (i.e. header line),
     // now start processing data, if any lines exist
     while ((input = sr.ReadLine()) != null)
     {
        ...
     }
}

总则:

  • 我希望连接字符串中的"sa"帐户只是一个例子。如果没有,请使用其他帐户。使用"sa"是个坏主意。
  • 根据输入文件的大小,这可能是相当低效的内存,因为它需要首先将整个文件读入DataTable。你最好在SQL Server中创建一个TVP(表值参数),使用它作为一个输入参数,通过从TVP中读取来插入,并更新此代码,以便当文件的每一行被读取并在制表符上分割时,每行被发送到SQL Server,这样你就不会在内存中有超过1行的输入文件。

可以直接将值转换为DateTime:

dr["DateTime"] = Convert.ToDateTime(s[6]);

这是可行的,但是如果你遇到一些不是日期时间的东西,可能会很危险。如果这在您的情况下是可能的,您将希望对DateTime做一些事情。