الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مشكلة إدخال نص طويل إلى قاعدة بيانات sql server

مغلق
بدأه programmer55 في 6 نوفمبر 2005 · 13 رد · 1,038 مشاهدة · في ASP.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

لقد قمت بتصميم صفحة aspx تحتوي على فورم form يقوم من خلاله المستخدم بإدخال البيانات إلى قاعدة البيانات من نوع

sql

وقاعدة البيايانات بها حقل خاص لإدخال نص طويل قليلاً، ولقد جعلت هذا الحقل من نوع

nvarchar 4000

عندما ادخل نص طويل عن طريق ال sql server فالنص يدخل بأكمله وأستطيع استعراضه على صفحة الانترنت أيضاً، ولكن المشكلة عندما أحاول إدخال النص الطويل من خلال الفورم الذي قمت بتصميمه على صفحة aspx فإن النص لا يحفظ بالكامل في قاعدة البيانات بل يحفظ 50 characters فقط

لقد ظننت في البداية أن المشكلة تكمل في textbox الموجود في الفورم والذي أقوم من خلاله بإدخال النص ولكني عندما قمت بعمل debug واستعرضت قيم المتغيرات الموجوده لدي، تبين لي أن هذا textbox يقوم بتخزين النص بأكمله.

ربما تكون المشكله في نوع الحقل nvarchar 4000

لقد قمت بتجربة أكثر من نوع ولكني أحصل على نفس النتيجة في كل مره حيث لا أستطيع تخزين سوى 50 characters

أفيدوني.. جزاكم الله خيراَ

#2

وعليكم السلام ورحمة الله

أعتقد والله تعالى أعلم انك تستخدم stored procedure لتخزين القيم الجديدة ، والخطأ هنا ربما يكون في إحدى ناحيتين

الأولى ، ان يكون المتغير المعرف لاستقبال القيمة التي ذكرتها معرف على أنه nvarchar(50)

الثانية ، أن يكون البارمتر الممرر إلى ال stored proc محدد طوله بخمسين

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

#3

في حالة النص الطويل لا تستخدم nvarchar استخدم ntext

Sr. Software Development Engineer
Hulu, LLC
My Blogs

#4

عفواً أخي ولكني لا أستخدم الـ stored procedure

أنا أستخدم هذه الطريقة

        Dim rowNew As ds_news.NewsRow
        rowNew = Ds_news1.News.NewNewsRow

        ' Add data to the row.
        rowNew.NewsID = GetNewNewsID()
        rowNew.NewsPublisher = txtPublisher.Text
        rowNew.NewsDate = txtDate.Text
        rowNew.NewsTitle = txtTitle.Text
        rowNew.NewsAbstract = txtAbstract.Text
        rowNew.NewsArticle = txtArticle.Text
        rowNew.NewsImage = GetImageName()

        ' Add the row to the data set.
        Ds_news1.News.AddNewsRow(rowNew)

لقد قلت لي أنه ريما كانت قمية المتغير الذي أخزن فيه النص محدده بـ 50 .. فحاولت استعراض خصائص الـ rowNew ولكني لم ألاحظ شيئاً يدلني إلى ذلك..

شكراً لمحاولتك المساعدة وأتمنى أن أجد الحل

#5

أخي bashmohandes

النوع ntext محدد لدي بقيمة 16 ولا أستطيع تغيير القمية.. والغريب في الأمر أني اخترته وتركت القيمة كما هي 16 وعندما أدخلت المعلومات من الفورم.. قام بتخزين 50 charctaers وليس 16.. فهذا يؤكد لي أن المشكلة في مكان ما لا أعرف أين!! وهذا ما يزيد حيرتي أيضاً

#6

أخي محمد النحراوي

لقد حاولت فعل التالي

   Dim result As String
        result = rowNew.NewsArticle.Length.ToString

وذلك بعد أن أدخلت نص طوله 800 وكانت نتيجة الـ result هي 800

هذا يعني أن الـ rowNew قام بتخزين النص بالكامل..

ومازال التنقيب عن مصدر الخطأ مستمراً

#7

ادخل على السكيما الخاصة بالداتاسيت ds_news ، وانظر في الجدول وتأكد أن طول الحقل المطلوب ليس 50

#8

ولقد قمت أيضاً بعرض خصائص ال rowNew أثناء عملية ال debug وكانت النتيجة كالتالي

