我想在一个包含不同类型和自动增量列的表中进行BULK插入。问题是,我得到了消息,因此无法从Int32转换为Datetime。
这是我的表格结构,id是一个自动增量标识列。
在本节的第一个方法中,我创建了具有类型的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.}