Ниже приведен код, который я использую для вставки данных, хранящихся в 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 в datetime в sqlserver из-за заголовка в txtfile, который мы можем классифицировать как строки. Массивная копия вернет ошибку, потому что она не может вставить строку в столбце формата даты и времени, поэтому я был вынужден объявить столбец DateTime для строки, чтобы это учесть. Но я хочу изменить его. Я хочу объявить его datetime. Как я могу игнорировать текст заголовка при выполнении копии sqlbulk? Я хочу пропустить текст заголовка и только копировать данные
Если у вас всегда будет одна строка заголовка, которую вы хотите пропустить, просто прочитайте эту строку, не обрабатывая ее, обернув свою существующую while () внутри if ().
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)
{
...
}
}
Общие замечания:
Попробуй это :
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» и т. Д.