それらの例が非常に多いため..SqlBulkCopy
次のシナリオでは、の使用を示していませんが、オンラインで調査していました。
SqlServer(2008) から既存のデータを取得するためにクエリを使用したDataTable
ので、ローカルでデータを並べ替え、処理中にデータベースにヒットするのを避けることができました。
だから今、その段階で、私はすでにソースdataTableスキーマを複製するオプションを持っていますlocalDataTable = DataTableFromOnlineSqlServer.Clone();
そうすることでClone()
、すべての列と、それぞれの列データ型が得られました。
次に、プログラムの次の段階で、Cloned-From-Db を埋めています - その Local (まだ Empty) new DataTable
with some new data .
これで、DataTable
データが取り込まれ、SQL Server に格納する準備が整いました。
以下のこのコードを使用しても結果は得られません
public string UpdateDBWithNewDtUsingSQLBulkCopy(DataTable TheLocalDtToPush, string TheOnlineSQLTableName)
{
// Open a connection to the AdventureWorks database.
using (SqlConnection connection = new SqlConnection(RCLDBCONString))
{
connection.Open();
// Perform an initial count on the destination table.
SqlCommand commandRowCount = new SqlCommand("SELECT COUNT(*) FROM "+TheOnlineSQLTableName +";", connection);
long countStart = System.Convert.ToInt32(commandRowCount.ExecuteScalar());
var nl = "\r\n";
string retStrReport = "";
retStrReport = string.Concat(string.Format("Starting row count = {0}", countStart), nl);
retStrReport += string.Concat("==================================================", nl);
// Create a table with some rows.
DataTable newCustomers = TheLocalDtToPush;
// Create the SqlBulkCopy object.
// Note that the column positions in the source DataTable
// match the column positions in the destination table so
// there is no need to map columns.
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
{
bulkCopy.DestinationTableName = TheOnlineSQLTableName;
try
{
// Write from the source to the destination.
bulkCopy.WriteToServer(newCustomers);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
// Perform a final count on the destination
// table to see how many rows were added.
long countEnd = System.Convert.ToInt32(
commandRowCount.ExecuteScalar());
retStrReport += string.Concat(string.Format("Ending row count = {0}", countEnd), nl);
retStrReport += string.Concat("==================================================", nl);
retStrReport += string.Concat(string.Format("{0} rows were added.", countEnd - countStart),nl);
retStrReport += string.Concat("New Customers Was updated successfully", nl, "END OF PROCESS !");
Console.ReadLine();
return retStrReport;
}
}
問題は、データがまったく挿入されていないことです。
私はいくつかの調査を行いましたが、解決策はありません。次のことも確認しました。
ソースと宛先のすべての列が整列されます (ただし、クローンなので心配ありません)。
Sqlサーバーテーブルに
PK
セットとして列があることIDENTITY
ここで何が欠けていますか?
...挿入された行を計算するために作成した「レポート」は、
" 0 行が追加されました "
エラーや例外は報告されていません /throw 。