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

Web Application

مغلق
بدأه Ra-1 في 21 فبراير 2005 · 22 رد · 1,778 مشاهدة · في ASP.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

I did a web application and linked it to a SQL database

it is supposed that when I click a button in the web application all data goes to the database

but when I tried it and click the button I faced this error !

Server Error in '/IT' Application.

--------------------------------------------------------------------------------

It is invalid to show a modal dialog or form when the application is not running in UserInteractive mode. Specify the ServiceNotification or DefaultDesktopOnly style to display a notification from a service application.

:blink:

ما معناته ؟؟؟ وما الخلل؟؟؟

... Programmer Girl ...
#2

اين الكود الذى وضعته فى الزر الذى ذكرته ؟

و هل استخدمت

messagebox.show() Method

لانها لا تعمل فى ال Web Application بل فى ال Windows Forms فقط

Technical Lead Developer

My LinkedIn Profile

اللهم قنى شر الجهل و الجهلاء

( اقْتَرَبَ لِلنَّاسِ حِسَابُهُمْ وَهُمْ فِي غَفْلَةٍ مَّعْرِضُونَ ) {الأنبياء:1}

#3

هذا الكود ...

    Private Sub approve_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles approve.Click

        Try

            Dim cmd As New SqlCommand
            Dim par1 As New SqlParameter
            Dim par2 As New SqlParameter
            Dim par3 As New SqlParameter
            Dim par4 As New SqlParameter
            Dim par5 As New SqlParameter
            Dim par6 As New SqlParameter
            Dim par7 As New SqlParameter
            Dim par8 As New SqlParameter
            Dim par9 As New SqlParameter
            Dim par10 As New SqlParameter
            Dim par11 As New SqlParameter
            Dim par12 As New SqlParameter
            Dim par13 As New SqlParameter

            cmd.Connection = cn
            cmd.CommandType = CommandType.StoredProcedure
            cmd.CommandText = "IT_up_parm_ins"

            par1.ParameterName = "@IT_name_vc"
            par1.DbType = DbType.String
            par1.Direction = ParameterDirection.Input
            par1.Size = 255
            par1.Value = Me.DropDownList4.SelectedItem

            par2.ParameterName = "@subtype_vc "
            par2.DbType = DbType.String
            par2.Direction = ParameterDirection.Input
            par2.Size = 4
            par2.Value = Me.CheckBoxList3.SelectedItem

            par3.ParameterName = "@HSR_dt"
            par3.DbType = DbType.DateTime
            par3.Direction = ParameterDirection.Input
            par3.Size = 8
            par3.Value = Me.Calendar1.SelectedDate

            par4.ParameterName = "@delivery_dt"
            par4.DbType = DbType.DateTime
            par4.Direction = ParameterDirection.Input
            par4.Size = 8
            par4.Value = Me.Calendar2.SelectedDate

            par5.ParameterName = "@support_type_vc"
            par5.DbType = DbType.String
            par5.Direction = ParameterDirection.Input
            par5.Size = 255
            par5.Value = Me.CheckBoxList1.SelectedItem

            par6.ParameterName = "@case_type_vc"
            par6.DbType = DbType.String
            par6.Direction = ParameterDirection.Input
            par6.Size = 255
            par6.Value = Me.RadioButtonList1.SelectedItem


            par7.ParameterName = "@type_vc"
            par7.DbType = DbType.String
            par7.Direction = ParameterDirection.Input
            par7.Size = 255
            par7.Value = Me.CheckBoxList3.SelectedItem

            par8.ParameterName = "@analysis_vc"
            par8.DbType = DbType.String
            par8.Direction = ParameterDirection.Input
            par8.Size = 255
            par8.Value = Me.TextBox3.Text

            par9.ParameterName = "@superior_approval_vc"
            par9.DbType = DbType.String
            par9.Direction = ParameterDirection.Input
            par9.Size = 255
            par9.Value = Me.DropDownList3.SelectedItem

            par10.ParameterName = "@case_description_vc"
            par10.DbType = DbType.String
            par10.Direction = ParameterDirection.Input
            par10.Size = 255
            par10.Value = Me.TextBox2.Text

            par11.ParameterName = "@department_vc"
            par11.DbType = DbType.String
            par11.Direction = ParameterDirection.Input
            par11.Size = 255
            par11.Value = Me.DropDownList2.SelectedItem

            par12.ParameterName = "@requester_name_vc"
            par12.DbType = DbType.String
            par12.Direction = ParameterDirection.Input
            par12.Size = 255
            par12.Value = Me.DropDownList1.SelectedItem

            par13.ParameterName = "@new_system_id"
            par13.DbType = DbType.Int32
            par13.Direction = ParameterDirection.Output
            par13.Size = 4

            cmd.Parameters.Add(par1)
            cmd.Parameters.Add(par2)
            cmd.Parameters.Add(par3)
            cmd.Parameters.Add(par4)
            cmd.Parameters.Add(par5)
            cmd.Parameters.Add(par6)
            cmd.Parameters.Add(par7)
            cmd.Parameters.Add(par8)
            cmd.Parameters.Add(par9)
            cmd.Parameters.Add(par10)
            cmd.Parameters.Add(par11)
            cmd.Parameters.Add(par12)
            cmd.Parameters.Add(par13)


            cn.Open()
            cmd.ExecuteNonQuery()
            cn.Close()

            MsgBox("You added id=" & par13.Value)

        Catch ex As Exception
            MsgBox(ex.Message)
        End Try


    End Sub
