PDA

View Full Version : سوال: گرفتن آخرین ID جدول در database



Masoomeh.H
جمعه 30 مرداد 1394, 17:35 عصر
سلام دوستان
من با روش زیر آخرین سریال نامبر دیتابیس رو می گیرم ولی فقط تا مقدار serial_no=10 رو برمی گردونه و از اون به بعد فقط 10 رو تکرار می کنه. توی چندتا از تاپیک های دیگه هم این سوال پرسیده شده بود ولی هیچ کدوم مشکل منو حل نکرد. اگه ممکنه کمک کنید.


id = "Select MAX(Serial_No) from SerialValue";
SQLiteCommand cmd1 = new SQLiteCommand(id, con);



SQLiteDataReader dr = cmd1.ExecuteReader();
if(dr.Read())
{
label3.Text = dr.GetValue(0).ToString();
cmd1.Cancel();
dr.Close();

}

cmd.Parameters.AddWithValue("@Serial_No", (Convert.ToInt16(label3.Text))+1);

sajadsobh
جمعه 30 مرداد 1394, 18:28 عصر
خب الان این کوئری میدونید چی رو برمیگردونه؟! میاد بزرگترین مقداری که توی ستون Serial_No ذخیره شده رو برمیگردونه. یعنی خروجی این کوئری یه رکورده. شما چی میخواین انجام بدین بگین راهنمایی کنیم!

ahmadreza.s
جمعه 30 مرداد 1394, 18:35 عصر
سلام
خوب چرا از تابع LAST استفاده نمي كنيد؟

ghasem110deh
جمعه 30 مرداد 1394, 18:44 عصر
سلام
این نمونه دم دستی هست :

SELECT TOP 1 [ID] FROM Table_Name ORDER BY [ID] DESC

میگه اولین () آیدی رو پیدا از فهرستی که نزولی مرتب شده !

و این بهتره :


select IDENT_CURRENT (Table_Name)

در روش اول نیازی نیست که فیلد آیدی از نوع خودکار (Identity) باشه ولی در روش دوم و روشی که خودتون زدین حتما باید اتوآیدی باشه وگر نه جواب نمیده (تا جایی که میدونم)
اگه فیلدتون رو Identity ش رو yes کنید درست میشه ...

و واسه دیتابیس اکسس هم که باید از Last (Id) استفاده کنید ...

Masoomeh.H
جمعه 30 مرداد 1394, 20:50 عصر
من از دیتابیس sqlite استفاده می کنم و نمی تونم به صورت اتوماتیک به سریال نامبر هام اضافه کنم. بنابراین می خوام بزرگترین سریال رو بدست بیارم و یکی بهش اضافه کنم و رکورد جدیدم رو بریزم توش همین.

ghasem110deh
جمعه 30 مرداد 1394, 21:56 عصر
من از دیتابیس sqlite استفاده می کنم و نمی تونم به صورت اتوماتیک به سریال نامبر هام اضافه کنم. بنابراین می خوام بزرگترین سریال رو بدست بیارم و یکی بهش اضافه کنم و رکورد جدیدم رو بریزم توش همین.

حقیر تا حالا با اسکیولایت بصورت جدی کار نکردم ولی تا جایی که میدونم توی اسکیولایت با دستور
autoincrement

هم میشه اتو آیدی ایجاد کرد ...

Masoomeh.H
جمعه 30 مرداد 1394, 22:40 عصر
حقیر تا حالا با اسکیولایت بصورت جدی کار نکردم ولی تا جایی که میدونم توی اسکیولایت با دستور
autoincrement

هم میشه اتو آیدی ایجاد کرد ...



من از دستور زیر هم استفاده کردم
SELECT TOP 1 [ID] FROM Table_Name ORDER BY [ID] DESC
واسه 1 ارور می ده.

ghasem110deh
جمعه 30 مرداد 1394, 23:14 عصر
یعنی چی ؟
وقتی فقط یک رکورد دارین (که شمارش هم 1 هست) خطا میده ؟
.
.
.
بنظرم بهتره از همون روش آیدنتیتی استفاده کنید (البته با دستورات sqlite)

iman_me
شنبه 31 مرداد 1394, 00:31 صبح
کلید آخرین سطر ثبت شده رو برمیگردونه
select SCOPE_IDENTITY()

Masoomeh.H
شنبه 31 مرداد 1394, 05:12 صبح
یعنی چی ؟
وقتی فقط یک رکورد دارین (که شمارش هم 1 هست) خطا میده ؟
.
.
.
بنظرم بهتره از همون روش آیدنتیتی استفاده کنید (البته با دستورات sqlite)



ببینید من از دستور زیر استفاده می کنم



"SELECT TOP 1 [Serial_No] FROM SerialValue ORDER BY [Serial_No] DESC"



و این ارور رو می گیرم
near "1": syntax error

