PDA

View Full Version : خطای Can't perform Create, Update, or Delete operations on Table because it has no primary key



amirmalakie
دوشنبه 15 مهر 1392, 12:48 عصر
سلام
دوستان مشکل این کد کجاست که موقع اجرا اخطار می ده

Can't perform Create, Update, or Delete operations on 'Table(Table1)' because it has no primary key.


private void button1_Click(object sender, EventArgs e)
{
var db = new DataClasses1DataContext();
var q = db.Table1s;
dataGridView1.DataSource = q;
}

private void button2_Click(object sender, EventArgs e)
{
DataClasses1DataContext db = new DataClasses1DataContext();
db.Table1s.InsertOnSubmit(new Table1 { name = textBox1.Text });
db.SubmitChanges();

pedram.11
دوشنبه 15 مهر 1392, 13:02 عصر
سلام خودش میگه که دیتابیس فیلد دارای Primary Key نداره

amirmalakie
دوشنبه 15 مهر 1392, 13:25 عصر
درست کردم ولی بازم ارور می ده

Violation of PRIMARY KEY constraint 'PK_Table2'. Cannot insert duplicate key in object 'dbo.Table2'.
The statement has been terminated.

pedram.11
دوشنبه 15 مهر 1392, 13:52 عصر
میگه کلید تکراری نمیتونه قرار بده! ببینید وقتی شما یک فیلدی رو بعنوان کلید تعیین میکنید اون فیلد نباید مقدار تکراری بگیره، معمولا برای Primary Key یک آیدی عددی انتخاب میکنن و به ازای هر سطر جدید یک شماره میره بالا و مقدار تکراری وجود نداره، شما احتمالا دارید مقداری رو که قبلا ثبت شده دوباره بعنوان کلید اضافه میکنید و این ارور داده میشه

amirmalakie
دوشنبه 15 مهر 1392, 14:30 عصر
اون مشکلم حل نشد یکی دیگه ساختم بازم همینجوریه


مشکل این کجاست

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
var db = new DataClasses1DataContext();
var simple_query = db.tbl_users;
dataGridView1.DataSource = simple_query;
}

private void button2_Click(object sender, EventArgs e)
{
string _firstname = firstname.Text ,
string _lastname = lastname.Text ,
string _username = username.Text ,
string _password = password.Text ,
string _telephone = telephone.Text ,
var db = new DataClasses1DataContext();
tbl_user tb=new tbl_user();
{
firstname = _firstname ,
lastname = _lastname ,
username = _username ,
password = _password ,
telephone = _telephone
};

db.tbl_users.InsertOnSubmit(tb);
db.SubmitChanges();
dataGridView1.DataSource =db.tbl_users;


}

private void Form1_Load(object sender, EventArgs e)
{

}
}
}


دقیقا مثل آموزشی که خریدم رفتم جلو ولی ارور می ده و اطلاعات رو ثبت نمی کنه

موندم به خدا

pedram.11
دوشنبه 15 مهر 1392, 14:37 عصر
شما یک فیلد با نام ID از نوع int بسازید و خاصیت AUTOINCREMENT رو true قرار بدید باید مشکل حل بشه.
در مورد کدی که دادید فکر کنم یکجا حرف ; زیاد گذاشتید، اینجا:
tbl_user tb=new tbl_user();
{
firstname = _firstname ,
lastname = _lastname ,
username = _username ,
password = _password ,
telephone = _telephone
};
اگه میخواید او 5 مقدار که عضو tb هست رو مقداردهی کنید نباید بعد از tbl_user tb=new tbl_user() حرف ; بذارید، پس این قسمت از کدتون میشه:
tbl_user tb=new tbl_user()
{
firstname = _firstname ,
lastname = _lastname ,
username = _username ,
password = _password ,
telephone = _telephone
};

شما پروژه رو قرار بدید دوستان هم دانلود و بررسی کنن تا زودتر مشکلتون حل شه

amirmalakie
دوشنبه 15 مهر 1392, 14:44 عصر
درست نشد
فایل پروژه رو گذاشتم دیتابیسم 666 هست که تو پروژه هست

pedram.11
دوشنبه 15 مهر 1392, 16:06 عصر
پروژه رو دانلود کردم، 2 جا مشکل داره، من با کانکت شدن با دیتابیس شما یکمی مشکل دارم و با برنامه نتونستم به دیتابیس متصل شم، واسه همین خودتون این مشکل رو حل کنید. شما قابلیت AUTO INCREMENT برای فیلد id رو true نکردید، وارد صفحه ی ویرایش جدول دیتابیس بشید. و توی تنظیمات مربوط به فیلد آیدی خاصیت های Is Identity و Identity Increment و Identity seed رو به ترتیب yes و 1 و 1 تغییر بدید، طبق تصویر:

