我使用下面的代码将存储在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复制?我想跳过标题文本只复制数据
试试这个:
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做一些事情。