1

それらの例が非常に多いため..SqlBulkCopy次のシナリオでは、の使用を示していませんが、オンラインで調査していました。

SqlServer(2008) から既存のデータを取得するためにクエリを使用したDataTableので、ローカルでデータを並べ替え、処理中にデータベースにヒットするのを避けることができました。

だから今、その段階で、私はすでにソースdataTableスキーマを複製するオプションを持っていますlocalDataTable = DataTableFromOnlineSqlServer.Clone();

そうすることでClone()、すべての列と、それぞれの列データ型が得られました。

次に、プログラムの次の段階で、Cloned-From-Db を埋めています - その Local (まだ Empty) new DataTablewith 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;
        }
}

問題は、データがまったく挿入されていないことです。

私はいくつかの調査を行いましたが、解決策はありません。次のことも確認しました。

  1. ソースと宛先のすべての列が整列されます (ただし、クローンなので心配ありません)。

  2. SqlサーバーテーブルにPKセットとして列があることIDENTITY

ここで何が欠けていますか?

...挿入された行を計算するために作成した「レポート」は、

" 0 行が追加されました "

エラーや例外は報告されていません /throw 。

4

0 に答える 0