Jag försöker göra en insert i en databas för att sedan hämta id som skapats i tabellen och lägga det i en annan tabell tillsammans med mer mer info. Hmmm.. Jag brukar alltid köra update/inserts med egna stored procedures.. och via MS Data Access Application Block... (rekommenderas!) Hmm, jag fick det inte att fungera men det var nog för att det är lite speciella tabeller och min SP inte kunde hantera {} tecken.Hämta data efter DataAdapter.Update
Men när jag kört update och tar select från den tabellen så hittar den inget.
Måste jag göra något särskilt finnan jag försöker hämta ut värdet?
Koden om det hjälper.
<code>
//Fyller aspnet_User tabellen med rätt värden
newDSRow = ds.Tables["aspnet_Users"].NewRow();
newDSRow["ApplicationId"] = applId;
newDSRow["Indice"] = indice;
newDSRow["UserName"] = userName;
newDSRow["LoweredUserName"] = userName.ToLower();
newDSRow["Company"] = company;
newDSRow["OrgNo"] = orgNo;
newDSRow["Firstname"] = firstname;
newDSRow["Lastname"] = lastname;
newDSRow["Address"] = address;
newDSRow["Zip"] = zip;
newDSRow["City"] = city;
newDSRow["Box"] = box;
newDSRow["Phone"] = phone;
newDSRow["Fax"] = fax;
newDSRow["LastActivityDate"] = DTNow;
ds.Tables["aspnet_Users"].Rows.Add(newDSRow);
sda.Update(ds, "aspnet_Users");
ds.Clear();
sda.Dispose();
//Fyller aspnet_membership tabellen med rätt värden
userId = getUserId(userName);
DataRow newDSRowMembership;
SqlDataAdapter sdaMembership = new SqlDataAdapter("SELECT * from aspnet_Membership", conn);
DataSet dsMembeship = new DataSet();
sdaMembership.Fill(dsMembeship, "aspnet_Membership");
newDSRowMembership = dsMembeship.Tables["aspnet_Membeship"].NewRow();
newDSRowMembership["ApplicationId"] = applId;
newDSRowMembership["UserId"] = userId;
newDSRowMembership["Password"] = pwd;
newDSRowMembership["PasswordFormat"] = 1;
newDSRowMembership["PasswordSalt"] = Guid.NewGuid().ToString();
newDSRowMembership["Email"] = eMail;
newDSRowMembership["LowerdEmail"] = eMail.ToLower();
newDSRowMembership["PasswordQuestion"] = "Tom";
newDSRowMembership["PasswordAnswer"] = "Tom";
newDSRowMembership["IsApproved"] = 1;
newDSRowMembership["IsLockedOut"] = 0;
newDSRowMembership["CreateDate"] = DTNow;
newDSRowMembership["LastLoginDate"] = DTNow;
newDSRowMembership["LastPasswordChangedDate"] = DTNow;
newDSRowMembership["LastLockoutDate"] = "1754-01-01";
newDSRowMembership["FailedPasswordAttemptCount"] = 0;
newDSRowMembership["FailedPasswordAttemptWindowStart"] = "1754-01-01";
newDSRowMembership["FailedPasswordAttemptCount"] = 0;
newDSRowMembership["FailedPasswordAnswerAttemptCount"] = 0;
newDSRowMembership["FailedPasswordAnswerAttemptWindowStart"] = "1754-01-01";
dsMembeship.Tables["aspnet_Membership"].Rows.Add(newDSRowMembership);
sdaMembership.Update(dsMembeship, "aspnet_membership");
dsMembeship.Clear();
sdaMembership.Dispose();
private string getUserId(string userName)
{
string userId;
SqlDataAdapter sda = new SqlDataAdapter("SELECT UserId FROM aspnet_Users WHERE UserName = '" + userName + "'", conn);
DataSet ds = new DataSet();
sda.Fill(ds, "aspnet_Users");
userId = ds.Tables["aspnet_Users"].Rows[0]["UserId"].ToString();
ds.Clear();
sda.Dispose();
userId += " Test";
return userId;
}
</code>
Tack på förhand!
/FredrikSv: Hämta data efter DataAdapter.Update
Jag tror det som händer i din kod är att ADO.NET automagiskt skapar insert/update SQL baserat på din SELECT och det blir en svart låda av det hela som är lurig att konfigurera rätt...
Men generellt funkar det så att man lägger till en SqlParameter "@RETURN_VALUE" int som efter insert har det nya id:t och det kan man läsa ut från SqlParam.Value.
Det finns ett antal olika sätt att göra det på:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconRetrievingIdentityOrAutonumberValues.aspSv:Hämta data efter DataAdapter.Update
Däremot gick det bra om jag använde en reader och sedan dataset för att hämta värdena.
Well, en dag ska jag förstå varför det fungerade. :o)