Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将数据类型转换为bulkcopy accure之前的日期_C#_Sql Server 2008 - Fatal编程技术网

C# 将数据类型转换为bulkcopy accure之前的日期

C# 将数据类型转换为bulkcopy accure之前的日期,c#,sql-server-2008,C#,Sql Server 2008,可能重复: 我从包含不同列的txt文件中读取数据。在插入数据库之前,我需要将一列的类型转换为日期/时间 SqlBulkCopy bc = new SqlBulkCopy(Consql.ConnectionString, SqlBulkCopyOptions.TableLock); bc.DestinationTableName = "name"; bc.ColumnMappings.Add(dt.Columns[0].ColumnName, "IDATE"); bc.ColumnMapping

可能重复:

我从包含不同列的txt文件中读取数据。在插入数据库之前,我需要将一列的类型转换为日期/时间

SqlBulkCopy bc = new SqlBulkCopy(Consql.ConnectionString, SqlBulkCopyOptions.TableLock);
bc.DestinationTableName = "name";
bc.ColumnMappings.Add(dt.Columns[0].ColumnName, "IDATE");
bc.ColumnMappings.Add(dt.Columns[1].ColumnName, "ITIME");
bc.ColumnMappings.Add(dt.Columns[2].ColumnName, "TECHID");
bc.ColumnMappings.Add(dt.Columns[5].ColumnName, "CNTRC");
bc.BatchSize = dt.Rows.Count;
Consql.Open();

我认为要使用SqlBulkCopy,您需要实现IDataReader接口。 通过实现它,您可以将源文件中的值转换为所需的类型

您的自定义阅读器可以如下所示

 public class Reader : IDataReader
    {
        readonly StreamReader _streamReader;

        readonly Func<string, object>[] _convertTable;
        readonly Func<string, bool>[] _constraintsTable;

        string[] _currentLineValues;
        string _currentLine;

        //Constructing reader you can specify your converters     
        public Reader(string filepath, Func<string, bool>[] constraintsTable, Func<string, object>[] convertTable)
        {
            _constraintsTable = constraintsTable;
            _convertTable = convertTable;
            _streamReader = new StreamReader(filepath);

            _currentLine = null;
            _currentLineValues = null;
        }


        public object GetValue(int i)
        {
            try
            {
                return _convertTable[i](_currentLineValues[i]);
            }
            catch (Exception)
            {
                return null;
            }
        }


        public bool Read()
        {
            if (_streamReader.EndOfStream) return false;

            _currentLine = _streamReader.ReadLine();


            _currentLineValues = _currentLine.Split(/*any column splitter*/);

            var invalidRow = false;
            for (int i = 0; i < _currentLineValues.Length; i++)
            {
                if (!_constraintsTable[i](_currentLineValues[i]))
                {
                    invalidRow = true;
                    break;
                }
            }

            return !invalidRow || Read();
        }



//other methods...
}
公共类读取器:IDataReader
{
只读StreamReader\u StreamReader;
只读Func[]\u转换表;
只读Func[]_constraintsTable;
字符串[]\u currentLineValues;
字符串_currentLine;
//构造读取器您可以指定转换器
公共读取器(字符串文件路径、Func[]约束表、Func[]转换表)
{
_constraintsTable=constraintsTable;
_convertTable=可转换表;
_streamReader=新的streamReader(文件路径);
_currentLine=null;
_currentLineValues=null;
}
公共对象GetValue(int i)
{
尝试
{
返回_convertable[i](_currentLineValues[i]);
}
捕获(例外)
{
返回null;
}
}
公共bool Read()
{
if(_streamReader.EndOfStream)返回false;
_currentLine=_streamReader.ReadLine();
_currentLineValues=_currentLine.Split(/*任何列拆分器*/);
var invalidRow=假;
对于(int i=0;i<\u currentLineValues.Length;i++)
{
if(!_constraintsTable[i](_currentLineValues[i]))
{
invalidRow=true;
打破
}
}
return!invalidRow | | Read();
}
//其他方法。。。
}
您可以这样使用它(将一个源列转换为DateTime):