... Programmer Girl ...
#4

الأمر كما قال الأخ طارق. في تطبيقات الويب لا يمكن استخدام الـMessage Box

#5

ما الحل إذا ؟

... Programmer Girl ...
#6

I removed the msg box

and the error disappeard

but u know what?

the data does not go to the database !!!

... Programmer Girl ...
#7

Instead of using a message box, you can use JavaScript like this:

Sub ShowJavaScriptMessage(message as string)
	message = "<script language=JavaScript>alert('" + message + "')</script>"
	Page.RegisterClientScriptBlock("msgbox",message)
End Sub

You can use this sub like this in the catch clause

ShowJavaScriptMessage(ex.message)

تم تعديل هذه المشاركة بواسطة System Down في 21 فبراير 2005 في 12:15

#8

السلام عليكم

الأخ الفاضل

بالنسبة لمسألة ال MsgBox فقد أوضحها أخويَ طارق و System Down فجزاهما الله خيراً ، ولن أزيد عليهما

ولكن لي تعليق بسيط على الكود الذي وضعته

أخي أنت قمت بتعريف متغيرات كثيرة من النوع SqlPrameteوهذا يشكل إجهاد على الذاكرة أولاً ثم أنه أيضاً يؤدي إلى بطء شديد في تحميل الصفحات لا تنس أنك تعمل في Web Application

، كذلك هناك أيضاً نوع البيانات المستخدمة فأنت استخدمت أنواع DbType رغم ان كان من المفترض أن تستخدم SqlDbType طالما أنك تستخدم قاعدة بيانات من نوع Sql

المهم سأرفق لك نفس كودك (أو جزء منه) ولكن بشكل آخر ، وحاول أنت أن تكمل على نفس المنوال ثم أعطني الناتج

        Dim SqlCon As SqlConnection = cn
        Dim SqlCmd As New SqlCommand("IT_up_parm_ins", SqlCon)
        Dim SqlPrm As SqlParameter

        SqlCmd.CommandType = CommandType.StoredProcedure

        SqlPrm = New SqlParameter("@IT_name_vc", SqlDbType.VarChar, 255)
        SqlPrm.Direction = ParameterDirection.Input
        SqlPrm.Value = Me.DropDownList4.SelectedItem
        SqlCmd.Parameters.Add(SqlPrm)

        SqlPrm = New SqlParameter("@subtype_vc", SqlDbType.VarChar, 4)
        SqlPrm.Direction = ParameterDirection.Input
        SqlPrm.Value = Me.DropDownList3.SelectedItem
        SqlCmd.Parameters.Add(SqlPrm)

        .
        .
        .

        SqlCon.Open()
        SqlCmd.ExecuteNonQuery()
        SqlCmd.Dispose()
        SqlCon.Close()

ستلاحظ في الكود أنني عرفت متغير واحد SqlParameter ثم أعيد استخدامه في كل مرة وهذا يوفر على الذاكرة الكثير وكذلك على وقت التحميل

أيضاً قمت بتغيير الأنواع من DbType إلى SqlDbType وافترضت أنك تستخدم String لتحل محل VarChar لذلك قمت باستخدامها ، وأيضاً قمت بتحرير الذاكرة من الكائن SqlCmd لأنه لا حاجة لنا فيه بعد ذلك

