Avatar billede karl-koder Nybegynder
04. februar 2008 - 17:15 Der er 14 kommentarer og
1 løsning

SCOPE_IDENTITY der driller lidt ?

Hejsa,

Jeg har følgende kode der generere denne fejl :

Object cannot be cast from DBNull to other types.

Og lidt kode :

SqlCommand cmd = new SqlCommand();
cmd.Connection = Conn;
cmd.CommandText = "Insert Into tbl_Users (SortOrder, UserName, UserDescription, Password, Email, InUse, AddDate, EditDate, AddBy, EditBy) Values (@SortOrder, @UserName, @UserDescription, @Password, @Email, @InUse, @AddDate, @EditDate, @AddBy, @EditBy)";
cmd.Parameters.Add("@SortOrder", SqlDbType.NVarChar).Value = item.SortOrder;
cmd.Parameters.Add("@UserName", SqlDbType.NVarChar).Value = item.UserName;
cmd.Parameters.Add("@UserDescription", SqlDbType.NText).Value = item.UserDescription;
cmd.Parameters.Add("@Password", SqlDbType.NVarChar).Value = item.Password;
cmd.Parameters.Add("@Email", SqlDbType.NVarChar).Value = item.Email;
cmd.Parameters.Add("@InUse", SqlDbType.Int).Value = item.InUse;
cmd.Parameters.Add("@AddDate", SqlDbType.DateTime).Value = item.AddDate;
cmd.Parameters.Add("@EditDate", SqlDbType.DateTime).Value = item.EditDate;
cmd.Parameters.Add("@AddBy", SqlDbType.Int).Value = item.AddBy;
cmd.Parameters.Add("@EditBy", SqlDbType.Int).Value = item.EditBy;
cmd.ExecuteNonQuery();

string getLastRecord = "Select Cast(SCOPE_IDENTITY() as int)";
cmd.CommandText = getLastRecord;
int setLastRecord = Convert.ToInt32(cmd.ExecuteScalar());

Fejlen kommer i denne linie :

int setLastRecord = Convert.ToInt32(cmd.ExecuteScalar());

Og jeg har også forsøgt mig med @@IDENTITY, der får jeg samme fejl, så hvis der sidder en derude der kan hjælpe ville det være super ;o)
Avatar billede erikjacobsen Ekspert
04. februar 2008 - 17:57 #1
Har du et identity felt i tabellen?
Avatar billede karl-koder Nybegynder
04. februar 2008 - 19:37 #2
Nej det var den så ikke, men selvom dette nu er gjort så får jeg stadigt den samme fejl ?
Avatar billede erikjacobsen Ekspert
04. februar 2008 - 20:54 #3
Bliver der sat noget ind i tabellen?
Avatar billede karl-koder Nybegynder
04. februar 2008 - 21:09 #4
Jeps der smides en ny record for hvert forsøg
Avatar billede erikjacobsen Ekspert
04. februar 2008 - 21:23 #5
Og der er også sådan et felt, der bliver talt op med een hver gang? Jeg har ikke kørt din kode, men den ser rigtig nok ud.
Avatar billede karl-koder Nybegynder
04. februar 2008 - 21:44 #6
Ja feltet hedder Id af typen int og sat til identity med 1 i increment og 1 i seed så alt skulle være rigtigt
Avatar billede erikjacobsen Ekspert
04. februar 2008 - 22:41 #7
Så er det nok fordi mssql ikke kan li' dig...
Eller fordi der mangler noget kode i den tomme linie i det du viser.
Eller ... hmm, løbet tør for ideer.
Avatar billede arne_v Ekspert
05. februar 2008 - 04:25 #8
Har du genstartet din app efter at have rettet i tabel strukturen ?
Avatar billede karl-koder Nybegynder
05. februar 2008 - 06:17 #9
Ja den har været genstartet mange gange.

Men kan jeg ikke bare lave :

Select Top 1 Id From tabel Order By Id Desc
Avatar billede erikjacobsen Ekspert
05. februar 2008 - 08:40 #10
"Select Top 1" dur ikke, hvis der er flere der sætter ind på samme tid. Mellem din INSERT og din "Select Top 1" kan der komme en INSERT et andet sted fra, og du vil få et forkert id. Den konstruktion må man aldrig bruge. Derfor @@IDENTITY og SCOPE_IDENTITY.

Der sker ikke andet i din kode end ovenstående, som du viser? Ikke noget med at du lukker connection og åbner den igen??
Avatar billede karl-koder Nybegynder
05. februar 2008 - 09:24 #11
Nej connection bliver først lukket efter der er indsat og scope_identity er kørt.
Avatar billede karl-koder Nybegynder
05. februar 2008 - 13:08 #12
Jeg har prøvet at lave det på følgende måde :

cmd.CommandText = "Insert Into Tabel (felt1, felt2) Values (value1, value2); Select Cast(Scope_Identity As Int)";

Og så virker det, kan det skyldes at jeg i ovenstående kalder CommandText 2 gange eller at jeg bruger en samme SqlCommand til begge kald ?
Avatar billede mikalj Nybegynder
05. februar 2008 - 22:09 #13
Bare smid begge sql sætninger i samme forespørgsel, det er den korrekte måde at gøre det på.

string query = @"
    INSERT INTO Tabel (field1, field2)
    VALUES (@value1, @value2);
    SELECT SCOPE_IDENTITY();
";
SqlCommand cmd = new SqlCommand(query, conn);
cmd.Parameters.AddWithValue("@value1", variable1);
cmd.Paremeters.AddWithValue("@value2", variable2);

conn.Open();
int newId = Convert.ToInt32(cmd.ExecuteScalar());
conn.Close();

Det overstående bruger jeg flere gange dagligt, og det har aldrig fejlet.
Avatar billede karl-koder Nybegynder
15. august 2008 - 12:08 #14
Jeg har et par hænge partier jeg lige skal have rydet af vejen, denne er kommet til at fungere, så smid nogle svar så kan i dele point ;o)
Avatar billede mikalj Nybegynder
15. august 2008 - 13:32 #15
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester