Försöker mig på en SCOPE_IDENTITY och @@IDENTITY utgår båda från din connection, så även om du har massa samtidiga användare så kan du aldrig få "någon annans" @@IDENTITY. Nä, precis, insåg det. Problemet är ju om det skulle finnas triggers, och det kommer det inte göra. Men det spelar inte så stor roll eftersom problemet, precis som du skriver, är att CE inte klarar flera frågor på en gång. Titta på denna sida http://msdn.microsoft.com/en-us/library/ms174077(SQL.90).aspx Klart det finns snyggare lösningar, frågan är bara vad du vill åstadkomma? Får lite känslan av att denna artikeln skulle kunna hjälpa dej, men jag kan ju ha missat lite vad du vill göra: http://msdn.microsoft.com/sv-se/magazine/cc164120(en-us).aspx <b>>@@IDENTITY är en lösning</b> <b>Men i huvudsak är det bara att jag vill kunna anropa en insert och få tillbaks id-numret, i ett strongly typed dataset med SSCE.</b> <b>>men mitt dataset är inte typat</b> Har själv aldrig använt designern för att göra databas-kopplingar, så jag är inte helt med på vad du menar. Men om vi tar det från början. Jag förklarar hur jag gjort, så kanske du kan förklara vad som skiljer sig mot ditt upplägg och så utgår vi från det sedan. Hmm... Okej, jag kan beskriva ungefär vad jag har gjort; Jag har inte testat, men det borde inte vara någon skillnad mot det jag har gjort. Finns inte händelsen RowUpdated på din DS.Tabell1TableAdapter? Den triggas när datat sparas till DB. Har inte använt VB.NET på väldigt länge, så jag kommer tyvärr inte ihåg rätt syntax. <b>>Finns inte händelsen RowUpdated på din DS.Tabell1TableAdapter?</b> <b>Hrmph... salt i såren... jag har inte sagt att jag vill använda vb... =)</b> <b>>Nä, men dina exempel såg ut som VB-syntax, därför gissade jag det :)</b>SCOPE_IDENTITY i SQL server 2005 CE
INSERT INTO Tabell(A, B, C) VALUES("X", Y", "Z");
SELECT SCOPE_IDENTITY()
i DataSet kopplat mot SQL Server 2005 Compact edition, men det jävlas med mig, säger "invalid token".
Stöds inte scope_identity i CE?
Nu är det ett ganska lågt användarantal, så jag borde kunna köra på @@IDENTITY, men jag skulle ju helst undvika.Sv: SCOPE_IDENTITY i SQL server 2005 CE
Sedan vet jag inte om SQL Server CE har stöd för flera frågor "i samma", du kanske behöver göra en separat "SELECT @@IDENTITY" för att hämta upp det (på samma connection givetvis).
/JohanSv:SCOPE_IDENTITY i SQL server 2005 CE
Vilket i sin tur innebär att jag inte kan använda mig av auto-genererade DataSets, såvida jag inte kan modifiera DataSet-koden?
Min lösning får nog bli en fuling:
1. Ta bort identity-kolumner (vilket innebär "ta bort tabellhelvetet och lägg in en ny med exakt samma kolumner men utan identity på ID").
2. Skriv om det så att man väljer ID före insert, och sen fångar exceptions i en loop tills det går att göra en insert.
Jäääätte-snyggt... :(
Om någon har en bättre lösning är jag idel öra.
EDIT: Jag har heller ingen större lust att köra med GUID:s just nu.Suported functions SQL server 2005 CE
Så ser du varför du intekan göra det.
SCOPE_IDENTITY() verkar inte finnas med bland supported functions.
(om det inte finns tillagt i ngn nyare version SP eller motsv)
@@IDENTITY är en lösning
Guid som ID en annan.... ( och då skapade Guid i din applikation och skicka in dessa till databasen så vet du dessutom sedan innan vilket id:t är för din skapade post utan att behöva hämta tillbaka det)Sv: SCOPE_IDENTITY i SQL server 2005 CE
/JohanSv: Suported functions SQL server 2005 CE
Nej. Eftersom jag inte kan göra två anrop i samma query, så måste jag antingen modifiera det sätt som mitt dataset kommunicerar med databasen eller helt och hållet skippa autogenererade strongly typed datasets.
<b>>Guid som ID en annan.... ( och då skapade Guid i din applikation och skicka in dessa till databasen så vet du dessutom sedan innan vilket id:t är för din skapade post utan att behöva hämta tillbaka det)</b>
Ja, men det är bara slightly snyggare kodmässigt än en Max(ID)-loop, och rätt tråkigt att arbeta med om man vill kolla på id-numret i efterhand. Men det är ett rätt vekt argument så jag har ännu inte bestämt mig.
Johan:
Ja, det är väl grovt uttryckt det. Men i huvudsak är det bara att jag vill kunna anropa en insert och få tillbaks id-numret, i ett strongly typed dataset med SSCE.
Tabell1 (ID, A, B)
Tabell2 (ID, T2ID, C)
Och jag vill sätta in:
("X", "Y") i tabell1
och
("Z1")
("Z2")
("Z3")
I tabell 2, där T2ID blir id-numret för ("X", "Y").Sv:Suported functions SQL server 2005 CE
Ja, det visas i den artikeln... Klipper in lite kod hur jag har gjort det, men mitt dataset är inte typat samt att det är MySql istället.
//_da är min dataadapter
_da.RowUpdated += new MySqlRowUpdatedEventHandler(_da_RowUpdated);
//_columnToUpdate är en sträng med "ID"-kolumnnamnet
void _da_RowUpdated(object sender, MySqlRowUpdatedEventArgs e)
{
if ((e.Status == UpdateStatus.Continue) && (e.StatementType == StatementType.Insert))
{
MySqlCommand oCmd = new MySqlCommand("SELECT @@IDENTITY", _con, _trans);
string old = e.Row[_columnToUpdate].ToString();
e.Row[_columnToUpdate] = oCmd.ExecuteScalar();
e.Row.AcceptChanges();
}
}
/JohanSv: Suported functions SQL server 2005 CE
Hur får man en "dataadapter" från en typad TableAdapter?
Eller tänker jag fel nu?
Sen förstår jag nog inte exakt vad du gör i RowUpdated; du tilldelar @@IDENTITY till en id-kolumn i e.row?
Lägger du in den i din datatable, och kör en insert på själva datatable:n?
Jag har alltså ingen databinding, och kör just nu med
XTableAdapter.Insert(...)
Sorry om jag e rörig och osammanhängande, jag känner mig lite lätt efter när det kommer till datasets just nu... ;-)Sv:Suported functions SQL server 2005 CE
- Jag har en tabell i db.
- Fyller en DataTable i ett DataSet med hjälp av en DataAdapter.
- Jag lägger till poster i min DataTable som jag vill spara ner till DB samt få tillbaka ett autogenererat ID från DB.
- Jag hookar eventet RowUpdated på DataAdaptern (som triggas efter varje insert i DB)
- Direkt efter varje Insert kör jag en "SELECT @@IDENTITY" som uppdaterar mitt DataTable med ID som genererades i DB.
Det känns som att du jobbar med egna Inserts, så vad gör du och vad vill du ha ID till?
/JohanSv: Suported functions SQL server 2005 CE
- Ett antal tabeller i DB, Tabell1, Tabell2, kan vi säga.
- Skapar ett strongly typed DataSet ("DS") via designern, som i sin tur då innehåller "DS.Tabell1", "DS.Tabell2", "DS.Tabell1TableAdapter", "DS.Tabell2TableAdapter", och motsvarande DataRows etc.
- Till varje TableAdapter kan jag lägga queries, och jag får några fördefinierade; typ
DS.Tabell1TableAdapter.GetData() = "SELECT a, b, c FROM Tabell1"
Och till det också två insert, dels
DS.Tabell1TableAdapter.Insert(a as integer, b as string, c as string)
och dels
DS.Tabell1TableAdapter.Insert(x as DS.Tabell1Row)
Och jag har (enligt en guide från ms) gett mig på att skapa ett BLL som arbetar mot mina TableAdapters, typ Tabell1BLL, som innehåller en Insert-funktion, vilken ska göra businesslogic och sen sätta in en rad i tabellen.
Jag redigerar alltså inte min DataTable utan kommunicerar med min Adapter. Är förslaget då att jag istället borde skriva om min BLL så att den hämtar hem en DataTable och redigerar den?
Känns ju sådär just nu...
Och sen kommer jag inte hinna göra om detta till leveransen imorgon ändå... =)
Det får bli en ändring i efterhand.
Sen har jag andra frågor om SQL CE; någon som vet något vettigt verktyg för redigera Tabeller etc., eller kopiera databaser och bara ta med vissa fält, eller på något sätt få ut CREATE TABLE-koden?
Jag får till exempel inte växla mellan "identity" och "inte identity" i en befintlig, tom tabell, vilket gör olika designval till ett veritabelt helvete.
(Det är en winapp btw, om det skulle ge någon skillnad.)Sv:Suported functions SQL server 2005 CE
/JohanSv: Suported functions SQL server 2005 CE
Njae, skumt. Inte på Adaptern, men däremot finns en RowChanged på min Table. Det känns som att det är när man gör grejer med själva tabellen, hur skulle en table känna till en ändring i databasen?
Det enda event som finns på DS.Tabell1TableAdapter är "Disposed", såvida jag inte missuppfattat detta kapitalt.
<b>>Har inte använt VB.NET på väldigt länge, så jag kommer tyvärr inte ihåg rätt syntax.</b>
Hrmph... salt i såren... jag har inte sagt att jag vill använda vb... =)Sv:Suported functions SQL server 2005 CE
Nä, men dina exempel såg ut som VB-syntax, därför gissade jag det :)
Testade att sätta ihop ett projekt nu och ser att TableAdaptern inte har samma funktionalitet som DataAdaptern. Så jag vet inte hur man gör då, mer än att använda en DataAdapter istället.
/JohanSv: Suported functions SQL server 2005 CE
Alltså - jag använder vb - men det är mot min vilja...
<b>>Testade att sätta ihop ett projekt nu och ser att TableAdaptern inte har samma funktionalitet som DataAdaptern. Så jag vet inte hur man gör då, mer än att använda en DataAdapter istället.</b>
Bra!
Hellre veta att det inte går att ordna en bättre än lösning än att leva i ovisshet. Bara att göra det bästa av situationen istället. Tack för hjälpen!