SQLBulkCopy与类型不匹配异常和Datetime投诉有关

时间:2018-03-22 17:39:18

标签: sql-server bulkinsert sqlbulkcopy

我想在一个包含不同类型和自动增量列的表中进行BULK插入。问题是,我得到了消息,因此无法从Int32转换为Datetime。

这是我的表格结构,id是一个自动增量标识列。

Table Structure id is auto imcrement

在本节的第一个方法中,我创建了具有类型的DataTable(System.DateTime是否正确?)。本节中的第二个方法是SQLBulkCopy。

    public DataTable makeTherapyStatusTransitionTable()
    // Create a new DataTable named NewProducts. 
    {
        DataTable tstTable = new DataTable("therapystatustransition");

        DataColumn therapy = new DataColumn();
        therapy.DataType = System.Type.GetType("System.Int32");
        therapy.ColumnName = "therapy";
        tstTable.Columns.Add(therapy);

        DataColumn minutes = new DataColumn();
        minutes.DataType = System.Type.GetType("System.String");
        minutes.ColumnName = "minutes";
        tstTable.Columns.Add(minutes);

        DataColumn seconds = new DataColumn();
        seconds.DataType = System.Type.GetType("System.String");
        seconds.ColumnName = "seconds";
        tstTable.Columns.Add(seconds);

        DataColumn time = new DataColumn();
        time.DataType = System.Type.GetType("System.DateTime");
        time.ColumnName = "time";
        tstTable.Columns.Add(time);

        DataColumn from_phase = new DataColumn();
        from_phase.DataType = System.Type.GetType("System.Int32");
        from_phase.ColumnName = "from_phase";
        tstTable.Columns.Add(from_phase);

        DataColumn to_phase = new DataColumn();
        to_phase.DataType = System.Type.GetType("System.Int32");
        to_phase.ColumnName = "to_phase";
        tstTable.Columns.Add(to_phase);

        return tstTable;
    }

    public string bulkTableTo(DataTable dataTable, string tabellenname)
    {
        // get your connection string
        string connString = MyConfigurationManager.prdSqlServerString;
        // connect to SQL
        using (SqlConnection connection = new SqlConnection(connString))
        {
            // make sure to enable triggers
            // more on triggers in next post

            SqlBulkCopy bulkCopy = new SqlBulkCopy
            (
                connection,
                SqlBulkCopyOptions.Default,
                null
             );

            // set the destination table name
            bulkCopy.DestinationTableName = tabellenname;
            connection.Open();

            // write the data in the "dataTable"
            try
            {
                bulkCopy.WriteToServer(dataTable);
            }
            catch (Exception e)
            {
                return "Es ist ein Fehler aufgetreten. " +
                "Stellen Sie sicher dass der Timeout im SQL Server " +
                "auf unendlich steht und AutoClose für die Verbindung " +
                "nicht aktiviert wurde. " + e.Message;
            }
            connection.Close();
        }
        // reset
        dataTable.Clear();
        return "ok";
    }

数据表用一个循环填充:

                string[] phasenInfo = inputLine.Split(new Char[] { ' ' });
                //string[] phasenRow = new string[] { Int32.Parse(therapy_id), phasenInfo[0], phasenInfo[1], UnixTimeStampToDateTime(Double.Parse(phasenInfo[2])).ToString(), phasenInfo[3], phasenInfo[4] };

                DataRow row = historyTable.NewRow();
                row["therapy"] = Int32.Parse(therapy_id);
                row["minutes"] = phasenInfo[0];
                row["seconds"] = phasenInfo[1];
                row["time"] = UnixTimeStampToDateTime(Double.Parse(phasenInfo[2]));
                row["from_phase"] = Int32.Parse(phasenInfo[3]);
                row["to_phase"] = Int32.Parse(phasenInfo[4]);
                historyTable.Rows.Add(row);

这是我得到的错误消息:

{System.InvalidOperationException: Der angegebene Wert vom Typ Int32 aus der Datenquelle kann nicht in Typ datetime der angegebenen Zielspalte konvertiert werden. ---> System.InvalidCastException: Parameterwert konnte nicht von Int32 in DateTime umgewandelt werden. ---> System.InvalidCastException: Ungültige Umwandlung von "Int32" in "DateTime".
   bei System.Int32.System.IConvertible.ToDateTime(IFormatProvider provider)
   bei System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider)
   bei System.Data.SqlClient.SqlParameter.CoerceValue(Object value, MetaType destinationType, Boolean& coercedToDataFeed, Boolean& typeChanged, Boolean allowStreaming)
   --- Ende der internen Ausnahmestapelüberwachung ---
   bei System.Data.SqlClient.SqlParameter.CoerceValue(Object value, MetaType destinationType, Boolean& coercedToDataFeed, Boolean& typeChanged, Boolean allowStreaming)
   bei System.Data.SqlClient.SqlBulkCopy.ConvertValue(Object value, _SqlMetaData metadata, Boolean isNull, Boolean& isSqlType, Boolean& coercedToDataFeed)
   --- Ende der internen Ausnahmestapelüberwachung ---
   bei System.Data.SqlClient.SqlBulkCopy.ConvertValue(Object value, _SqlMetaData metadata, Boolean isNull, Boolean& isSqlType, Boolean& coercedToDataFeed)
   bei System.Data.SqlClient.SqlBulkCopy.ReadWriteColumnValueAsync(Int32 col)
   bei System.Data.SqlClient.SqlBulkCopy.CopyColumnsAsync(Int32 col, TaskCompletionSource`1 source)
   bei System.Data.SqlClient.SqlBulkCopy.CopyRowsAsync(Int32 rowsSoFar, Int32 totalRows, CancellationToken cts, TaskCompletionSource`1 source)
   bei System.Data.SqlClient.SqlBulkCopy.CopyBatchesAsyncContinued(BulkCopySimpleResultSet internalResults, String updateBulkCommandText, CancellationToken cts, TaskCompletionSource`1 source)
   bei System.Data.SqlClient.SqlBulkCopy.CopyBatchesAsync(BulkCopySimpleResultSet internalResults, String updateBulkCommandText, CancellationToken cts, TaskCompletionSource`1 source)
   bei System.Data.SqlClient.SqlBulkCopy.WriteToServerInternalRestContinuedAsync(BulkCopySimpleResultSet internalResults, CancellationToken cts, TaskCompletionSource`1 source)
   bei System.Data.SqlClient.SqlBulkCopy.WriteToServerInternalRestAsync(CancellationToken cts, TaskCompletionSource`1 source)
   bei System.Data.SqlClient.SqlBulkCopy.WriteToServerInternalAsync(CancellationToken ctoken)
   bei System.Data.SqlClient.SqlBulkCopy.WriteRowSourceToServerAsync(Int32 columnCount, CancellationToken ctoken)
   bei System.Data.SqlClient.SqlBulkCopy.WriteToServer(DataTable table, DataRowState rowState)
   bei System.Data.SqlClient.SqlBulkCopy.WriteToServer(DataTable table)
   bei TrendfileProcessorLib.Services.TrendService.bulkTableTo(DataTable dataTable, String tabellenname) in c:\dev\Visual Studio Projects\TrendReader\TrendfileProcessorLib\Services\TrendService.cs:Zeile 77.}

0 个答案:

没有答案