2017-05-09 201 views
0

我从数据表插入值到SQL表,我得到“转换数据类型错误”。我的源文件是固定宽度,我使用子字符串来获取这些值。如何将字符串数据类型转换为从数据表到SQL表的字符串数据类型

Source: 

    Amount  Name  Id   Date 
    -33,167.74 NHP  1,503   05/09/2017 

这是我的代码使用数据表

private DataTable InsertDataTable() 
{ 
    DataTable datatable = new DataTable(); 
    datatable.Columns.Add("Id", typeof(int)); 
    datatable.Columns.Add("amount", typeof(decimal)); 
    datatable.Columns.Add("name", typeof(string)); 
    datatable.Columns.Add("date", typeof(datetime)); 

    //--inserting datatable 

    foreach (string row in columns) 
    { 
     datarow["Id"] = Convert.ToInt32(row.Substring(51, 12).Trim().Replace(",", "")); 
     datarow["Amount"] = Convert.ToDecimal(row.Substring(0, 9).Trim()); 
     datarow["date"] = Convert.ToDateTime(row.Substring(12, 18).Trim()); 
     datarow["name"] = Convert.ToDecimal(row.Substring(20, 35).Trim()); 
     datatable.Rows.Add(datarow); 
    } 
} 

private void InsertSqlTable() 
{ 
    DataTable finaldatatable = InsertDataTable(); 
    //sql connection-------------------- 
    using (SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(con)) 
    { 
     //Set the database table name 
     sqlBulkCopy.DestinationTableName = "[dbo].[table]"; 
     sqlBulkCopy.ColumnMappings.Add("id", "id"); 
     sqlBulkCopy.ColumnMappings.Add("amount", "amount"); 
     sqlBulkCopy.ColumnMappings.Add("name", "name"); 
     sqlBulkCopy.ColumnMappings.Add("date", "date"); 
    } 
} 

我的目标表列和数据类型

id int 
name string 
amount money 
date datetime 

我正在转换误差为所有的数据下面插入SQL表类型除字符串外。也是我的ID是1,503,我想1503. 你们中的任何人都可以帮助我转换为正确的数据类型,也消除ID的逗号? 任何帮助表示赞赏!

+0

如果我正确地计数,量应具有位置0 10个字符,对不对?这些子字符串的位置都是关闭的,他们不是? –

+0

由于这是模拟数据,我的子字符串值不同。首先,我想知道如何从数据表中的任何值中删除逗号。 – chits

+0

无法帮助您使用C#,其他人需要在那里指导您。但是这并没有改变“-33,167.74”包含10个字符并且你的子字符串长度只有9的事实。 –

回答

0

您可以通过使用Regex来获得您的愿望输出。我认为你所有的数据都会像示例数据一样格式化。

首先我用Regex得到Id, Amount & date,之后我得到name

正则表达式:

((-|)\b\d[\d,.\/]*\b) 

Regex101 Example

例C#代码:

using System; 
using System.Text.RegularExpressions; 

public class Program 
{ 
    public static void Main() 
    { 
     string data = "-33,167.74 NHP  1,503   05/09/2017"; 

     string regex = @"((-|)\b\d[\d,.\/]*\b)"; 
     var matches = Regex.Matches(data, regex, RegexOptions.Multiline); 

     int Id = Convert.ToInt16(matches[1].Groups[0].ToString().Replace(",", "")); 
     decimal Amount = Convert.ToDecimal(matches[0].Groups[0].ToString()); 
     DateTime date = Convert.ToDateTime(matches[2].Groups[0].ToString()); 
     string name = Regex.Replace(data, regex, "").ToString().Trim(); 

     Console.WriteLine("Id: " + Id); 
     Console.WriteLine("Amount: " + Amount); 
     Console.WriteLine("date: " + date); 
     Console.WriteLine("name: " + name); 
    } 
} 

Output of example in DotNetFiddle

下面代码中的语句,请改变:

foreach (string row in columns) 
{ 
    string data = row; 

    string regex = @"((-|)\b\d[\d,.\/]*\b)"; 
    var matches = Regex.Matches(data, regex, RegexOptions.Multiline); 

    int Id = Convert.ToInt16(matches[1].Groups[0].ToString().Replace(",", "")); 
    decimal Amount = Convert.ToDecimal(matches[0].Groups[0].ToString()); 
    DateTime date = Convert.ToDateTime(matches[2].Groups[0].ToString()); 
    string name = Regex.Replace(data, regex, "").ToString().Trim(); 

    datarow["Id"] = Id; 
    datarow["Amount"] = Amount; 
    datarow["date"] = date; 
    datarow["name"] = name; 
    datatable.Rows.Add(datarow); 
} 
相关问题