Mahmoud Zaad
شنبه 31 مرداد 1394, 09:22 صبح
سلام
مشکل اینه که نوع فیلد مورد نظر شما در دیتابیس CHAR هست و سورت بر اساس حروف انجام میگیره در این حالت تمام مقادیری که با 1 شروع میشن بالاتر از تمام مقادیر که با 2 شروع میشن قرار میگیرن یعنی به صورت 1,10,100,1000,10000,2,20,200,2000,20000 تا میرسه به 9 بنابراین 9 همیشه بیشترین مقدار شما هست(حتی از 899999999999999 هم بالاتره!!!) و بعلاوه 1 میشه 10.
برای حل مشکل یا اینکه از همون اول نوع فیلد رو به Integer تغییر بدید یا از تبدیل زیر استفاده کنید.

SELECT MAX(CAST(Serial_No as integer)) FROM SerialValue

ghasem110deh
شنبه 31 مرداد 1394, 12:26 عصر
البته اسپم نیست ها ...

از نوع int استفاده نکرده بودین :متفکر: ... از اول اگه جزئیات رو کامل میگفتین زودتر مشکلتون حل میشد
شرمنده دیگه ، ما سوادمون در همین حده :)

اوبالیت به بو
شنبه 31 مرداد 1394, 12:33 عصر
بعد از دستور Insert بنویسید:


SELECT SCOPE_IDENTITY()

در سی شارپ هم ExecuteScaler کنید

Mahmoud Zaad
شنبه 31 مرداد 1394, 13:33 عصر
البته اسپم نیست ها ...

از نوع int استفاده نکرده بودین :متفکر: ... از اول اگه جزئیات رو کامل میگفتین زودتر مشکلتون حل میشد
شرمنده دیگه ، ما سوادمون در همین حده :)
ایشون چند روز پیش پروژه شون رو آپلود کرده بودن، من از روی اون جواب دادم وگرنه من هم هنوز به اون درجه ای از عرفان نرسیدم که بدونم نوع فیلدی که ایشون تعریف کرده چی بوده!!!:لبخند: البته حدس زدم که این مشکل رو داره بعد رفتم سراغ دیتابیس شون.

Masoomeh.H
یک شنبه 01 شهریور 1394, 06:12 صبح
از همه دوستان تشکر می کنم.
ghasem110deh (http://barnamenevis.org/member.php?u=330388) منم فکر نمی کردم مشکل از اینجا باشه وگرنه حتما می گفتم. بهر حال ممنون از کمکتون.

Masoomeh.H
یک شنبه 01 شهریور 1394, 06:15 صبح
البته می دونم باید یه تاپیک جدید بزنم ولی دوستان اگه می تونید این سئوال رو هم جواب بدید.
من توی سولوشن برنامه یه فلدر ساختم و دیتابیس sqlite رو اونجا اضافه کردم و از
SQLiteConnection con = new SQLiteConnection("Data Source=data/saba.db;Version=3;");


برای اتصال به دیتابیس استفاده می کنم. (توی تنظیمات دیتابیس از copy always استفاده می کنم. اگه dont copy باشه گریدویو نمی تونه اطلاعات رو بگیره). حالا بعد از چندروز که با برنامه کار کردم و دیتابیس رو پر کردم و همه تغییرات به روز رسانی و حذف و درج رو انجام می داده امروز به روز رسانی روی دیتابیس انجام نمی شه . از لحاظ کد پیغام انجام شدن تغییرات میاد ولی وقتی دیتابیس رو باز می کنم تغییرات انجام نشده لطفا کمک کنید.

Mahmoud Zaad
یک شنبه 01 شهریور 1394, 08:54 صبح
فکر می کنم این همون مشکلیه که قبلاً هم بود. شما تمام دیتابیس هایی که دارید به جز پوشه data که توی پوشه Debug هست رو پاک کنید و صرفاً با این دیتابیس کار کنید. کانکشن استرینگ هم مربوط به همین پوشه Debug/data/saba.db هست.

Masoomeh.H
یک شنبه 01 شهریور 1394, 09:03 صبح
فکر می کنم این همون مشکلیه که قبلاً هم بود. شما تمام دیتابیس هایی که دارید به جز پوشه data که توی پوشه Debug هست رو پاک کنید و صرفاً با این دیتابیس کار کنید. کانکشن استرینگ هم مربوط به همین پوشه Debug/data/saba.db هست.

این اولین کاری بود ک به ذهن خودم رسید و انجام دادم ولی درست نشد. حتی تویapp هم تمام استرینگ های دیگه رو هم پاک کردم ولی اطلاعات به روز نمی شه

mmbguide
جمعه 13 شهریور 1394, 19:46 عصر
سلام

من تو برنامه از یک دیتاست نوع دار استفاده کردم که چندتا dataTable داره و هر datatable یک TableAdapter که هر tableAdapter هم چها دستور که یکی از اونها Insert هستش. چطور میشه Scope_Identity رو به دستورات SQL مربوط به Insert اضافه کرد. من هر کاری کردم نشد. اگه ممکنه راهنمایی کنید. بانک اطلاعاتی من هم Access هستش

ممنون