سؤال

أحاول ملء DataTable ، لبناء وقال مركز القيادة ، وذلك باستخدام ما يلي:

MySqlCommand cmd = new MySqlCommand();
cmd.Connection = new MySqlConnection(Properties.Settings.Default.dbConnectionString);
cmd.CommandType = CommandType.Text;
cmd.CommandText = "SELECT ... LEFT JOIN ... WHERE ..."; /* query snipped */

// prepare data
dataTable.Clear();
cn.Open();
// fill datatable
dt.Load(cmd.ExecuteReader());
// fill report
rds = new ReportDataSource("InvoicesDataSet_InvoiceTable",dt);
reportViewerLocal.LocalReport.DataSources.Clear();
reportViewerLocal.LocalReport.DataSources.Add(rds);

عند نقطة واحدة لاحظت أن التقرير لم يكتمل وكان في عداد المفقودين سجل واحد.لقد تغيرت بعض الظروف التي الاستعلام سيعود بالضبط صفين و... مفاجأة:ويبين التقرير صف واحد فقط بدلا من اثنين.حاولت تصحيح ذلك لمعرفة أين المشكلة و حصلت على تمسك في

 dt.Load(cmd.ExecuteReader());

عندما لاحظت أن DataReader يحتوي على اثنين من السجلات ولكن DataTable يحتوي على واحد فقط.عن طريق الصدفة ، لقد وأضاف ORDER BY شرط أن الاستعلام و لاحظت أن هذه المرة أظهر تقرير بشكل صحيح.

على ما يبدو DataReader يحتوي على صفين ولكن DataTable فقط يقرأ كل منهم إذا كان استعلام SQL سلسلة يحتوي على ORDER BY (وإلا فإنه يقرأ فقط واحد آخر).يمكن لأي شخص أن يشرح لماذا يحدث هذا وكيف يمكن أن تكون ثابتة ؟

تحرير: عندما كنت أول نشر السؤال, أنا قلت تخطي أول الصف ؛ لاحقا أدركت أنه في الواقع سوى قراءة الصف الأخير و قمت بتحرير النص وفقا لذلك (في ذلك الوقت جميع الوثائق صنفت في صفين و يبدو أن تخطي الأولى عندما في الواقع سوى أظهرت آخر).قد يكون هذا بسبب حقيقة أن لم يكن لديك معرف فريد يمكن من خلالها التمييز بين الصفوف التي يتم إرجاعها من قبل الخلية حتى إضافة ORDER BY بيان سبب ذلك إلى إنشاء معرف فريد لكل صف.
هذا هو مجرد نظرية لا يمكن أن تدعم ذلك ، ولكن كل ما عندي اختبارات ويبدو أن يؤدي إلى نفس النتيجة.

هل كانت مفيدة؟

المحلول

كان لدي نفس المشكلة.أخذت تلميح من بلوق الخاص بك و وضع ORDER BY في الاستعلام بحيث أنها يمكن أن تشكل معا مفتاح فريد عن كافة السجلات التي يتم إرجاعها بواسطة الاستعلام.هذا حل المشكلة.غريب.

نصائح أخرى

السؤال عدة سنوات ، ولكن لم أجد إجابة لائقة ، عدا المذكورة أعلاه الحل.

بعد تافه حولها قليلا وجدت أن DataTable.طريقة تحميل يتوقع عمود المفتاح الأساسي في البيانات الأساسية.إذا كنت قراءة الوثائق بعناية ، هذا يصبح من الواضح ، على الرغم من أنه لم يذكر بشكل صريح جدا.

إذا كان لديك عمود اسمه "id" يبدو أن استخدام (والتي ثابتة بالنسبة لي).وإلا فإنه يبدو أن استخدام العمود الأول ، سواء كانت من نوعها أم لا ، الكتابة الصفوف مع نفس القيمة في هذا العمود كما يتم قراءة.إذا لم يكن لديك عمود اسمه "id" و أول عمود ليست فريدة من نوعها ، أقترح محاولة صراحة عمود المفتاح الأساسي(s) datatable قبل التحميل datareader.

فقط في حالة أي شخص هو وجود مشكلة مماثلة كما canceriens, كنت تستخدم إذا DataReader.Read ...بدلا من إذا DataReader.HasRows للتحقق من وجود قبل الاتصال dt.load(DataReader) Doh!