عموماً جرب وأعطني الناتج

والله الموفق

تم تعديل هذه المشاركة بواسطة محمد النحراوي في 21 فبراير 2005 في 16:24

#9

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

الطريقتان متماثلتان من حيث استخدام الذاكرة. عندما ينفذ الأمر:

SqlPrm = New SqlParameter("@subtype_vc", SqlDbType.VarChar, 4)

ما يحدث هو أنه يتم استحداث كائن SqlParameter جديد و يتم تغيير المؤشر في SqlPrm ليشير إليه. أما كائن الـSqlParameter القديم فما يزال موجود حتى يأتي الـGC و يتخلص منه. لذا بالنسبة لاستخدام الذاكرة فهما متشابهان.

و لو أنني أفضل طريقتك لأنها أنظف و أسهل للقراءة .

تحياتي :)

#10

جزاك الله خيراً

ولكن في اعتقادي أن

Dim par1 As New SqlParameter

Dim par2 As New SqlParameter

تنشيء متغيرين

أما

Dim SqlPrm As SqlParameter

فتنشيء متغير واحد

SqlPrm = New SqlParameter("@IT_name_vc", SqlDbType.VarChar, 255)

تقوم فقط بإعادة استخدام المتغير المعرف مسبقاً ، بمعنى إعادة تعبئة

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

SqlCmd.Parameters.Add(SqlPrm)

على عكس الطريقة الأولى فيمكنك التعامل مع البيانات المخزنة داخل جميع المتغيرات وحتى آخر لحظة

لذلك لا يهم أن تقوم بشحن ال SqlCmd بالباراميترات الجديدة أولا بأول

فهل هكذا تستوي الطريقتان في تعاملهما مع الذاكرة ؟

فإن كان كذلك فكيف يستطيع المتغير SqlPrm من تخزين قيم أخرى داخله في حين أنه يستخدم نفس العناصر المتفرعة منه في تخزين قيم أخرى !! ؟ ألا ينبغي عليه أولاً وتلقائياً تفريغ الأماكن التي قام بحجزها داخل الذاكرة لتخزين هذه القيم ؟

تم تعديل هذه المشاركة بواسطة محمد النحراوي في 21 فبراير 2005 في 20:53

#11

اجل ان الطريقتين تتساويان في استهلاكهما للذاكرة.

فالمتحولات تبقى في الذاكرة حتى وان اسندت للبرامتر كائنا جديدا وذلك لانها قايلة للوصول reachable .

جرب استخدام

SqlCmd.Parameters("@ParmName")

اي ان الخسارة فقط هي 4 بايت لكل بارمتر يحفظ له اسم مخصص (او 8 بايتات على منصات 64)

من ناحية اخرى فانا استخدم الطريقة التي ذكرتها لانني اجدها اوضح

وحدن بيبقو متل زهر البيلسان وحدهن بيقطفو وراق الزمان

بيسكرو الغابي بيضلهن متل الشتي يدقوا على بوابي على بوابي

يا زمان يا عشب داشر فوق هالحيطان ضويت ورد الليل عكتابي

برج الحمام مسور و عالي هج الحمام بقيت لحالي لحالي

يا ناطرين التلج ما عاد بدكن ترجعو صرخ عليهن بالشتي يا ديب بلكي بيسمعو

http://www.mazikana.com/Songs/F/Fayrouz/mp...uz---Wahdon.mp3

#12

هل من الممكن توضيح هذه العبارة

"لانها قايلة للوصول reachable ."

وشكراً

#13

اي انك تستطيع الوصول الى هذا الكائن وتغير صفاته وذلك بالطريقة التي ذكرتها في الاعلى. وبذلك فهو ليس عرضة لل GC.

وحدن بيبقو متل زهر البيلسان وحدهن بيقطفو وراق الزمان

بيسكرو الغابي بيضلهن متل الشتي يدقوا على بوابي على بوابي

يا زمان يا عشب داشر فوق هالحيطان ضويت ورد الليل عكتابي

برج الحمام مسور و عالي هج الحمام بقيت لحالي لحالي

يا ناطرين التلج ما عاد بدكن ترجعو صرخ عليهن بالشتي يا ديب بلكي بيسمعو

