Update statement conflicted with foreign key - c#

Here is my tables,i can update ad,soyad and email but when i try to update telefon it conflicts with the foreign key [userFk],i already have foreign key update on cascade so,i can't figure out the issue here.Thanks in advance
CREATE TABLE [dbo].[ogrenci] (
[ogrenciNo] INT NOT NULL,
[ad] NVARCHAR (20) NOT NULL,
[soyad] NVARCHAR (20) NOT NULL,
[email] NVARCHAR (50) NOT NULL,
[fakulte_no] INT NOT NULL,
[bolum_ad] NVARCHAR (30) NOT NULL,
[bolum_no] INT DEFAULT ((1)) NOT NULL,
[telefon] NVARCHAR (50) DEFAULT ((1)) NOT NULL,
PRIMARY KEY CLUSTERED ([ogrenciNo] ASC),
UNIQUE NONCLUSTERED ([ogrenciNo] ASC),
UNIQUE NONCLUSTERED ([email] ASC),
CONSTRAINT [bolumFk] FOREIGN KEY ([bolum_no]) REFERENCES [dbo].[bolum] ([bolumNo]) ON DELETE CASCADE,
CONSTRAINT [fakulteFk1] FOREIGN KEY ([fakulte_no]) REFERENCES [dbo].[fakulte] ([fakulteId]) ON DELETE CASCADE,
CONSTRAINT [userFk] FOREIGN KEY ([telefon]) REFERENCES [dbo].[loginusers] ([upassword]) ON DELETE CASCADE ON UPDATE CASCADE
);
and the second one,
CREATE TABLE [dbo].[loginusers] (
[username] NVARCHAR (50) NOT NULL,
[upassword] NVARCHAR (50) NOT NULL,
PRIMARY KEY CLUSTERED ([upassword] ASC)
);
and here is the update button,
private void btnUpdate_Click(object sender, EventArgs e)
{
try
{
if (txtOgrenciNo.Text.Length != 0 && txtAd.Text.Length != 0 && txtSoyad.Text.Length != 0 && txtEmail.Text.Length != 0 && txtTelefon.Text.Length != 0)
{
string query = "UPDATE ogrenci SET ogrenciNo=#ogrenciNoVal,ad=#adVal,soyad=#soyadVal,email=#emailVal,telefon=#telefonVal WHERE ogrenciNo=#ogrenciNoVal";
string query1 = "UPDATE loginusers SET username=#emailVal,upassword=#telefonVal WHERE username=#telefonVal";
using (connection = new SqlConnection(connectionString))
using (SqlCommand command = new SqlCommand(query, connection))
using (SqlCommand cmd = new SqlCommand(query1, connection))
{
connection.Open();
command.Parameters.AddWithValue("#ogrenciNoVal", txtOgrenciNo.Text);
command.Parameters.AddWithValue("#adVal", txtAd.Text);
command.Parameters.AddWithValue("#soyadVal", txtSoyad.Text);
command.Parameters.AddWithValue("#emailVal", txtEmail.Text);
command.Parameters.AddWithValue("#telefonVal", txtTelefon.Text);
cmd.Parameters.AddWithValue("#emailVal", txtEmail.Text);
cmd.Parameters.AddWithValue("#telefonVal", txtTelefon.Text);
command.ExecuteNonQuery();
cmd.ExecuteNonQuery();
gridDoldur();
}
}
else
{
MessageBox.Show("Öğrenci bilgileri boş girilemez.", "Bilgilendirme", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

As upassword column is primarykey in your loginusers table, if you want to update telefon on ogrenci with update cascade property, so you need to remove ,telefon=#telefonVal code from update ogrenci query, like this
string query = "UPDATE ogrenci SET ogrenciNo=#ogrenciNoVal,ad=#adVal,soyad=#soyadVal,email=#emailVal WHERE ogrenciNo=#ogrenciNoVal";
Your second query will update table ogrenci too
WARNING:
It will not good if some student will think like this - "If my password is my telephone, so lets try login as another student with his/her telephone number as password and do something" :)
EDIT:
Your second query where clause is wrong I think,
string query1 = "UPDATE loginusers SET username=#emailVal,upassword=#telefonVal WHERE username=#telefonVal";
It should change to this
string query1 = "UPDATE loginusers SET username=#emailVal,upassword=#telefonVal WHERE upassword=#oldtelefonVal ";

To resolve your problem you need to insert your row in loginusers (not update) after that you need to update your table ogrenci , in the end you can suppress your loginusers row .

Related

JOIN SQL not working as it should be

I have tabel for courses(CID,CName) and another table shows majors for each course CourseMajor(CID,MNom).
I have a drop dawn list which has majors numbers. if the user select a major number from the list another list should be filled of courses that are from the selected major.
I have the code below show me all courses not only the courses for the selected major number !
I used LEFT JOIN, RIGHT JOIN, INNER JOIN, FULL OUTER JOIN....and none of them work.
note: I am using C#, asp.net, vs.net...
using (SqlConnection con = new SqlConnection(conStr))
{
using (SqlCommand cmd = new SqlCommand("SELECT * FROM TBCourse FULL JOIN TbCourseMajor ON TBCourse.CId = TbCourseMajor.CId AND TbCourseMajor.MNom = '" + DLMNom.SelectedValue + "' ", con))
{
con.Open();
cmd.ExecuteNonQuery();
SqlDataReader reader = cmd.ExecuteReader();
if (reader.HasRows)
{
reader.Read();
while (reader.Read())
{
DLCName.Items.Add(new ListItem(reader["CName"].ToString(), reader["CNom"].ToString()));
}
}
else { TxtCRN.Text = "Not worked"; }
}
}
This is some details about tables:
CREATE TABLE [dbo].[TBCourse] (
[CId] INT IDENTITY (1, 1) NOT NULL,
[CNom] INT NOT NULL,
[CName] NVARCHAR (50) NOT NULL,
[Chours] NCHAR (10) NOT NULL,
CONSTRAINT [PK_TBCourse] PRIMARY KEY CLUSTERED ([CId] ASC)
);
CREATE TABLE [dbo].[TbCourseMajor] (
[CId] INT NOT NULL,
[MNom] INT NOT NULL,
PRIMARY KEY CLUSTERED ([CId] ASC),
FOREIGN KEY ([CId]) REFERENCES [dbo].[TBCourse] ([CId]),
FOREIGN KEY ([MNom]) REFERENCES [dbo].[TbMajor] ([MNom])
);
The problem was as devlin carnage said in database (in stored data) , the second table has a problem (not store data) it shows null.. I created another table with the same data and it works perfectly.. Thanks all and sorry for not being able to identify the problem from the beginning.

C# Two classes and two tables link

I'm doing a project and I'm stuck at the beginning already
So I got two tables for two classes like this:
CREATE TABLE [dbo].[T_Artikli] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[Naziv] NVARCHAR (100) NOT NULL,
[Sifra] VARCHAR (13) NOT NULL,
[Vp] FLOAT (53) NOT NULL,
[MP] FLOAT (53) NOT NULL,
[Napomena] NVARCHAR (300) NOT NULL,
PRIMARY KEY CLUSTERED ([Id] ASC)
);
and
CREATE TABLE [dbo].[T_Stanje] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[Trenutno] INT NOT NULL,
[Naruceno] INT NOT NULL,
[Datum] DATE NOT NULL,
[Firma] NVARCHAR (40) NOT NULL,
PRIMARY KEY CLUSTERED ([Id] ASC),
CONSTRAINT [FK_T_Stanje_T_Artikli] FOREIGN KEY ([Id]) REFERENCES [dbo].[T_Artikli] ([Id])
);
The 'Artikl' class and its table 'T_Artikli' works like a charm,the problem is with the other one. This chunk of code should store values in a table:
private void btnSacuvaj_Click(object sender, EventArgs e)
{
CStanje sta = new CStanje();
sta.Trenutno = Int32.Parse(txtTrenutno.Text);
sta.Naruceno = Int32.Parse(txtNaruceno.Text);
sta.Firma = txtFirma.Text;
sta.Datum = DateTime.Parse(dtDatum.Text);
Artikl art = new Artikl();
art.ID = Int32.Parse(cbArtikli.SelectedValue.ToString());
sta.Artikl = art;
Console.WriteLine(sta.Trenutno);
Console.WriteLine(sta.Naruceno);
Console.WriteLine(sta.Firma);
Console.WriteLine(sta.Datum);
Console.WriteLine(art.ID);
sta.dodajStanje();
indeksSelektovanog = dgStanje.Rows.Count;
}
It returns this error:
An unhandled exception of type 'System.Data.SqlClient.SqlException' occurred in System.Data.dll
Additional information: The INSERT statement conflicted with the FOREIGN KEY constraint "FK_T_Stanje_T_Artikli". The conflict occurred in database "C:\USERS\MORSUS\DOCUMENTS\VISUAL STUDIO 2015\PROJECTS\SEMINARSKI\EVIDENCIJA\EVIDENCIJA\BIN\DEBUG\EVIDENCIJADB.MDF", table "dbo.T_Artikli", column 'Id'.
On this line:
public void dodajStanje()
{
string insertSql = "INSERT INTO T_Stanje " +
"(Trenutno, Naruceno, Datum, Firma) VALUES " +
"(#Trenutno, #Naruceno, #Datum, #Firma)";
using (SqlConnection connection = new SqlConnection(_connectionString))
{
SqlCommand command = connection.CreateCommand();
command.CommandText = insertSql;
//command.Parameters.Add(new SqlParameter("#Sifra", Sifra));
command.Parameters.Add(new SqlParameter("#Trenutno", Trenutno));
command.Parameters.Add(new SqlParameter("#Naruceno", Naruceno));
command.Parameters.Add(new SqlParameter("#Datum", Datum));
command.Parameters.Add(new SqlParameter("#Firma", Firma));
connection.Open();
command.ExecuteNonQuery(); //error
}
}
I assume I did something wrong in the sql. Can anyone point me out please?
Another question about sql, how come my sql tables are saved for some only some time, eg 3-4 program runs. The data gets wiped after some time don't know when exactly.. And Copy to Output Directory is set to Copy if Newer.
Be free to ask for any more info.
Yes, this constraint is wrong below; you have the primary key of the T_Stanji table as both the primary key and the foreign key to the T_Artikli table, which can't happen. Note both uses of the same column Id.
CONSTRAINT [FK_T_Stanje_T_Artikli] FOREIGN KEY ([Id]) REFERENCES [dbo].[T_Artikli] ([Id])
You need to add an ArtikliID to the T_Stanje table:
[ArtikliID] INT (NULL | NOT NULL)
And then change this constraint to be:
CONSTRAINT [FK_T_Stanje_T_Artikli] FOREIGN KEY ([ArtikliID]) REFERENCES [dbo].[T_Artikli] ([Id])
So that the foreign key of this new column is mapped.

Insert a record in table fails everytime

I have a database connection where i insert data into the table having 2 columns i.e. id,first_name,last_name.
Following is the code:
private void Insert_Click(object sender, EventArgs e)
{
try
{
String query = "INSERT INTO data_table (first_name,last_name) VALUES (#f_name,#l_name)";
using (SqlConnection connection1 = new SqlConnection(
Properties.Settings.Default.DatabaseConnection))
using (SqlCommand insertCommand = new SqlCommand(query, connection1))
{
//a shorter syntax to adding parameters
// insertCommand.Parameters.Add("#id", SqlDbType.Int).Value = 1;
insertCommand.Parameters.Add("#f_name", SqlDbType.NChar).Value = "JAVED";
insertCommand.Parameters.Add("#l_name", SqlDbType.NChar).Value = "GHAMJN";
//make sure you open and close(after executing) the connection
connection1.Open();
insertCommand.ExecuteNonQuery();
connection1.Close();
MessageBox.Show("Record inserted. Please check your table data. :)");
}
}
catch (Exception err)
{
MessageBox.Show(err.Message);
}
}
Following is T-SQL script:
CREATE TABLE [dbo].[data_table] (
[Id] INT NOT NULL IDENTITY,
[first_name] NCHAR (10) NULL,
[last_name] NCHAR (10) NULL,
PRIMARY KEY CLUSTERED ([Id] ASC)
);
The issue is created by id: I have set it auto-increment.
When i click insert button a MessageBox pops saying:
Cannot insert the value NULL into column 'Id',table 'C:\Users.......\Database1.MDF.dbo.data_table;column doesn't allows null.INSERT fails
Add identity seed and increment values to your table...
CREATE TABLE [dbo].[data_table] (
[Id] INT NOT NULL IDENTITY(1,1),
[first_name] NCHAR (10) NULL,
[last_name] NCHAR (10) NULL,
PRIMARY KEY CLUSTERED ([Id] ASC)
);
Your Id field should be modified as shown below
Deleting that table alongwith all the old copies of old table and creating a new table with suggested Identity(1,1) resolved the issue
try this. The behaviour of Identity Columns can be selectively enabled or disabled with this statement.
If your Identity Column is configured correctly, then this is the only logical explanation for it not behaving as expected
SET IDENTITY_INSERT [dbo].[data_table] ON;
However, it is more likely that your assertion of correctness is flawed and you have not configured the Identity Column correctly.

Adding to two tables, can't add foreign key to second table

So I have two tables, Employee and Login:
CREATE TABLE [dbo].[Employee] (
[EmpID] INT IDENTITY (1, 1) NOT NULL,
[ManagerID] INT NULL,
[EmpName] VARCHAR (50) NOT NULL,
[EmpRank] VARCHAR (50) NOT NULL,
[EmpDateOfBirth] DATE NOT NULL,
[EmpAddress] VARCHAR (100) NOT NULL,
[DeptID] INT NOT NULL,
[EmpSalary] INT DEFAULT ((0)) NOT NULL,
[EmpGender] VARCHAR (50) NOT NULL,
PRIMARY KEY CLUSTERED ([EmpID] ASC),
CONSTRAINT [FK_Employee_Department] FOREIGN KEY ([DeptID]) REFERENCES [dbo].[Department] ([DeptID])
and
CREATE TABLE [dbo].[Login] (
[Username] VARCHAR (50) NOT NULL,
[Password] VARCHAR (50) NOT NULL,
[EmpID] INT NOT NULL IDENTITY,
PRIMARY KEY CLUSTERED ([Username] ASC),
CONSTRAINT [FK_Login_Employee] FOREIGN KEY ([EmpID]) REFERENCES [dbo].[Employee] ([EmpID])
So I have a page form to create a new Employee, which adds info to both the Employee and Login tables. With the Employee table this works fine, but with the Login table, I get an exception in Visual Studio as EmpID 'cannot be null', even though like in the Employee table it is also set to Identity. The exception occurs even if it's not set to Identity. So I'm wondering what I can do so that I can add a new Employee while keeping the same EmpID for the new record in both tables.
This is what the C# code to add the new info looks like:
SqlCommand sqlc = new SqlCommand("Insert into Employee(EmpName, EmpRank, EmpDateOfBirth, EmpGender, DeptID, EmpSalary, EmpAddress) values (#EmpName, #EmpRank, #EmpDateOfBirth, #EmpGender, #DeptID, #EmpSalary, #EmpAddress)", connect);
sqlc.Parameters.AddWithValue("#EmpName", TextBoxName.Text);
sqlc.Parameters.AddWithValue("#EmpRank", DropDownListRank.Text);
sqlc.Parameters.AddWithValue("#EmpDateOfBirth", TextBoxDateOfBirth.Text);
sqlc.Parameters.AddWithValue("#EmpGender", DropDownListGender.Text);
sqlc.Parameters.AddWithValue("#DeptID", DropDownListDepartment.Text);
sqlc.Parameters.AddWithValue("#EmpSalary", TextBoxSalary.Text);
sqlc.Parameters.AddWithValue("#EmpAddress", TextBoxAddress.Text);
SqlCommand sqlc2 = new SqlCommand("Insert into Login(Username, Password) values (#Username, #Password)", connect);
sqlc2.Parameters.AddWithValue("#Username", TextBoxUsername.Text);
sqlc2.Parameters.AddWithValue("#Password", TextBoxPassword.Text);
connect.Open();
sqlc.ExecuteNonQuery();
sqlc2.ExecuteNonQuery();
connect.Close();
Any help will be greatly appreciated.
Well, the first thing to do is to remove the IDENTITY in the Login table EmpID.
This will be the same ID of the other Employee table, so you don't want the database to generate a possible different ID for the Login table.
Second, you need to retrieve from the Employee table the last id assigned automatically by the database.
This could be achieved appending the SELECT SCOPE_IDENTITY() at the first query and retrieving the value assigned to the Employee identity column calling ExecuteScalar()
// Notice the semicolon at the end of the first query to separate
// the second command text. The result of this second command is returned
// by ExecuteScalar
SqlCommand sqlc = new SqlCommand(#"Insert into Employee(EmpName, EmpRank, EmpDateOfBirth,
EmpGender, DeptID, EmpSalary, EmpAddress)
values (#EmpName, #EmpRank, #EmpDateOfBirth,
#EmpGender, #DeptID, #EmpSalary, #EmpAddress);
SELECT SCOPE_IDENTITY()", connect);
sqlc.Parameters.AddWithValue("#EmpName", TextBoxName.Text);
sqlc.Parameters.AddWithValue("#EmpRank", DropDownListRank.Text);
sqlc.Parameters.AddWithValue("#EmpDateOfBirth", TextBoxDateOfBirth.Text);
sqlc.Parameters.AddWithValue("#EmpGender", DropDownListGender.Text);
sqlc.Parameters.AddWithValue("#DeptID", DropDownListDepartment.Text);
sqlc.Parameters.AddWithValue("#EmpSalary", TextBoxSalary.Text);
sqlc.Parameters.AddWithValue("#EmpAddress", TextBoxAddress.Text);
connect.Open();
int empid = Convert.ToInt32(sqlc.ExecuteScalar());
// Now pass the empid value to the second table
// Remember to remove the IDENTITY flag from Login.EmpID otherwise
// you will get an error.
SqlCommand sqlc2 = new SqlCommand(#"Insert into Login(EmpID, Username, Password)
values (#empid, #Username, #Password)", connect);
sqlc2.Parameters.AddWithValue("#empid", empid);
sqlc2.Parameters.AddWithValue("#Username", TextBoxUsername.Text);
sqlc2.Parameters.AddWithValue("#Password", TextBoxPassword.Text);
sqlc2.ExecuteNonQuery();
connect.Close();

Using SQLAdapter.Update(Dataset) Throws error "No primary key in select command"

In short, C# throws me "Dynamic SQL generation for the UpdateCommand is not supported against a SelectCommand that does not return any key column information", while the table in question DOES have a Primary key (Identity, since it's MSSQL).
My code is as following:
void loaddata()
{
try
{
DS = new DataSet();
sqladapt = new SqlDataAdapter("SELECT servicetag,name,defect,primkey FROM " + Properties.Settings.Default.DBtableLaptops + "", sqlcon);
sqladapt.FillSchema(DS, SchemaType.Source);
sqladapt.Fill(DS);
commandBuilder = new SqlCommandBuilder(sqladapt);
DT = DS.Tables[0];
Laptops_datagridview.DataSource = DT; //I'm using a datagridview to edit the data.
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
void savedata()
{
//Doesn't work yet.
try
{
sqladapt.Update(DS); // <-- Throws the aforementioned error.
sqladapt.Dispose();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
Data loading etc works fine, Adding new rows works aswell, and it saves it. But whenever i update or delete a row, it throws the error.
Primkey is my primary key, it's an auto-incrementing integer.
I've been googling all day, but to no avail, the usual problem people have is that there is no primary key defined in the first place, but that's not the case here.
Any input would be greatly appreciated, i've been shotgun-debugging for like 6 hours now.
EDIT:
The create statements for the table in question is as following:
CREATE TABLE [dbo].[laptopregistratieDB_laptops](
[Servicetag] [text] NOT NULL,
[Name] [text] NOT NULL,
[Defect] [bit] NOT NULL,
[primkey] [int] IDENTITY(1,1) NOT NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
You need to actually make your primkey column a primary key:
ALTER TABLE [dbo].[laptopregistratieDB_laptops]
ADD CONSTRAINT PK_laptopregistratieDB_laptops PRIMARY KEY (primkey)
You can also specify such a constraint when creating a table:
CREATE TABLE [dbo].[laptopregistratieDB_laptops](
[Servicetag] [text] NOT NULL,
[Name] [text] NOT NULL,
[Defect] [bit] NOT NULL,
[primkey] [int] IDENTITY(1,1) NOT NULL,
constraint PK_laptopregistratieDB_laptops PRIMARY KEY (primkey)
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
or, if you want SQL Server to randomly generate the constraint name (not recommended, but some people do do it):
CREATE TABLE [dbo].[laptopregistratieDB_laptops](
[Servicetag] [text] NOT NULL,
[Name] [text] NOT NULL,
[Defect] [bit] NOT NULL,
[primkey] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
SQL Server will also randomly name the constraint if you apply a primary key constraint using the table designer (Right click next to the column you want to be primary key, choose "Set Primary Key")
All of these options can also be used to specify multi-column primary keys, with the exception of the [primkey] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY variant. (In the designer scenario, you have to highlight multiple rows before right clicking).
Do you actually have a primary key in the table? If yes, check whether the primary key is set or not? Check the property DS.DataTables[0].PrimaryKey
Set the primary key in the DataTable inside the DataSet. You can do something like:
DS.DataTables[0].PrimaryKey = DS.DataTables[0].DataColumns[3];
This will set the primary key for update.
Error in line : " sqladapt = new SqlDataAdapter("SELECT servicetag,name,defect,primkey FROM ..., Because in your select query not include a field that is primary key or unique.
You need to fix your select SQL by adding a primary field in your table. For example:
sqladapt = new SqlDataAdapter("SELECT ID, servicetag,name,defect,primkey FROM "
Hope this help!!!

Categories