كان نفس المشكلة.لأنه المفتاح الأساسي على جميع الصفوف هو نفسه.انها غالبا ما تستخدم مفتاح النتائج ، وبالتالي انها مجرد الكتابة نفس الصف مرارا وتكرارا.

Datatables.تحميل يشير إلى ملء طريقة لفهم كيف يعمل.هذه الصفحة أنه هو المفتاح الأساسي على علم.منذ المفاتيح الأساسية يمكن أن تحدث إلا مرة واحدة وتستخدم مفاتيح الصف ...

"التعبئة العملية ثم يضيف الصفوف إلى الوجهة DataTable الكائنات في قاعدة البيانات ، وخلق الكائنات DataTable إذا لم يكن موجودا بالفعل.عند إنشاء كائنات DataTable التعبئة العملية عادة يخلق فقط اسم عمود بيانات التعريف.ومع ذلك ، إذا كان MissingSchemaAction يتم تعيين الخاصية إلى AddWithKey المناسبة المفاتيح الأساسية والقيود كما خلقت." (http://msdn.microsoft.com/en-us/library/zxkb3c3d.aspx)

صادفت هذه المشكلة اليوم.

لا شيء في هذا الموضوع ثابت أنه للأسف ، ولكن بعد ذلك أنا ملفوفة بلدي استعلام SQL في عبارة SELECT أخرى و العمل!

على سبيل المثال:

SELECT * FROM (
    SELECT ..... < YOUR NORMAL SQL STATEMENT HERE />
) allrecords

غريب....

لا تستخدم

dr.Read()

لأنه يتحرك المؤشر إلى الصف التالي.إزالة هذا الخط الأمل في أنه سوف يعمل.

يمكنك الاستيلاء الفعلي الاستعلام يعمل من منشئ ملفات التعريف SQL ومحاولة تشغيله ؟ قد لا يكون ما هو متوقع.

لا يمكنك الحصول على نفس النتيجة عند استخدام SqlDataAdapter.ملء(dataTable)?

هل حاولت مختلفة الأوامر السلوكيات على القارئ ؟ MSDN مستندات

أعرف أن هذا هو السؤال القديم, ولكن بالنسبة لي أعتقد أن عملت في حين الاستعلام عن قاعدة بيانات access و يلاحظ أنه كان في عداد المفقودين الصف 1 من الاستعلام على التالية:-

    if(dataset.read())  - Misses a row.

    if(dataset.hasrows) - Missing row appears.

لست متأكدا لماذا كنت في عداد المفقودين على التوالي في datatable, هل من الممكن أنك تحتاج إلى إغلاق القارئ ؟ في أي حال, هنا هو كيف أنا عادة تحميل التقارير و يعمل في كل مرة...

        Dim deals As New DealsProvider()
        Dim adapter As New ReportingDataTableAdapters.ReportDealsAdapter
        Dim report As ReportingData.ReportDealsDataTable = deals.GetActiveDealsReport()
        rptReports.LocalReport.DataSources.Add(New ReportDataSource("ActiveDeals_Data", report))

من الغريب أن نرى إذا كان لا يزال يحدث.

في حالتي لا النظام ولا دينارا.AcceptChanges() هو العامل.أنا لا أعرف لماذا هذا مشكلة.أنا بعد 50 السجلات في قاعدة البيانات ولكن يظهر فقط 49 في datatable.تخطي الصف الأول, و إذا كان هناك سجل واحد فقط في datareader يظهر أي شيء على الإطلاق.

ما bizzareeee.....

هل حاولت الإتصال dt.AcceptChanges() بعد dt.Load(cmd.ExecuteReader()) اتصل لمعرفة ما إذا كان هذا يساعد ؟

أعرف أن هذا هو السؤال القديم, ولكن كنت تعاني نفس المشكلة و أي من الحلول المذكورة هنا لم تساعد.

في حالتي, باستخدام اسم مستعار على كولوم التي تستخدم PrimaryKey حل هذه المسألة.

لذا بدلا من

SELECT a
     , b
FROM table

اعتدت

SELECT a as gurgleurp
     , b
FROM table

وعملت.

كان عندي نفس المشكلة..لا تستخدم dataReader.قراءة() في كل شيء..وسوف يأخذ المؤشر إلى الصف التالي.بدلا من استخدام مباشرة datatable.تحميل(dataReader).

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