PDA

View Full Version : سوال: درج در بانک



Milo_22
سه شنبه 24 اسفند 1389, 21:04 عصر
با سلام خدمت دوستان محترم
من داخل بانک اطلاعاتی که دارم یک فیلد به نام userid ایجاد کردم که مقدارش رو به صورت identity گذاشتم تا افزایش پیدا کنه ولی موقعی که دکمه save رو می زنم همچین پیغام خطایی میده :
67529

من داخل stored procedure ام همچین کدی رو نوشتم :

CREATE CREATE PROCEDURE [dbo].[insert_user_pezeshk]
@takhasos nvarchar(20) , @nezam_pezeshki nvarchar (20) , @matab_address nvarchar ( 100 )
, @username nvarchar (20) ,@password nvarchar(30) ,@name nvarchar(50)
,@family nvarchar(50) ,@address nvarchar(100) ,@tel int ,@tel2 int
,@gender nvarchar(3)
AS
BEGIN
insert into tb_pezeshk
values ( @takhasos , @nezam_pezeshki , @matab_address )

insert into tb_validate ( validate )
values ( 1 )

insert into tb_user (username , password , name , family, address , tel, tel2, gender, user_number)
values ( @username ,@password,@name
,@family ,@address ,@tel ,@tel2 ,@gender ,1)
END


یعنی داخل جدول پزشک مقدار userid که به صورت اتوماتکیک داره توسط خود سیستم وارد میشه چرا همچین پیغام خطایی میده ؟

این تصاویر داخل بانک داده من از جدول پزشک و یوزر :
67530 67531
ممکنه لطفا راهنماییم کنید ؟

mo.jalilian
چهارشنبه 25 اسفند 1389, 00:25 صبح
فکر کنم مشکل توی ترتیب insert کردن اطلاعات دارید، اول اطلاعات تیبلی را ذخیره کنید که کلید خارجی توی تیبل هایی که در اون لحظه در حال تغییر هستن را ندارد و بعد اطلاعات را توی تیبل های دیگر بریزید
مثلا اول تیبل user که دارای اطلاعات پایه هست را ذخیره کنید و بعد تیبل پزشکان

Milo_22
چهارشنبه 25 اسفند 1389, 12:28 عصر
این کار رو کردم ولی بازم پیغام خطا میده و می گه نمی تونه مقدار NULL به user id بده ! نمی دونم چرا ؟
ببینید من تماتم دستورات stored proceduer ام رو جا به جا کردم اینطوری :
CREATE PROCEDURE [dbo].[insert_user_pezeshk]
@takhasos nvarchar(20) , @nezam_pezeshki nvarchar (20) , @matab_address nvarchar ( 100 )
, @username nvarchar (20) ,@password nvarchar(30) ,@name nvarchar(50)
,@family nvarchar(50) ,@address nvarchar(100) ,@tel int ,@tel2 int
,@gender nvarchar(3)
AS
BEGIN
insert into tb_user (username , password , name , family, address , tel, tel2, gender, user_number)
values ( @username ,@password,@name
,@family ,@address ,@tel ,@tel2 ,@gender ,1)


insert into tb_validate ( validate )
values ( 1 )

insert into tb_pezeshk
values ( @takhasos , @nezam_pezeshki , @matab_address )

END

ولی بازم خطا میده :


Can not insert value NULL into column 'userID' table 'matab.dbo.tb_validate'
column dos not allow nulls. INSERT fails.
The INSERT statment conflicted with the FOREGN KEY constraint "FK_tb_pezeshk_tb_user". The conflict occurred in databasees "matab" ,table
"dbo.tb_user", column 'userID' .
The Statement has been terminated.

و حتی من اومدم جای درج مقدار 1 داخل جدول validate رو هم جا به جا کردم ولی فایده ای نداشت :افسرده:

esshahab
چهارشنبه 25 اسفند 1389, 15:59 عصر
سلام
اگر درست فهمیده باشم
userIDدر جدول پزشک کلید خارجی است به جدول کابر (پس userID در جدول پزشک نباید خاصیت افزایش خوکار داشته باشد)
پس اولین کوئری درج باید برای جدول کاربر اجرا بشه
بعد به کمک تابع
SCOPE_IDENTITY()
مقدار فیلدی که اتوماتیک افزایش پیدا کرده را به صورت پارامتر به کوئری درج برای جدول پزشک به کار ببرید