111599
کد های مربوط به افزودن مقادیر هم:
string _firstname = firstname.Text;
string _lastname = lastname.Text;
string _username = username.Text;
string _password = password.Text;
string _telephone = telephone.Text;
var db = new DataClasses1DataContext();
tbl_user tb=new tbl_user()
{
firstname = _firstname ,
lastname = _lastname ,
username = _username ,
password = _password ,
telephone = _telephone
};

db.tbl_users.InsertOnSubmit(tb);
db.SubmitChanges();
dataGridView1.DataSource =db.tbl_users;

amirmalakie
دوشنبه 15 مهر 1392, 17:07 عصر
یه دنیا ممنون مشکلم حل شد دوست عزیز
ولی تو قسمت ویرایش از این کد خطا می گیریه

Input string was not in a correct format.




private void button3_Click(object sender, EventArgs e)

{

string _firstname = firstname.Text;

string _lastname = lastname.Text;

string _username = username.Text;

string _password = password.Text;

string _telephone = telephone.Text;

var db = new DataClasses1DataContext();

int selected_index_id = int.Parse(dataGridView1.CurrentRow.Cells["id"].Value.ToString());



var query = db.tbl_users.Where(c => c.id= selected_index_id).Single();

query.firstname = _firstname;

query.lastname = _lastname;

query.username = _username;

query.password = _password;

query.telephone = _telephone;

db.SubmitChanges();

}

pedram.11
دوشنبه 15 مهر 1392, 17:23 عصر
خدا رو شکر، شما خودتون برای فیلدها محدودیت 50 گذاشتید، یعنی در هر فیلد مقدار بیشتر از 50 حرف نمیتونید وارد کنید. اگه به متن بیشتر نیاز دارید مقدار 50 رو در NVarchar(50) بیشتر کنید و یا اگه میخواید به حداکثر اندازه تغییر بدید مقدار MAX قرار بدید. یعنی:
NVarchar(MAX)

okhovat.rad
جمعه 26 تیر 1394, 04:32 صبح
سلام دوست عزیز
از اونجایی که خودم خیلی گیر کردم و تو سایتای فارسی نتونستم که مشکلم رو حل کنم جوابشو از تو سایت های خارجی بدست آوردم و به عموم حضار میرسانم.
نکته اصلی که باید بدونی اینه که ساختار LINQ در زمان Linq To Sql و در زمان اجرای دستورات Delete و Update به صورتی است که باید در جدولی که تعریف کردی
***یکی از ستون ها در جدول حتما حتما باید نوع primary key داشته باشه و درصورتی که نداشته باشی با پیغام >>

linq Can't perform Create, Update, or Delete operations on 'Table(req)' because it has no primary key


در زمان اجرای دستور در سایت خواهی شد.
بدین منظور چند تا روش هست که بهت میگم:
1- ایجاد یک primary key قلابی و بلا استفاده در جدول یعنی یک ستون حالا به هر اسمی مثله Counter تعریف کنی که خودش خود به خود یکی یک به مقدارش اضافه بشه و نوعش هم int در نظر بگیر و خاصیت identity spi... رو فعال کن.
در عکس ببین
133336

و به این صورت دستورات linq به راحتی اجرا میشه البته این روش حرفه ای نیست ولی کار را اندازه.:متفکر: :چشمک:

2- روش دوم نوشتن دستورات sql در داخل عبارت Strinq و اجرای اون توسط linq


2. Create a Insert statement and execute using LINQ.
SampleDataContextDataContext db = new SampleDataContextDataContext();
string insertStatement = "Insert into Employee values('Experts', 'Comment','alpha.beta@gmail.com')";
3- روش سوم که برای من کار نکرد ..............
3. Create a store procedure and call the same from LINQ.
SampleDataContextDataContext db = new SampleDataContextDataContext();
db.InsertEmployeeData("Experts","Comment", "alpha.beta@gmail.com");
Here I have created an store procedure with name InsertEmployeeData, and called it from the code. Simple and straight forward.



اینم لینک راهنمایی این دو روش :
http://www.a2zmenu.com/Blogs/LINQ/Cannot%20perform%20Create,%20Update%20or%20Delete% 20operations%20on%20Table%28Employee%29%20because% 20it%20has%20no%20primary%20key.aspx

االبته من از Visual Stadio 2008 ا و framework 3.5 استفاده میکنم در ورژن های بالاتر قابلیت های بیشتری هم هست.

امیدوارم که کارتون راه بیافته من خودم یه روز الاف شدم گفتم خیرم به شما هم برسه.:قهقهه::قهقهه: :قهقهه: :چشمک:
یه صلواتم بفرستید اگه دوست داشتید برای همه اموات :تشویق: :تشویق: