با سلام
با linq یک دستور insert نوشته شده است که اطلاعات را در دیتابیس ذخیره می شود با استفاده از خاصیت Identity Specification در sql به صورت اتوماتیک id رکود تولید می شود چگونه می توان id رکورد ذخیره شده بدست آورد و در یک فیلد ذخیره کرد
با سلام
با linq یک دستور insert نوشته شده است که اطلاعات را در دیتابیس ذخیره می شود با استفاده از خاصیت Identity Specification در sql به صورت اتوماتیک id رکود تولید می شود چگونه می توان id رکورد ذخیره شده بدست آورد و در یک فیلد ذخیره کرد
باید با Output پارامتر کار کنی:
CREATE PROCEDURE dbo.InsertCategory
@CategoryName nvarchar(15),
@Identity int OUT
AS
INSERT INTO Categories (CategoryName) VALUES(@CategoryName)
SET @Identity = SCOPE_IDENTITY()
private static void RetrieveIdentity(string connectionString)
{
using (SqlConnection connection =
new SqlConnection(connectionString))
{
// Create a SqlDataAdapter based on a SELECT query.
SqlDataAdapter adapter =
new SqlDataAdapter(
"SELECT CategoryID, CategoryName FROM dbo.Categories",
connection);
//Create the SqlCommand to execute the stored procedure.
adapter.InsertCommand = new SqlCommand("dbo.InsertCategory",
connection);
adapter.InsertCommand.CommandType = CommandType.StoredProcedure;
// Add the parameter for the CategoryName. Specifying the
// ParameterDirection for an input parameter is not required.
adapter.InsertCommand.Parameters.Add(
new SqlParameter("@CategoryName", SqlDbType.NVarChar, 15,
"CategoryName"));
// Add the SqlParameter to retrieve the new identity value.
// Specify the ParameterDirection as Output.
SqlParameter parameter =
adapter.InsertCommand.Parameters.Add(
"@Identity", SqlDbType.Int, 0, "CategoryID");
parameter.Direction = ParameterDirection.Output;
// Create a DataTable and fill it.
DataTable categories = new DataTable();
adapter.Fill(categories);
// Add a new row.
DataRow newRow = categories.NewRow();
newRow["CategoryName"] = "New Category";
categories.Rows.Add(newRow);
adapter.Update(categories);
Console.WriteLine("List All Rows:");
foreach (DataRow row in categories.Rows)
{
{
Console.WriteLine("{0}: {1}", row[0], row[1]);
}
}
}
}
http://msdn.microsoft.com/en-us/library/ks9f57t0.aspx
با سلام
نیازی نیست کار زیادی انجام بدید کافیه از کد زیر استفاده بکنید و آخرین رکورد مورد نظرتون رو انتخاب بکنید :
var lastRecord = MyContext.MyTable.Last();
حتی میتونید Predicate مورد نظرتون رو هم اعمال کنید و یک طورایی Customize کنید انتخاب اخرین رکورد جدولتون رو.
حالا که رکورد مورد نظر رو دارید میتونید به کلیه اطلاعاتش دست پیدا بکنید مثل :
var id = lastRecord.Id;
موفق باشید
کسی که به خود اطمینان دارد به تعریف دیگران احتیاج ندارد. «گوستاو لوبون»
کد به صورت نوشته شد
DataClassesDataContext d = newDataClassesDataContext();
Table1 tb = newTable1();
var i = d.Table1s.Last();
tb.age = i.id;
tb.name = TextBox1.Text;
d.Table1s.InsertOnSubmit(tb);
d.SubmitChanges();
در هنگام اجرا خطای زیر می دهد
خطا از خط زیر می دهدThe query operator 'Last' is not supported.
var i = d.Table1s.Last();
علت خطا چیست
خب اونطور که مشخصه شما دارید از Linq To Sql استفاده میکنید که این تکنولوژی که دیگه گسترش هم پیدا نمیکنه اگه اشتباه نکنم چند از Extension Method پشتیبانی نمیکنه که یکیشون همین Last هستش اونم به این دلیله که نمیتونید Convert کنه Last رو به یک SQL Statement . برای این کار شما یک راه ساده در پیش داره اونم اینه که خودتون یک متد برای بسازید اونم به شکل زیر :
public static class QueryableHelper
{
public static T LastRecord<T, TU>(this IQueryable<T> source, Expression<Func<T, TU>> keySelector)
{
return source.OrderByDescending(keySelector).First();
}
}
این کدی که براتون نوشتمو میتونید به هر شکلی که خواستید عوضش کنید ولی با این شرایطی که گفتید همین کارتونو راه میندازه. همونور هم که مشخصه ابتدا Descending میکنم keySelector مورد نظرمون رو و بعد از اینکه برعکس شدن رکورد اولی رو برمیگردونیم که رکورد اول همون رکورد اخر ماست.
طریقه استفادشم به این شکله :
var linqToSql = new LinqToSqlDataContext();
linqToSql.Users.InsertOnSubmit(new User
{
Name = "mmd2009"
});
linqToSql.SubmitChanges();
var lastRecord = linqToSql.Users.LastRecord(d => d.ID);
موفق باشید
کسی که به خود اطمینان دارد به تعریف دیگران احتیاج ندارد. «گوستاو لوبون»
یک راه دیگه اینه که ، بلافاصله بعد از درج در دیتابیس میتونید مقدار id را بخونید. یعنی بعد از SubmitChanges :
using (DataClasses1DataContext context = new DataClasses1DataContext())
{
Member m = new Member() { Name = "aaaaa" };
context.Members.InsertOnSubmit(m);
context.SubmitChanges();
MessageBox.Show(m.ID.ToString()); // Read ID Here
}