Avatar billede cliffha Nybegynder
30. april 2009 - 09:40 Der er 9 kommentarer og
1 løsning

return autoid efter en insert

Jeg skulle meget gerne have ms sql til at retunere det sidste lavede auto id, efter jeg har insertet et element i databasen.
Har læst lidt til at man skal bruge @@Identity, men at den ikke skulle være så godt at bruge. og kan ikke helt se hvordan den skal bruges, kollonen som idet står i hedder Id.
Avatar billede aaberg Nybegynder
30. april 2009 - 09:58 #1
Det kan i nogle tilfælde være bedre at bruge SCOPE_IDENTITY() i stedet for @@Identity.

Du bruger den på følgende måde:

insert into myTable(col1,col2)
values(@val1, @val2);

select SCOPE_IDENTITY()
Avatar billede Syska Mester
30. april 2009 - 10:04 #2
I en row kan der så vidt jeg husker kun være et AutoIncremental ID ... og rigtigt nok at @@Identity tager det sidste indsatte AutoID.

public intAddEntry(string message)
        {
        int i = 0;
            using (SqlCommand cmd = new SqlCommand(NORMAL_SQL, Conn))
            {
                cmd.Parameters.Add("@SID", System.Data.SqlDbType.SmallInt).Value = (SID == null) ? (object)DBNull.Value : SID;
                cmd.Parameters.Add("@Message", System.Data.SqlDbType.Text).Value = message;
                cmd.Parameters.AddWithValue("@Added", Program.Date);

                Conn.Open();
                using (var ts = new TransactionScope())
                {
                    i = (int)cmd.ExecuteScalar();
                    ts.Complete();
                }
            }
            Conn.Close();
return i;
        }

        private const string NORMAL_SQL = "INSERT INTO ImportLog ( SID, Message, Added ) VALUES (@SID, @Message, @Added ); SELECT CAST(Scope_Identity() AS INT)";

Sådan noget ala det ... hapset fra min egen kode.

// ouT
Avatar billede aaberg Nybegynder
30. april 2009 - 10:05 #3
Læs om SCOPE_IDENTITY() funktionen her:
http://msdn.microsoft.com/en-us/library/ms190315.aspx

Der står også lidt om, hvorfor det i nogle tilfælde kan være bedre at bruge SCOPE_IDENTITY(). I de fleste tilfælde er det ligegyldigt om du bruger SCOPE_IDENTITY() eller @@Identity, men for en god ordens skyld, kan du bare altid bruge SCOPE_IDENTITY()
Avatar billede cliffha Nybegynder
30. april 2009 - 10:36 #4
Hej jeg skulle meget gerne have den til at retunere id'et når jeg tilføjer dette,

string sqlstring = "INSERT INTO [finalDb].[dbo].[Company]([Name],[Address],[Zip],[City],[Person],[Phone],[Email],[Description], [Username], [Website]) Values('";
        sqlstring += companyName + "','";
        sqlstring += companyAddress + "',";
        sqlstring += companyZip + ",'";
        sqlstring += companyCity + "','";
        sqlstring += contactPerson + "',";
        sqlstring += contactPhone + ",'";
        sqlstring += contactEmail + "','";
        sqlstring += companyDescription + "','";
        sqlstring += username + "','";
        sqlstring += website + "')";
        SqlCommand command = new SqlCommand(sqlstring);
        command.CommandType = CommandType.Text;
        command.Connection = connection;
        connection.Open();

        command.ExecuteNonQuery();

        connection.Close();
Avatar billede Syska Mester
30. april 2009 - 10:47 #5
Har du kigget på min kode og prøvet at merge det samme ?

Har du ovevejet at bruge parameters ? ( dette spm vil du altid få, da du i overstående kode giver mulighed for sql injections )
Avatar billede aaberg Nybegynder
30. april 2009 - 11:01 #6
Prøv dette (ikke testet):

string sqlstring = "INSERT INTO [finalDb].[dbo].[Company]([Name],[Address],[Zip],[City],[Person],[Phone],[Email],[Description], [Username], [Website]) Values('";
        sqlstring += companyName + "','";
        sqlstring += companyAddress + "',";
        sqlstring += companyZip + ",'";
        sqlstring += companyCity + "','";
        sqlstring += contactPerson + "',";
        sqlstring += contactPhone + ",'";
        sqlstring += contactEmail + "','";
        sqlstring += companyDescription + "','";
        sqlstring += username + "','";
        sqlstring += website + "')";
        sqlstring += " select scope_identity()";
        SqlCommand command = new SqlCommand(sqlstring);
        command.CommandType = CommandType.Text;
        command.Connection = connection;
        connection.Open();

        int newId = Convet.ToInt32(command.ExecuteScalar());

        connection.Close();
Avatar billede cliffha Nybegynder
30. april 2009 - 11:02 #7
Har kigget på det.. Det jeg mest kom til at tænke på er hvordan du executer, din sqlstring, er det med en ExecuteNonQuery eller bare ExecuteQuery???
Avatar billede aaberg Nybegynder
30. april 2009 - 11:16 #8
En anden ting er, at det er bedre at bruge parametre, end at parse parametre ind sql-querien. Dette gør at du ikke kan få problemer med specielle tegn. Hvis det er en hjemmeside du laver, vil det også forebygge muligheden for sql-injection angreb.

Derudover er det smart at bruge noget try-finally når du kalder Execute, så forbindelsen bliver lukket, hvis querien fejler.

Prøv:

int newId;

SqlCommand command = connection.CreateCommand();
command.CommandType = CommandType.Text;
command.CommandText = "INSERT INTO [finalDb].[dbo].[Company]([Name],[Address],[Zip],[City],[Person],[Phone],[Email],[Description], [Username], [Website]) Values(@companyName, @companyAddress, @companyZip, @companyCity, @contactPerson, @contactPhone, @contactEmail, @companyDescription, @username, @website) select scope_identity()";

command.Parameters.AddWithValue(@companyName, companyName);
command.Parameters.AddWithValue(@companyAddress, companyAddress);
command.Parameters.AddWithValue(@companyZip, companyZip);
command.Parameters.AddWithValue(@companyCity, companyCity);
command.Parameters.AddWithValue(@contactPerson, contactPerson);
command.Parameters.AddWithValue(@contactPhone, contactPhone);
command.Parameters.AddWithValue(@contactEmail, contactEmail);
command.Parameters.AddWithValue(@companyDescription, companyDescription);
command.Parameters.AddWithValue(@username, username);
command.Parameters.AddWithValue(@website, website);

try
{
    connection.Open();
    newId = Convet.ToInt32(command.ExecuteScalar());
}
finally
{
    connection.Close()
}
Avatar billede cliffha Nybegynder
01. maj 2009 - 12:09 #9
Det virker nu..

Tak for hjælpen
Avatar billede aaberg Nybegynder
04. maj 2009 - 08:50 #10
Jeg lægger et 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
Computerworld tilbyder specialiserede kurser i database-management

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