PDA

View Full Version : مشکل در INSERT با LINQ



f.beigirad
جمعه 20 بهمن 1391, 14:41 عصر
با عرض سلام

برای وارد کردن اطلاعات به دیتابیسم از طریق linq با این ارور مواجه میشم.

این درحالیه که وقتی کل اطلاعات جدولم رو پاک میکنم و میخوام اولین رکورد رو وارد کنم کد به درستی اجرا میشه .
ولی برای بار دوم با این ارور مواجه میشه:

An error occurred while updating the entries. See the inner exception for details.

دریتابیس مورد استفادم sqlite هست.
کلید اصلی هم IDهست.
و اینم کد INSERTم :
private void button1_Click(object sender, EventArgs e)
{
if (txUser.Text != "" && txPass.Text != "" && txPassAgain.Text != "" && txA1.Text != "" && txQ1.Text != "" && txA2.Text != "" && txQ2.Text != "")
{
var db = new AzmoonDB4Entities();

int count = db.tUser.Count(P => P.UserName == txUser.Text.Trim());
if (count <= 0)
{
tUser ts = new tUser();
ts.UserName = txUser.Text.ToString();
ts.PassWord = txPass.Text.GetHashCode().ToString();
ts.Q1 = txQ1.Text.ToString();
ts.A1 = txA1.Text.ToString();
ts.Q2 = txQ2.Text.ToString();
ts.A2 = txA2.Text.ToString();
db.AddTotUser(ts);
db.SaveChanges();//خطا در این خط است
}
else
{
MessageBox.Show("تکراری");
}
}
else
{
MessageBox.Show("Errrrrrrror.");
}

}

f.beigirad
جمعه 20 بهمن 1391, 15:18 عصر
دوستان
من IDکه همون کلید اصلیم هست رو هم به صورت دستی با این کد وارد کردم ، بدون ارور تو دیتابیس ثبت شد.

این کد رو اضافه کردم:
ts.ID = 2;



حالا نمیدونم چجوری بهش بفهمونم که کلید اصلی (primary key) رو خودش وراد کنه؟؟؟

در صورتی که من موقع ساخت تیبل تیک primary key رو زدم(فعال کردم).

همچنین لازم به ذکره رکورد اول رو که بدون اضافه کردن کد بالا وارد دیتابیس میکنه مقدار ID رو برابر با صفر قرار میده.
ولی وقتی با خورد SQLite Manager میخوام اولین رکورد جدولی رو وارد کنم مقدار کلید اصلی جدول رو برابر با 1 قرار میده.(اینجاش با SQL فرق میکنه)

samadblaj
جمعه 20 بهمن 1391, 15:23 عصر
سلام این نوع خطا به خاطر مشکل نوع داده ای هست که قرار هست ثبت بشه
برگریدید به طراحی دیتابیس فیلد ID رو انتخاب کنید و Identity رو yes کنید تا به صورت اتوماتیک بهش ID تعلق بگیره...
همیشه هم قبل از برنامه نویسی ابتدا برای آزمایش داده هایی رو وارد کنید تا در برنامه نویسش به مشکلات ثبت بر نخورید...

f.beigirad
جمعه 20 بهمن 1391, 15:28 عصر
ممنون از راهنماییتون دوست عزیز.

این کد ساخت تیبلمه :

ببینید:

CREATE TABLE "tUser" ("ID" INTEGER PRIMARY KEY NOT NULL , "UserName" TEXT NOT NULL , "PassWord" TEXT NOT NULL , "Q1" TEXT NOT NULL , "A1" TEXT NOT NULL , "Q2" TEXT NOT NULL , "A2" TEXT NOT NULL )

samadblaj
جمعه 20 بهمن 1391, 15:46 عصر
دوستان
من IDکه همون کلید اصلیم هست رو هم به صورت دستی با این کد وارد کردم ، بدون ارور تو دیتابیس ثبت شد.

این کد رو اضافه کردم:
ts.ID = 2;



حالا نمیدونم چجوری بهش بفهمونم که کلید اصلی (primary key) رو خودش وراد کنه؟؟؟

در صورتی که من موقع ساخت تیبل تیک primary key رو زدم(فعال کردم).

همچنین لازم به ذکره رکورد اول رو که بدون اضافه کردن کد بالا وارد دیتابیس میکنه مقدار ID رو برابر با صفر قرار میده.
ولی وقتی با خورد SQLite Manager میخوام اولین رکورد جدولی رو وارد کنم مقدار کلید اصلی جدول رو برابر با 1 قرار میده.(اینجاش با SQL فرق میکنه)

سلام دوباره به این پستتون توجه کنید چون کلید اصلی هست نمیتونه تکراری باشه بار اول 2 رو وارد کردید بدون خطا تایید کرد اما چون به شکلی این داده قبلا وارد شده بار دوم ثبت نمیشه...

ID int primary key IDENTITY(1,1) NOT NULL,

موفق باشید./

f.beigirad
جمعه 20 بهمن 1391, 16:00 عصر
دوست من بازم سلام.

واردکردن کلید اصلی توسط برنامه که اشتبامه!!

وقتی که با ADO.NET کار میکردم هیچ کدی درباره مقدار دهی کلید اصلی نمینوشتم.

حالا با LINQ میخوام همین کارو انجام بدم ولی با اروری که بالا دربارش صحبت کردم مواجه میشم.

///////////////////

حالا من از روی کنجکاوی و برای امتحان اومدم کلید اصلی رو هم با این کد وارد کردم.داده بدون مشکل وارد شد.(ts.ID = 2)
2 میتونه هر شماره ای باشه بغیر از شماره رکورد هایی که وجود دارن.

//////////////////

samadblaj
جمعه 20 بهمن 1391, 16:16 عصر
دوست من بازم سلام.

واردکردن کلید اصلی توسط برنامه که اشتبامه!!

وقتی که با ADO.NET کار میکردم هیچ کدی درباره مقدار دهی کلید اصلی نمینوشتم.

حالا با LINQ میخوام همین کارو انجام بدم ولی با اروری که بالا دربارش صحبت کردم مواجه میشم.

///////////////////

حالا من از روی کنجکاوی و برای امتحان اومدم کلید اصلی رو هم با این کد وارد کردم.داده بدون مشکل وارد شد.(ts.ID = 2)
2 میتونه هر شماره ای باشه بغیر از شماره رکورد هایی که وجود دارن.

//////////////////

دوست عزیز منم گفتم هر مقداری میتونه باشه غیر از مقدار وارد شده... ستونی که کلید اصلی هستش نمیتونه مقدار بگیره یا میتونید بالاترین فیلد رو بدست بیارید یکی بهش اضاف کنید ذخیره کنید...

کلید اصلی هیچ وقت خود به خود مقدار نمیگیره مگر idntity رو yes کنید تو ado هم فکر نکنم اینجور باشه...
عکس پیوستی رو ببینید من SQL Server ندارم کدی هم که فرستادم SQL Express هستش به همین منواله...

شاید دوستان دیگه پیشنهاد بهتری داشته باشند... موفق باشید./

f.beigirad
جمعه 20 بهمن 1391, 16:23 عصر
دوست من ، من بالا تر گفتم که دیتابیس مورد استفادم sqlite هست.

Identity نداره.فقط موقع ساخت تیبل کافیه Primary Key? رو فعال کنیم و نوع فیلد رو integer بذاریم
بقیش تو ado حله ولی تو linq منحله.

با تشکر از شما samadblaj.

دوستان دیگر لطفا راهنمایی کنن.

f.beigirad
جمعه 20 بهمن 1391, 17:32 عصر
با سلام.

از linqچرت تر تو دنیا نیست.

به صورت خودکار نمیتونه یه primary key رو وارد کنه.
من با اینکه ID رو کلید اصلی قرار دادم ولی دوباره تو کدم باید مقدار دهیش کنم .
ببینید:
mydbEntities db = new mydbEntities();
int c = db.tUser.Count();

tUser ts = new tUser();
ts.UserName = "a";
ts.PassWord = "b";
ts.ID = c + 1;
ts.Q1 = "c";
ts.A1 = "d";
ts.Q2 = "e";
ts.A2 = "f";

db.AddTotUser(ts);
db.SaveChanges();

با تشکر از دوستانی که برای راهنماییم تلاش کردن.

Mahmoud.Afrad
جمعه 20 بهمن 1391, 17:46 عصر
مقداردهی خودکار یک فیلد هیچ ربطی به Linq نداره و توسط دیتابیس انجام میشه. حتی در ADO.NET هم فیلد id باید مقداردهی بشه مگر اینکه دیتابیس اون فیلد رو بصورت خودکار مقداردهی کنه.
کلید اصلی بودن یک فیلد هم باعث نمیشه اون فیلد خودکار مقداردهی بشه.

پس توی دیتابیس فیلد id رو از نوع AUTOINC انتخاب کن.

f.beigirad
جمعه 20 بهمن 1391, 17:51 عصر
AUTOINC که غیر فعاله.
موقع ساخت جدول غیرفعاله

f.beigirad
جمعه 20 بهمن 1391, 18:07 عصر
با عرض سلام چند صد باره.

آقای Mahmoud.Afrad من نوع AUTOINC رو هم فعال کردم اما فرقی نکرد و همون ارور قبلی رو داد.
همچنین مثل پیش اولین رکود رو بدون هیچ مشکلی با مقدار ID صفر وارد میکنه.اما رکودها ی بعدی رو ارور میده.

f.beigirad
جمعه 20 بهمن 1391, 18:58 عصر
عزیزان کسی راه حل مشکل مارو نمیدونه؟؟؟؟؟

JaVa
یک شنبه 04 فروردین 1392, 21:21 عصر
عزیزان کسی راه حل مشکل مارو نمیدونه؟؟؟؟؟

سلام.

من دقیقا مشکل شما رو داشتم.

یادم رفته بود Is Identity رو YES کنم .بعد از اینکه این اشتباه در درست کردم. بازم همون خطا رو می گرفت.
دلیلش اینه که شما باید در خود ویژوال استودیو هم باید برید و دیتا بیس رو آپدیت کنید.

به این صورت البته با vb.net که فرقی با سی شارپ نداره:چشمک:

به روایت تصویر.


101839

101840

101841

موفق باشید.