static void Main(字符串[]args)
{
//创建阅读器
var reader=GetReader();
//数据库连接字符串
var connectionString=@“服务器={blah};初始目录={blah blah};集成安全性=true”;
使用(var loader=newsqlbulkcopy(connectionString,SqlBulkCopyOptions.Default))
{
loader.ColumnMappings.Add(0,2);
loader.ColumnMappings.Add(1,1);
loader.ColumnMappings.Add(2,3);
loader.ColumnMappings.Add(3,4);
loader.DestinationTableName=“客户”;
loader.WriteToServer(读卡器);
控制台。WriteLine(“完成!”);
}
Console.ReadLine();
}
静态IDataReader GetReader()
{
var sourceFilepath=“sqlbulktest.txt”;
//我们的转换器!
var convertTable=GetConvertTable();
var constraintsTable=GetConstraintsTable();
var reader=新读取器(sourceFilepath、constraintsTable、convertTable);
返回读取器;
}
静态函数[]GetConstraintsTable()
{
var constraintsTable=新函数[4];
constraintsTable[0]=x=>!string.IsNullOrEmpty(x);
constraintsTable[1]=constraintsTable[0];
constraintsTable[2]=x=>true;
constraintsTable[3]=x=>true;
返回约束表;
}
静态函数[]GetConvertTable()
{
var convertTable=新函数[4];
convertTable[0]=x=>x;
convertTable[1]=x=>x;
//从特定格式转换为日期时间!
convertTable[2]=x=>
{
日期时间日期时间;
if(DateTime.TryParseExact(x.ToString(),“dd.MM.yyyy”,CultureInfo.InvariantCulture,
DateTimeStyles.None,out datetime)
{
返回日期时间;
}
返回null;
};     
convertTable[3]=x=>Convert.ToInt32(x);
返回表;
}

定义DataTable列时,您将其设置为什么类型?可以编辑您的问题,以包括数据示例以及如何构建和添加到DataTable。
static void Main(string[] args)
        {
            // Create Reader
            var reader = GetReader();

            // DB connection string
            var connectionString = @"Server={blah};initial catalog={blah-blah};Integrated Security=true";     

            using (var loader = new SqlBulkCopy(connectionString, SqlBulkCopyOptions.Default))
            {
                loader.ColumnMappings.Add(0, 2);
                loader.ColumnMappings.Add(1, 1);
                loader.ColumnMappings.Add(2, 3);
                loader.ColumnMappings.Add(3, 4);

                loader.DestinationTableName = "Customers";
                loader.WriteToServer(reader); 

                Console.WriteLine("Done!");
            }

            Console.ReadLine();
        }

        static IDataReader GetReader()
        {
            var sourceFilepath = "sqlbulktest.txt";
            //our converters!
            var convertTable = GetConvertTable();

            var constraintsTable = GetConstraintsTable();

            var reader = new Reader(sourceFilepath, constraintsTable, convertTable);
            return reader;
        }

        static Func<string, bool>[] GetConstraintsTable()
        {
            var constraintsTable = new Func<string, bool>[4];

            constraintsTable[0] = x => !string.IsNullOrEmpty(x);
            constraintsTable[1] = constraintsTable[0];
            constraintsTable[2] = x => true;
            constraintsTable[3] = x => true;
            return constraintsTable;
        }

        static Func<string, object>[] GetConvertTable()
        {
            var convertTable = new Func<object, object>[4];

            convertTable[0] = x => x;


            convertTable[1] = x => x;


            // Convert to DateTime from specific format!
            convertTable[2] = x =>
                              {
                                  DateTime datetime;
                                  if (DateTime.TryParseExact(x.ToString(), "dd.MM.yyyy", CultureInfo.InvariantCulture,
                                        DateTimeStyles.None, out datetime))
                                  {
                                      return datetime;
                                  }
                                  return null;
                              };     

            convertTable[3] = x => Convert.ToInt32(x);

            return convertTable;
        }