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

امكانية تخزين قيمة Null في حقل رقمي مرتبط بجدول آخر

بدأه majed123 في 22 فبراير 2008 · 11 رد · 1,121 مشاهدة · في ASP.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

الصفحة مكونة من عدة حقول ومربعات نص ومن ضمنها DropDownList ddl

باختصار

يمكن للمستخدم عدم وضع خيار من ضمن الخيارات المقترحة في ddl وقد قمت بإظهار سجل فارغ ضمن الخيارات

المشكلة أنه لا يتم تخزين القيمة الفارغة وتحويلها من String إلى Integer وتظهر مشكلة بذلك

حاولت استخدام cint وتخزين القيمة في حالة عدم الاختيار dbnull واستخدمت أيضا Convert.ToInt32

ولكن كل محاولاتي بائت بالفشل بسبب ارتباط الحقل بحقل رئيسي من جدول آخر

فأرجو ممن لديه الخبرة بذلك مساعدتي

PMI_Logo_1.jpg

مدير مشاريع محترف - PMP
محلل أنظمة معتمد
مدير فريق برمجة تطبيقات ويب .Net

======|||||=====

======@ @====
==o0o== ( ) ==o0o===
================
كل منا يحتاج إلى الإرادة حتى يستطيع أن يقوم بعمله

#2

اخي الكريم,

لم تكن واضحا في سؤالك (كعادة الكثير من الاخوة :) ) ,هل تستعمل الSqlDataSource ؟,ام تستعمل الcode begin للاضافة و التعديل و في اي حدث تقوم بالاضافة و ماهي رسالة الخطأ التي تظهر لك ؟.كل هذا يساعد في حل المشكلة بسهولة.

على العموم ,اعتقادي ان العنصر الاول في الDropDownList يرسل text بدل القيمة null عند عدم اختيار اي قيمة من الDropDownList .فلو كان لدينا الDropDownList التالي:

 <asp:DropDownList ID="DropDownList1" runat="server" DataSourceID="CountriesSDS" DataTextField="Name"
					DataValueField="Id" SelectedValue='<%# Bind("CountryId") %>' AppendDataBoundItems="True">
					<asp:ListItem Selected="True">Select</asp:ListItem>
				</asp:DropDownList>

فان القيمة التي يتم ارسالها عند عدم اختيار عنصر من القائمة (اي الابقاء على العنصر Select) هي القيمة "Select" و بالتالي فان قاعدة البيانات ترفض قيمة نصية فب حقل رقمي.

كل ما عليك فعله هو اضافة الخاصية Value باعطائها قيمة فارغة كالتالي:

  <asp:DropDownList ID="DropDownList1" runat="server" DataSourceID="CountriesSDS" DataTextField="Name"
					DataValueField="Id" SelectedValue='<%# Bind("CountryId") %>' AppendDataBoundItems="True">
					<asp:ListItem Selected="True" Value="" >Select</asp:ListItem>
				</asp:DropDownList>

ولان الباراميتر لديه الخاصية ConvertEmptyStringToNull فسيتم تحويل القيمة النصية الفارغة الى null وهو ما يتم تقبله من قاعدة البيانات على افتراض ان الحقل يقبل هذه القيمة اي Allow nulls مفعلة

المثال كامل:اضافة مدينة مع البلد التابعة له:

جدول Countries