http://www.mazikana.com/Songs/F/Fayrouz/mp...uz---Wahdon.mp3

#14

كلام الأخ DotNetExpert صحيح. هذا الأمر يحدث لأي متغير من نوع refrence-type. أما متغيرات الـValue-type مثل integer و string فهي تتصرف كما قال الأخ نحراوي.

أحد مميزات الدوت نيت هو وجود الـGC أو Garbage Collector الذي يقوم بتنظيف الذاكرة بشكل دوري من الكائنات التي لم تعد تستعمل. في اللغات التي لا تحتوي على GC مثل العجوز ++C فإنه عليك التخلص من الكائنات و المؤشرات يدوياً و إلا بقيت في الذاكرة حتى يتم اعادة تشغيل الجهاز و هو ما يسمى بتهريب الذاكرة Memory Leak و هو موضوع يجيب الصداع!

تم تعديل هذه المشاركة بواسطة System Down في 22 فبراير 2005 في 12:04

#15

طيب يا شباب أحاول أشرحها بإسلوب آخر

لقد قمت بعمل إختبار عملي وهو كالآتي :

قمت بتعريف مصفوفة من حجمها مليون 1000000 على أنها من النوع SqlParameter هكذا :

        Dim SqlPrm(1000000) As Data.SqlClient.SqlParameter

أظن نحن متفقون أن تعريف مصفوفة حجمها مليون هو نفس الأمر أن نعرف متغيرات عددها مليون ، أي في استهلاك الذاكرة

بمعنى أن الأمر السابق هو هو أن نعرف SqlPrm2 ، SqlPrm1 وهكذا إلى مليون

المهم .. وضعت بعد ذلك عداد كالتالي :

        For i As Integer = 0 To 1000000
            SqlPrm(i) = New Data.SqlClient.SqlParameter
        Next

هذه الطريقة الأولى والتي أقول أنها تستهلك الذاكرة

بعد هذا قمت بعمل كود مماثل ولكن بطريقتي التي أرى أنها لا تستهلك الذاكرة

كالتالي :

        Dim SqlPrm As Data.SqlClient.SqlParameter
        For i As Integer = 0 To 1000000
            SqlPrm = New Data.SqlClient.SqlParameter
        Next

ثم اختبرت زمن الكود الأول وزمن الكود الثاني وكانت النتيجة كما يلي

الكود الأول استغرق لتنفيذه 2937.5 ملي ثانية

الكود الثاني استغرق لتنفيذه 640.625 ملي ثانية

وكنسبة مئوية يكون الكود الثاني قد وفر حوالي 79% تقريباً من الوقت المستغرق في تنفيذ الكود الثاني

فماذا يعني هذا ؟ المفروض أن يكون الزمنين متساويان تقريباً إذا كان استهلاكهما للذاكرة واحد ، خاصة والخطوات تقريباً متطابقة

#16

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

على العموم الكلام الذي نقوله ليس كلام اخترعناه نحن. بل هو موجود في النصوص التقنية الخاصة بالدوت نيت.

سأحاول أن أشرح باسهاب أكثر لماذا الطريقتان متشابهتان. الـSQL Parameter هو كائن من نوع Refrence Type مما يعني أن المتغير الذي نستعمله في البرمجة (SqlPrm في مثالك) لا يحتوي على هذا الكائن بل يحتوي على مؤشر pointer الى المكان الذي يشغله في الذاكرة. عندما نقول

SqlPrm = New Data.SqlClient.SqlParameter

ما يحدث هو أن كائناً جديداً من نوع SqlParameter يتم استحداثه و وضعه في مكان ما من الذاكرة. ثم يصبح SqlPrm مؤشر الى هذا العنوان. و عندما نستدعي قيمة SqlPrm فإننا لا نستعيده من داخل هذا المتغير بل نحصل على عنوان ذاكرة منه و بهذا العنوان نسترجع الـSqlParameter.

لنقم بهذه العملية:

SqlPrm = Nothing

ما يحدث هنا هو أننا غيرنا المؤشر الموجود في SqlPrm ليشير الى لا شئ. مما يعني أننا بعد ذلك لن نستطيع الحصول على قيمة الـSqlParameter عن طريق SqlPrm لأن عنوانها لم يعد موجوداً. و لكن هذا لا يعني أنها اختفت من الذاكرة. فهي ما تزال موجودة (نحن فقط لا نعرف أين عنوانها) و ستبقى قابعة في الذاكرة حتى يأتي الـGC و يقرر أنها لم تعد تحت الإستعمال ثم في ذلك الوقت و في ذلك الوقت فقط تزال من الذاكرة.

