سؤال

أواجه مشكلة باستخدام sqlbulkcopy عندما يتم إشراك الأعمدة البارزة. يبدو أن sqlbulkcopy لا يعرف كيفية التعامل مع الأعمدة الباطئة ويلقي خطأ في الحجم غير قانوني عندما يواجه عمود طول صفر. الخطأ هو "تلقي طول عمود غير صالح من عميل BCP ..."

أنا أتساءل ما هي أفضل الممارسات للتعامل مع هذا. هذه يبدو أن وظيفة منتدى جيدة تصف هذه المشكلة وكيفية حلها لقراءة ملف CSV.

أعتقد أن وضعي جميل وبسيط. أحتاج إلى نقل مجموعة غير معروفة للبيانات من جدول قاعدة بيانات إلى قاعدة بيانات أخرى. ستكون الإجابة الأكثر بساطة بالنسبة لي هي استخدام SSIS/DTS أو الخوادم المرتبطة في SQL Server ، ومع ذلك يريد العميل من التطبيق القيام بحركة البيانات.

هل هناك عمل معروف حول هذا أو حل أفضل لتبخير لنقل البيانات بحقول لاغية؟

//access db
string src_db = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\SourceDB.mdb;Jet OLEDB ";
//sql db
string dest_db = @"Data Source=.\TEST;Initial Catalog=testdb;User Id=user;Password=password;";
string sql = "";
OleDbConnection sdb = new OleDbConnection( src_db );
OleDbCommand cmd = new OleDbCommand( sql, sdb );
OleDbDataReader rs = null;

SqlConnection db = new SqlConnection( dest_db );
SqlCommand clear = null;
SqlBulkCopy bulk_load = null;

// Read in the source table
sql = "select * from someTable";
sdb.Open();
cmd = new OleDbCommand( sql, sdb );
rs = cmd.ExecuteReader();

// Import into the destination table
bulk_load = new SqlBulkCopy( db );
bulk_load.DestinationTableName = "test";
bulk_load.WriteToServer( rs );
هل كانت مفيدة؟

المحلول

لا يمكن لفئة SqlBulkcopy التعامل مع الحقول الفارغة. لا يتحقق مما إذا كان الحقل لاغية قبل محاولة حساب طوله. وبالتالي رمي خطأ.

يشير المنشور الذي ذكرته في السؤال إلى تنفيذ idatareader الذي يلقي dbnull.value بدلاً من القيمة الفارغة فقط - وهذا يعمل حول العيب باستخدام sqlbulkcopy.

نصائح أخرى

يجب أن تعمل إذا كنت قد تم فحصها في حقل وجهتك المعني.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top