CREATE TABLE [dbo].[Countries](
	[Id] [int] IDENTITY(1,1) NOT NULL,
	[Name] [varchar](50) NOT NULL,
 CONSTRAINT [PK_Countries] PRIMARY KEY CLUSTERED 
(
	[Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

الجدول Cities :

CREATE TABLE [dbo].[Cities](
	[Id] [int] IDENTITY(1,1) NOT NULL,
	[Name] [varchar](50) NULL,
	[CountryId] [int] NULL,
 CONSTRAINT [PK_Cities] PRIMARY KEY CLUSTERED 
(
	[Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[Cities]  WITH CHECK ADD  CONSTRAINT [FK_Cities_Countries] FOREIGN KEY([CountryId])
REFERENCES [dbo].[Countries] ([Id])
GO
ALTER TABLE [dbo].[Cities] CHECK CONSTRAINT [FK_Cities_Countries]

الصفحة :

 <asp:SqlDataSource ID="CitiesSDS" runat="server" ConnectionString="<%$ ConnectionStrings:TestsConnectionString %>" DeleteCommand="DELETE FROM [Cities] WHERE [Id] = @Id" InsertCommand="INSERT INTO [Cities] ([Name], [CountryId]) VALUES (@Name, @CountryId)" SelectCommand="SELECT Cities.Name, Cities.CountryId, Cities.Id, Countries.Name AS CountryName FROM Cities LEFT OUTER JOIN Countries ON Cities.CountryId = Countries.Id" UpdateCommand="UPDATE [Cities] SET [Name] = @Name, [CountryId] = @CountryId WHERE [Id] = @Id">
			<DeleteParameters>
				<asp:Parameter Name="Id" Type="Int32" />
			</DeleteParameters>
			<UpdateParameters>
				<asp:Parameter Name="Name" Type="String" />
				<asp:Parameter Name="CountryId" Type="Int32" />
				<asp:Parameter Name="Id" Type="Int32" />
			</UpdateParameters>
			<InsertParameters>
				<asp:Parameter Name="Name" Type="String" />
				<asp:Parameter Name="CountryId" Type="Int32" ConvertEmptyStringToNull/>
			</InsertParameters>
		</asp:SqlDataSource>
		<asp:FormView ID="CitiesFV" runat="server" DataKeyNames="Id" DataSourceID="CitiesSDS" AllowPaging="True">
			<EditItemTemplate>
				Name:
				<asp:TextBox ID="NameTextBox" runat="server" Text='<%# Bind("Name") %>'></asp:TextBox><br />
				CountryId:
				<asp:DropDownList ID="DropDownList1" runat="server" DataSourceID="CountriesSDS" DataTextField="Name"
					DataValueField="Id" SelectedValue='<%# Bind("CountryId") %>' AppendDataBoundItems="True">
					<asp:ListItem Selected="True" Value="">Select</asp:ListItem>
				</asp:DropDownList><br />
				<asp:LinkButton ID="UpdateButton" runat="server" CausesValidation="True" CommandName="Update"
					Text="Update">
				</asp:LinkButton>
				<asp:LinkButton ID="UpdateCancelButton" runat="server" CausesValidation="False" CommandName="Cancel"
					Text="Cancel">
				</asp:LinkButton>
			</EditItemTemplate>
			<InsertItemTemplate>
				Name:
				<asp:TextBox ID="NameTextBox" runat="server" Text='<%# Bind("Name") %>'></asp:TextBox><br />
				CountryId:
				<asp:DropDownList ID="DropDownList1" runat="server" DataSourceID="CountriesSDS" DataTextField="Name"
					DataValueField="Id" SelectedValue='<%# Bind("CountryId") %>' AppendDataBoundItems="True">
					 <asp:ListItem Selected="True" Value="">Select</asp:ListItem>
				</asp:DropDownList><br />
				<asp:LinkButton ID="InsertButton" runat="server" CausesValidation="True" CommandName="Insert"
					Text="Insert"></asp:LinkButton>
				<asp:LinkButton ID="InsertCancelButton" runat="server" CausesValidation="False" CommandName="Cancel"
					Text="Cancel"></asp:LinkButton>
			</InsertItemTemplate>
			<ItemTemplate>
				Name:
				<asp:Label ID="NameLabel" runat="server" Text='<%# Bind("Name") %>'></asp:Label><br />
				Country:
				<asp:Label ID="CountryIdLabel" runat="server" Text='<%# Bind("CountryName") %>'></asp:Label><br />
				Id:
				<asp:Label ID="IdLabel" runat="server" Text='<%# Eval("Id") %>'></asp:Label><br />
				<asp:LinkButton ID="EditButton" runat="server" CausesValidation="False" CommandName="Edit"
					Text="Edit"></asp:LinkButton>
				<asp:LinkButton ID="DeleteButton" runat="server" CausesValidation="False" CommandName="Delete"
					Text="Delete"></asp:LinkButton>
				<asp:LinkButton ID="NewButton" runat="server" CausesValidation="False" CommandName="New"
					Text="New"></asp:LinkButton>
			</ItemTemplate>
		</asp:FormView>

	</div><asp:SqlDataSource ID="CountriesSDS" runat="server" ConnectionString="<%$ ConnectionStrings:TestsConnectionString %>" SelectCommand="SELECT [Name], [Id] FROM [Countries]">
	</asp:SqlDataSource>
#3

شكرا على تجاوبك وسرعة الإجابة أخي madani

ولكن طريقتي في الإضافة والتعديل والحذف باستخدام كود وإجراءات مخزنة وليس باستخدام DataSource

لذلك فإن طريقة إرسال الParameters تتم من خلال الفورم الكود والClasses

وأعذرني لعدم وضوح السؤال

PMI_Logo_1.jpg

مدير مشاريع محترف - PMP
محلل أنظمة معتمد
مدير فريق برمجة تطبيقات ويب .Net

======|||||=====

======@ @====
==o0o== ( ) ==o0o===
================
كل منا يحتاج إلى الإرادة حتى يستطيع أن يقوم بعمله

#4

ربما وضع الكود الذي تستعمله امامنا قد يفيد في حل المشكلة

#5

1. يوجد جدولين مرتبطين مع بعضهما

2. يوجد Stored Procedure للتعديل أو الإضافة.

3. يوجد Class يحتوي جزء التعديل مثلا على الكود التالي

   Public Function Update() As Boolean
		Dim bolUpdate As Boolean = False
		Try
			SqlHelper.ExecuteNonQuery(connection, "Update_GLB_Persons", _Person_ID, _Person_No, _ID_No, _Person_Full_Name, _Person_Type_ID, _Gender_ID, _Nationality_ID, _Telephone, _Email, _Relation_ID, _OU_ID, _Organization_Name, _Job_Title, _Education_ID, _Experience_ID, _Rank_ID, _Status)
			  bolUpdate = True
		Catch ex As Exception
			_errMessage = GenericExceptionHandler(ex)
		End Try
		Return bolUpdate
	End Function

4. في الصفحة يوجد عدة ddl أقوم بتعبئتها من خلال Public Function وأول قيمة لها = صفر حتى يتمكن المستخدم من عدم الاختيار والنص = ""

أعتقد أنه إلى الآن الأمر واضح

5. عند زر التعديل أقوم بإرسال ال Parameters على النحو التالي

	Dim oData As New MyClassName

			With oData
				.Person_ID = lblPerson_ID.Text
				.Person_No = txtPerson_No.Text
				.ID_No = txtID_No.Text
				.Person_Full_Name = txtPerson_Full_Name.Text
				.Person_Type_ID = ddlPerson_Type_ID.SelectedValue
				.Gender_ID = ddlGender_ID.SelectedValue
				.Nationality_ID = ddlNationality_ID.SelectedValue
				.Telephone = txtTelephone.Text
				.Email = txtEmail.Text
				.Relation_ID = ddlRelation_ID.SelectedValue
				.OU_ID = lblUO_ID.Text
				.Organization_Name = txtOrganization_Name.Text
				.Job_Title = txtJob_Title.Text
				.Education_ID = ddlEducation_ID.SelectedValue
				.Experience_ID = ddlExperience_ID.SelectedValue
				 If ddlRank_ID.SelectedValue <> 0 Then
					.Rank_ID = ddlRank_ID.SelectedValue
				End If
				.Status = 0
				 If .Update Then
					lblError.Text = "تم التعديل"
					End If
			End With

حاولت هنا أن أكتب الكود التالي كما تلاحظ

  
			   If ddlRank_ID.SelectedValue <> 0 Then
					.Rank_ID = ddlRank_ID.SelectedValue
				End If

وحاولت أيضاً الطريقة التالية

.Rank_ID = Convert.ToInt32(DBNull.Value)

هذا ما لدي من شرح تفصيلي فأرجو أن تكون قد وضحت الفكرة الآن

PMI_Logo_1.jpg

مدير مشاريع محترف - PMP
محلل أنظمة معتمد
مدير فريق برمجة تطبيقات ويب .Net

======|||||=====

======@ @====
==o0o== ( ) ==o0o===
================
كل منا يحتاج إلى الإرادة حتى يستطيع أن يقوم بعمله

#6

الخاصية SelectedValue هي من نوع string ,لذلك الشرط الذي كتبته قد يتحقق حتى وان كانت قيمة الDropDownList تساوي صفر,جرب:

If ddlRank_ID.SelectedValue <> "0" Then

ثانيا,ضع كود الدالة SqlHelper.ExecuteNonQuery كي يتضح الامر اكثر

واخيرأ رسالة الخطأ هي بيت القصيد

تم تعديل هذه المشاركة بواسطة madani في 23 فبراير 2008 في 15:09

#7

المشكلة ليست في إظهار قيمة Rank_ID، ما أحتاجه فقط هو كيفية تحويل القيمة الصفرية إلى Null

أما كود الدالة Sqlhelper فهذا لن يفيد في حالتنا هذه

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

Could not convert String to Integer

أنا آسف لإلحاحي على المساعدة، وشاكراً لك تعاونك ومدى صبرك

PMI_Logo_1.jpg

مدير مشاريع محترف - PMP
محلل أنظمة معتمد
مدير فريق برمجة تطبيقات ويب .Net

======|||||=====

======@ @====
==o0o== ( ) ==o0o===
================
كل منا يحتاج إلى الإرادة حتى يستطيع أن يقوم بعمله

#8

ارسل القيمة الى الدالة كالتالي:

SqlHelper.ExecuteNonQuery(connection, "Update_GLB_Persons", _Person_ID, _Person_No, _ID_No, _Person_Full_Name, _Person_Type_ID, _Gender_ID, _Nationality_ID, _Telephone, _Email, _Relation_ID, _OU_ID, _Organization_Name, _Job_Title, _Education_ID, _Experience_ID, IIf(ddlRank_ID.SelectedValue.Equals("0"), Nothing, Convert.ToInt32(ddlRank_ID.SelectedValue)), _Status)

لاحظ اننا ارسلنا قيمة ddlRank_ID كالتالي:

IIf(ddlRank_ID.SelectedValue.Equals("0"), Nothing, Convert.ToInt32(ddlRank_ID.SelectedValue))
#9

للأسف ما زبطت

الموضوع عقدني

PMI_Logo_1.jpg

مدير مشاريع محترف - PMP
محلل أنظمة معتمد
مدير فريق برمجة تطبيقات ويب .Net

======|||||=====

======@ @====
==o0o== ( ) ==o0o===
================
كل منا يحتاج إلى الإرادة حتى يستطيع أن يقوم بعمله

#10

السلام عليكم

اتصور انك بحاجة الى تحويل rankid الى النوع object ثم عمل مايلي

If ddlRank_ID.SelectedValue <> 0 Then

.Rank_ID = ddlRank_ID.SelectedValue

else

.Rank_ID = DBNull.Value

End If

او ان تفحص في مرحل التخزين في قاعدة البيانات ان امكن ذلك

if rankid =0 then

prm("rankid")= DBNull.Value

else

prm("rankid")= rankid

endif

#11

كلامك منطقي بخصوص التحويل إلى object

سأجربها

شكرا لك

PMI_Logo_1.jpg

مدير مشاريع محترف - PMP
محلل أنظمة معتمد
مدير فريق برمجة تطبيقات ويب .Net

======|||||=====

======@ @====
==o0o== ( ) ==o0o===
================
كل منا يحتاج إلى الإرادة حتى يستطيع أن يقوم بعمله

#12

أخي الكريم ... هل قمت بالتأكد أن قاعدة البيانات لديك تقبل Null في الخانات المربوطة على أعمدة بجداول أخرى؟؟؟

ولم لا تستخدم جمل شرطية بحث أنه في حالة عدم اختيار المستخدم يتم إرسال Null

تم تعديل هذه المشاركة بواسطة moh_kin في 25 فبراير 2008 في 10:12

ASP.NET Team Leader

moh_kin_mah@hotmail.com

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

لو أعجبك أي من مشاركاتي ... برجاء قم بتقييم المشاركة عبر الأزرار الموجودة أسفل يسار كل مشاركة

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

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

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

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

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