لنعد الى مثالنا. لنقل أننا عملنا التالي:

dim p1, p2 as New SqlParameter
dim comm as New SqlCommand

comm.Parameters.Add(p1)
comm.Parameters.Add(p2)

أعتقد أننا متفقون بأن هناك الآن اثنان SqlParameter في الذاكرة و هما داخل الـSqlCommand، صحيح؟

لنقم بالطيرقة الثانية:

dim p1 as SqlParameter
dim comm as New SqlCommand

p1=new SqlParameter
comm.Parameters.Add(p1)

p1= new SqlParameter
comm.Parameters.Add(p1)

كما ترى هناك متغير واحد فقط. نقوم باستحداث SqlParameter جديد و نضع عنوانه داخل المتغير ثم نضيفه الى الـSqlCommand.

ثم نقوم باستحداث SqlParameter ثاني و نضع عنوانه في المتغير. ثم نضيفه الى الـSqlCommand.

ماذا حدث للـSqlParameter الأول؟ ما زال موجوداً في الذاكرة. المتغير لم يعد يحمل عنوانه لأننا استبدلناه بعنوان الـSqlParameter الثاني. و لكنه ما زال موجوداً في الذاكرة و إن لم نستطع الوصول اليه عن طريق المتغير. الدليل هو أننا ما زلنا نستطيع الوصول اليه عن طريق الـSqlCommand. لو دخلنا في الكود مرة أخرى و استفسرنا عن القيمة التالية:

comm.Parameters.Count

ستجد أن القيمة اثنان. اي أن الـSqlParameter الأول موجود و يمكن الوصول اليه هكذا

comm.Paramters(0)

لأنه رغم أن عنوانه تم مسحه من المتغير p1 الا أنه مازال موجوداً داخل الـParameter Collection الخاص بالSqlCommand. و سيبقى الـSqlParameter الأول في الذاكرة طالما هو قيد الإستعمال (أي يتم الإشارة اليه من مكان آخر، في مثالنا الـSqlCommand)

لهذا، حتى المثال الثاني يحوي على اثنان SqlParameter في الذاكرة. أي أن استهلاكهما للذاكرة واحد.

QED :)

تم تعديل هذه المشاركة بواسطة System Down في 22 فبراير 2005 في 18:09

#17

جزاك الله خيراً فهمت مقصدك

:)

#18

ولله الحمد تخطيت مشاكل الاتصال والآ، أواجه error جديد !

SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.

:blink: ؟؟!

... Programmer Girl ...
#19
اقتباس
ولله الحمد تخطيت مشاكل الاتصال والآ، أواجه error جديد !

SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.

سبب هذا الخطأ هو تمرير التاريخ بالصيغة DD/MM/YYYY، والحل:

كيف أجعل فورمات التاريخ dd/mm/yyyy ؟؟!

أو في VB.Net مثلا:

Dim strdtDate As String = GetServerDate().ToString("M/d/yyyy")
sql=sql & " '" & strdtDate  & "' "

تم تعديل هذه المشاركة بواسطة walcom في 7 مارس 2005 في 10:43

فكر بطريقة أخرى

#20

شكرا شكرا!

ولكن ظهر لي خطأ آخر :)

Error converting data type nvarchar to datetime.

... Programmer Girl ...
#21

Ok ok I solved it

but

NEW ERROR !

Index (zero based) must be greater than or equal to zero and less than the size of the argument list.

:rolleyes:

... Programmer Girl ...
#22

anybody there?

also solved !!!

and again a new error

anyone knows what is it

Object must implement IConvertible.

... Programmer Girl ...
#23

alhamdolilla solved

u know how

my code was like this

cmd.Parameters("@analysis_vc").Value = Me.TextBox3

it should look like this

cmd.Parameters("@analysis_vc").Value = Me.TextBox3.Text

:rolleyes:

anyways a new error msg appeard!

anyone knows it???

Input string was not in a correct format.

:blink:

تم تعديل هذه المشاركة بواسطة walcom في 7 يونيو 2005 في 22:45

... Programmer Girl ...

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

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