insert into tb_user (username , password , name , family, address , tel, tel2, gender, user_number)
values ( @username ,@password,@name
,@family ,@address ,@tel ,@tel2 ,@gender ,1)


insert into tb_validate ( validate )
values ( 1 )

insert into tb_pezeshk
values ( SCOPE_IDENTITY(), @takhasos , @nezam_pezeshki , @matab_address )

Reza_Yarahmadi
چهارشنبه 25 اسفند 1389, 16:17 عصر
شما یک رابطه (Relation یا همون FK) بین دو جدول matab و tb_User ایجاد کردید که رابطه بر سر ستون UserId هر 2 جدول است. احتمالا این رابطه رو برعکس طراحی کردید. برای اطمینان رابطه دو جدول رو حذف کنید و دوباره برنامه رو تست کنید.

Milo_22
چهارشنبه 25 اسفند 1389, 22:55 عصر
ممنون از راهنمایی ها تون ولی بازم پیغام خطایی میده اینطوری :
67580

من رابطه ها رو قطع کردم کامل دوباره براش رابطه را کشیدم ولی جواب نداد ، حتی یک فیلد دیگه به جدول پزشک اضافه کردم که کلید نباشه و بعد اون فیلد رو به جدول user ارتباط دادم ولی بازم خطا در ثبت اطلاعات داشتم :ناراحت:

این کار رو که کردم اینطوری خطا میده :
67582

Milo_22
پنج شنبه 26 اسفند 1389, 13:54 عصر
پیغام خطای قبلی رفع شد ممنون از دوستان حالا باز این پیغام رو میده :
67605

نمی دونم چه معنی ای داره .
می تونید راهنمایی کنید ؟ ممنون از دوستان

Reza_Yarahmadi
پنج شنبه 26 اسفند 1389, 14:35 عصر
این خطا زمانی ظاهر میشه که بخواید به یک خاصیت یا متد شئی که Null است دسترسی پیدا کنید.
با Break Point کدتون رو تریس کنید ببینید کجا مقداری که میخواید به متغیرها داده نمیشه. و یا اینکه try/catch کدتون رو بردارید تا خطا روی خط مورد نظر ظاهر بشه و ...
در صورتی که خودتون نتونستید درستش کنید کدتون + خطی که این خطا روی اون ظاهر میشه رو بذارید تا بهتر بشه کمکتون کرد.

Milo_22
پنج شنبه 26 اسفند 1389, 19:49 عصر
این کل برنامه با بانک دیگه من نمی دونم چه کارش کنم ... :ناراحت:

