Я написал небольшое консольное приложение, которое я указываю на папку, содержащую файлы DBF/FoxPo.C# BulkCopy, DBF Errors (Timout & Provider не удалось определить ...)
Затем он создает таблицу в SQL на основе каждой таблицы dbf, затем выполняет массовую копию для вставки данных в SQL. Она работает довольно хорошо, по большей части, за несколько коряг кроме ..
1) Некоторые из таблиц FoxPro содержит 5000000+ записи и expries соединения до завершения вставки ..
Вот моя строка соединения :
<add name="SQL" connectionString="data source=source_source;persist security info=True;user id=DBFToSQL;password=DBFToSQL;Connection Timeout=20000;Max Pool Size=200" providerName="System.Data.SqlClient" />
сообщение об ошибке: «время ожидания истекло время ожидания истекло до завершения операции или сервер не отвечает.»
КОД:
using (SqlConnection SQLConn = new SqlConnection(SQLString))
using (OleDbConnection FPConn = new OleDbConnection(FoxString))
{
ServerConnection srvConn = new Microsoft.SqlServer.Management.Common.ServerConnection(SQLConn);
try
{
FPConn.Open();
string dataString = String.Format("Select * from {0}", tableName);
using (OleDbCommand Command = new OleDbCommand(dataString, FPConn))
using (OleDbDataReader Reader = Command.ExecuteReader(CommandBehavior.SequentialAccess))
{
tbl = new Table(database, tableName, "schema");
for (int i = 0; i < Reader.FieldCount; i++)
{
col = new Column(tbl, Reader.GetName(i), ConvertTypeToDataType(Reader.GetFieldType(i)));
col.Nullable = true;
tbl.Columns.Add(col);
}
tbl.Create();
BulkCopy(Reader, tableName);
}
}
catch (Exception ex)
{
// LogText(ex, @"C:\LoadTable_Errors.txt", tableName);
throw ex;
}
finally
{
SQLConn.Close();
srvConn.Disconnect();
}
}
private DataType ConvertTypeToDataType(Type type)
{
switch (type.ToString())
{
case "System.Decimal":
return DataType.Decimal(18, 38);
case "System.String":
return DataType.NVarCharMax;
case "System.Int32":
return DataType.Int;
case "System.DateTime":
return DataType.DateTime;
case "System.Boolean":
return DataType.Bit;
default:
throw new NotImplementedException("ConvertTypeToDataType Not implemented for type : " + type.ToString());
}
}
private void BulkCopy(OleDbDataReader reader, string tableName)
{
using (SqlConnection SQLConn = new SqlConnection(SQLString))
{
SQLConn.Open();
SqlBulkCopy bulkCopy = new SqlBulkCopy(SQLConn);
bulkCopy.DestinationTableName = "schema." + tableName;
try
{
bulkCopy.WriteToServer(reader);
}
catch (Exception ex)
{
//LogText(ex, @"C:\BulkCopy_Errors.txt", tableName);
}
finally
{
SQLConn.Close();
reader.Close();
}
}
}
Мой 2-й 3-й & ошибки следующие:
Я понимаю, что проблемы есть, но как исправить их я не уверен
2) «Поставщик не смог определить десятичное значение. Например, строка была только что создана, default для столбца «Десятичный» не был доступен, и потребитель еще не установил новое десятичное значение ».
3) SqlDateTime переполнение. Должно быть между 1/1/1753 12:00:00 AM и 12/31/9999 11:59:59 PM.
Я нашел результат на Google, что указано, что вопрос: [A] ... и возможная работа вокруг [B] (но я хотел бы, чтобы мои десятичные значения как десятичное и даты в качестве даты, так как я будет делать дальнейшие расчеты с данными)
Что я хочу сделать в качестве решения
1.) либо увеличить время соединения, (но я не думаю, что я могу увеличить это больше, чем у меня есть), или, альтернативно, можно разделить результаты OleDbDataReader и делать в инкрементальной вставке?
2.) Я думал, возможно ли иметь возможность массового копирования, чтобы игнорировать результаты с ошибками или иметь записи, которые делают ошибку для входа в файл csv или что-то в этом роде?
Рассматривать ответ (1) - это было бы моим предложением. Сделайте это в 1000 записях. Это должно устранить проблему и, надеюсь, предотвратить проблемы с замораживанием/блокировкой. Что касается (2) - почему бы не использовать значения по умолчанию, если они отсутствуют - скажем, стиль .MinValue или, возможно, -1 для десятичной и 01/01/1980 для даты. (Это просто примеры - любые значения, соответствующие вашим потребностям, могут быть использованы). – Bertie
любая идея о том, как делать инкрементное чтение? Я искал, но не везет пока ... –