Ich bin in der Lage SqlBulkCopy zu tun, wenn keine Abhängigkeit von der Tabelle dort unten mit dem Code ist:Wie kann ich SqlBulkCopy ausführen, wenn eine Abhängigkeit in der Tabelle besteht?
//TableData and FieldData have column info in memory.
using (SqlConnection connection = new SqlConnection(@"Data Source=WLO1;Initial Catalog=GenTest2;Integrated Security=True"))
{
connection.Open();
foreach (string tableName in tablesInOrderToProcess)
{
if (tableDataList.ContainsKey(tableName))
{
TableData td = tableDataList[tableName];
SqlBulkCopy copy = new SqlBulkCopy(connection);
copy.BatchSize = 10000;
copy.DestinationTableName = tableName;
System.Data.DataTable dt = new DataTable();
foreach (FieldData fd in td.FieldList.Values)
{
string fieldName = fd.Name;
string fieldDataType = fd.DataType;
string fieldSize = fd.Size.ToString(); ;
string fieldConstant = fd.constantValue;
string fieldAverage = fd.averageSize;
string fieldPickList = fd.pickList;
copy.ColumnMappings.Add(fieldName, fieldName);
switch (fieldDataType)
{
case "char":
{
dt.Columns.Add(fieldName, System.Type.GetType("System.String"));
}
break;
case "nvarchar":
{
dt.Columns.Add(fieldName, System.Type.GetType("System.String"));
}
break;
case "number":
{
if (fd.Size == 10)
dt.Columns.Add(fieldName, System.Type.GetType("System.Int64"));
else
dt.Columns.Add(fieldName, System.Type.GetType("System.Int32"));
}
break;
default:
{
dt.Columns.Add(fieldName);
}
break;
}
}
for (int i = 0; i < int.Parse(td.NumRows); i++)
{
System.Data.DataRow r = dt.NewRow();
foreach (FieldData fd in td.FieldList.Values)
{
string fieldName = fd.Name;
string fieldDataType = fd.DataType;
string fieldSize = fd.Size.ToString(); ;
string fieldConstant = fd.constantValue;
string fieldAverage = fd.averageSize;
string fieldPickList = fd.pickList;
switch (fieldDataType)
{
case "char":
{
if (fd.averageSize.Length > 0)
{
r[fieldName] = GetRandomString(Int32.Parse(fd.averageSize), true);
}
else
{
r[fieldName] = fieldConstant;
}
}
break;
case "nvarchar":
{
if (fd.averageSize.Length > 0)
{
r[fieldName] = GetRandomString(Int32.Parse(fd.averageSize), true);
}
else
{
r[fieldName] = fieldConstant;
}
}
break;
case "number":
{
if (fd.Size == 10)
{
r[fieldName] = i;
}
else
{
r[fieldName] = i;
}
}
break;
default:
{
r[fieldName] = fieldConstant;
}
break;
}
}
dt.Rows.Add(r);
}
try
{
copy.WriteToServer(dt);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
}
Wenn jedoch eine Abhängigkeit besteht, ich bin verwirrt.
1) Sollte ich eine DataTable für jede Tabelle erstellen?
2) Da die Informationen zur Tabellenbeziehung vom Benutzer bereitgestellt und in den Speicher geladen werden, wie kann ich Tabellen binden, ohne Informationen aus dem Schema zu lesen? Oder muss ich die Informationen lesen und den Primärschlüssel von Schema abrufen?
Vielen Dank im Voraus. Ich hoffe, ich habe es deutlich gemacht.
Dank @ Scott Chamberlain. Das ist ein sehr kluger Weg. Ich hatte versucht, überall eine Lösung zu finden. – JackTheRipper