PDA

View Full Version : نحوه بدست آوردن id رکود ذخیره شده



bitcob589
چهارشنبه 06 دی 1391, 19:55 عصر
با سلام
با linq یک دستور insert نوشته شده است که اطلاعات را در دیتابیس ذخیره می شود با استفاده از خاصیت Identity Specification در sql به صورت اتوماتیک id رکود تولید می شود چگونه می توان id رکورد ذخیره شده بدست آورد و در یک فیلد ذخیره کرد

tooraj_azizi_1035
پنج شنبه 07 دی 1391, 14:46 عصر
باید با 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

bitcob589
شنبه 23 دی 1391, 19:14 عصر
باید با 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

کد بالا را چگونه می توان با linq پیاده سازی کرد

mmd2009
یک شنبه 24 دی 1391, 01:18 صبح
با سلام

نیازی نیست کار زیادی انجام بدید کافیه از کد زیر استفاده بکنید و آخرین رکورد مورد نظرتون رو انتخاب بکنید :


var lastRecord = MyContext.MyTable.Last();


حتی میتونید Predicate مورد نظرتون رو هم اعمال کنید و یک طورایی Customize کنید انتخاب اخرین رکورد جدولتون رو.

حالا که رکورد مورد نظر رو دارید میتونید به کلیه اطلاعاتش دست پیدا بکنید مثل :


var id = lastRecord.Id;


موفق باشید

bitcob589
یک شنبه 24 دی 1391, 10:02 صبح
کد به صورت نوشته شد


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();

علت خطا چیست

mmd2009
یک شنبه 24 دی 1391, 11:04 صبح
خب اونطور که مشخصه شما دارید از 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);


موفق باشید

Mahmoud.Afrad
یک شنبه 24 دی 1391, 16:55 عصر
یک راه دیگه اینه که ، بلافاصله بعد از درج در دیتابیس میتونید مقدار 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
}