پروژه پایانی (http://milo22.persiangig.com/document/Payani_Project.rar)

این با VS 2010 هست بانکش هم با SQL 2008 !!!!!

Milo_22
پنج شنبه 26 اسفند 1389, 23:37 عصر
این خطا زمانی ظاهر میشه که بخواید به یک خاصیت یا متد شئی که Null است دسترسی پیدا کنید.
با Break Point کدتون رو تریس کنید ببینید کجا مقداری که میخواید به متغیرها داده نمیشه. و یا اینکه try/catch کدتون رو بردارید تا خطا روی خط مورد نظر ظاهر بشه و ...
در صورتی که خودتون نتونستید درستش کنید کدتون + خطی که این خطا روی اون ظاهر میشه رو بذارید تا بهتر بشه کمکتون کرد.

برنامه را تریس کردم و دیدم در خطی که داره مقدار پسورد رو چک می کنه میاد متغیر boolres رو گذاشتم برای تعیین صحت اطلاعات false می کنه !
شرطی که گذاشتم اینه :

else if ((password.Trim().Length == 0) || (password.Trim().Length < 6))
{
bolres = false;
}

میاد وارد این شرط میشه و عمل درج رو داخل بانک انجام نمیده :اشتباه: بعدش میاد تابع بعدی رو محاسبه می کنه و چون مقادیر قبلی هنوز داخل جدول ذخیره نشده مقادیر بعدی رو هم ثبت نمی کنه !
چطوری درستش کنم ؟ مگر این شرطی که گذاشتم اشتباهه ؟

Reza_Yarahmadi
جمعه 27 اسفند 1389, 10:29 صبح
من از VS 2008 استفاده میکنم به همین خاطر نتونستم پروژه شما رو باز کنم.
شرط مشکلی نداره فقط مقدار متغیر Password رو باید قبل از رسیدن به این شرط پر کنید ، خطای بالا به این دلیله که مقدار این متغیر Null است. ببینید چرا مقدار نمیگیره. برای اینکه خطا نده میتونید شرط رو بصورت زیر تغییر بدید(این کد فقط باعث میشه خطا نده و نمیدونم روی منطق کد شما چه تاثیری داره)
else if (password == null ||
password.Trim().Length == 0 ||
password.Trim().Length < 6)
{
bolres = false;
}

Milo_22
جمعه 27 اسفند 1389, 10:30 صبح
برنامه را از داخل try و catch بیرون آوردم روی این موارد پیغام خطا می داد که همشون رو به دلیل اشتباه نام گذاری ها رفع کردم ولی این یکی رو نمی دونم چیه :

67647

من داخل stord procedure ام اینطوری نوشتم :


CREATE PROCEDURE [dbo].[insert_pezeshk_user]

@takhasos nvarchar(50), @nezam_pezeshki nvarchar(10),@matab_address nvarchar(100)
AS
BEGIN
insert into tb_pezeshk (takhasos , nezam_pezeshki , matab_address , IDuser)
values ( @takhasos , @nezam_pezeshki , @matab_address , SCOPE_IDENTITY() )
END


نمیدونم چه کارش کنم ! من دارم اینجا مقدار iduser را وارد می کنم ولی بازم خطا میده ! چرا ؟

Milo_22
جمعه 27 اسفند 1389, 14:38 عصر
من این سری اومدم داخل خود SQL دستی مقادیر رو وارد کردم به این فرم :
exec insert_user_pezeshk username ,password ,name ,family ,address ,12364 ,654123
,zan, takhasos, ms,matab_address

و مقادیر رو بدون مشکل وارد جداول کرد :متفکر: چرا از داخل برنامه پیغام خطا می ده ؟

Milo_22
پنج شنبه 11 فروردین 1390, 10:52 صبح
مشکلات قبلی که داشتم با کمک ها و راهننمایی های خوب دوستان رفع شد ولی الآن مشکل جدید دارم اون هم اینه که وقتی میخوام داخل یک جدولی که وابسته است به یک جدول دیگه اطلاعات وارد کنم پیغام خطایی میده .
من برای بیمار 3 تا جدول دارم که یکی مربوط به پرونده است و یکی مربوط به اطلاعات اصلی بیمار هست و یکی دیگه هم هست مربوط به زمان نوبت دهی برای بیمار این ها رو با فیلد documentID به هم ارتباط دادم به این شکل :
68089

حالا من می خوام داخل جدول پرونده به صورت جداگانه یا حتی جدول نوبت دهی به صورت جداگانه مقدار بدم . ممکنه داخل این دو تا جدول از یک documentID چندین تا وجود داشته باشه برای همین من فیلد رو identity تعریف نکردم داخل این دو تا جدول ولی داخل جدول بیمار این فیلد به صورت identity تعریف شده . دستور SCOPE_IDENTITY() را هم برای درج مقدار documentID داخل STP نوشتم ولی خطا میده ! یعنی زمانیکه دارم جدول رو به صورت جداگانه پر می کنم خطا میده ولی اگر دو تا جدول بیمار و نوبت دهی را با هم پر کنم مشکلی نداره و راحت داخل بانک اطلاعات رو درج می کنه . ولی وقتی جدا مقدار دهی می کنم حتی با کمک SCOPE_IDENTITY() و یا حتی به ورت دستی مقدار وارد می کنم خطایی میده به این صورت :
68090
و خوب متوجه میشم که منظورش مقدار فیلد شماره پرونده است . حالا سوالم اینه که آیا راهی هست که من به این مشکل بر نخورم ؟ چطوری میشه مقادیر داخل جداول نوبت دهی و پرونده را پر کنم زمانیکه نیازی به درج داخل جدول بیمار نیست .

ممنون از دوستان