>? rownew
{MyDatabase.ds_news.NewsRow}
    HasErrors: False
    inCascade: False
    inChangingEvent: False
    inDeletingEvent: False
    Item: <cannot view indexed property>
    Item: <cannot view indexed property>
    ItemArray: {Length=7}
    newRecord: 9
    NewsAbstract: "الملخص"
    NewsArticle: "المقالة هنا المقالة هنا المقالة هنا المقالة هنا ال"
    NewsDate: #1/1/2001#
    NewsID: 11
    NewsImage: "11.JPG"
    NewsPublisher: "جريدة الاتحاد "
    NewsTitle: "عنوان المقالة "
    oldRecord: 9
    RowError: ""
    rowID: 9
    RowState: Unchanged
    Table: {MyDatabase.ds_news.NewsDataTable}
    tableNews: {MyDatabase.ds_news.NewsDataTable}
    tempRecord: -1

وكما ترى NewsArticle لم تخزن سوى سطراً واحداً وأنا فالواقع قمت بإدخال فقرة طويلة

#9

بالنسبة لنوع البيانات ntext فيمكنه تخزين بيانات حتى 2 جيجا بايت طبعاً مع مراعاة أن السجل الواحد في SQL SERVER 2000 لا يتحمل أكثر من 2 جيجا بايت (فقط !) ، يعني أقصى حد يمكن أن تصل إليه قاعدة بيانات أكسيس (طبعا هذا في حالة وصلت أصلا لحجم 50 ميجا بدون مشاكل)

:)

#10

أخي فضلا قم بفحص الجدول من داخل مخطط الداتاسيت

#11

دخلت على السكيما للداتا سيت وجدتها من نوع string ولكن لا أعرف كيف أعرف قيمتها اذا كانت 50

post-63472-1131289361_thumb.gif

#12

أخــــــــــــــــــــيراً..

(ولله الحمد)

لقد قمت بإعادة إنشاء الصفحة التي بها الفورم ..

وبالتالي صتعنت connection و dataAdapter و dataset جديده.. والآن استطيع إدخال التص بأكمله.. فالظاهر أنني قد قمت بإنشاء ال dataset القديمة عندما كان نوع الحقل nvarchar 50 وقمت بتغيير نوع الحقل إلى nvarchar 4000 فيما بعد.. ولم أعلم أنه كان يجب علي إعادة عمل ال datasetأو الـ sqlDataAdapter

شكراً أخي فبفضلك تنبهت أن المشكلة تكمن في ال dataset

وجزاك الله خير الجزاء..

تم تعديل هذه المشاركة بواسطة programmer55 في 6 نوفمبر 2005 في 18:43

#13

عفوا أخي الفاضل ، والشكر لله تعالى

ومع ذلك فقد اخطأت أنا :) فقد خانتني ذاكرتي ، فأطوال الحقول لا تخزن داخل الداتا سيت ، بل تخزن في الCommands التي ينشئها المعالج تلقائيا ، فأنت مثلاً إذا دخلت الكود الخاص بالصفحة التي تعرض البيانات ، فسوف تجد مثلا شيء مثل هذا OleDbInsertCommand1 ، إذا وجدته ستجد تحته أيضاً كود مثل هذا

        Me.OleDbInsertCommand1.Parameters.Add(New System.Data.OleDb.OleDbParameter("CustomerID", System.Data.OleDb.OleDbType.VarWChar, 5, "CustomerID"))

تلاحظ هنا تحديد طول الحقل ، وهذا ما قصدته في البداية فنفس الأسلوب تقريباً يستخدم لتمرير البارمترات للSP

لذلك قلت لك أن هذا الخطا ينشأ عندما تنشيء الكود أو ال SP ثم تغير في طول الحقل

و طبعاً كان يمكن فقط تغيير طول الحقل من الكود المذكر ولا حاجة لهدم وإعادة بناء الفورم كاملاً

عموما الحمد لله أنها انحلت

وفقني الله وإياك للخير :)

#14

بالفعل كما قلت ولقد دخلت على الكود المنشأ تلقائياً ووجدت ما تحدثت عنه..

شكراً مرةً أخرى ووفقكم الله لما فيه الخير لأعضاء هذا المنتدى..

هذا الموضوع مغلق.

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…