PDA

View Full Version : بدست آوردن تعداد رکوردهایی از جدول که شرط حاصی دارند



sara_aryanfar
سه شنبه 02 اسفند 1390, 18:45 عصر
با سلام فرض کنید ما جدولی داریم برای پیغام ها حال داخل این جدول فیلی داریم با نام visit که پیشفرض آن no هست ووقتی پیغام باز میشه به yes تغییر می کنه حال چگونه می توانیم تعداد رکوردهایی که فیلد visit در اونها no هست رو به دست بیاریم ؟ممنون بابت راهنمایی دوستان

fakhravari
سه شنبه 02 اسفند 1390, 18:49 عصر
:گیج:
select * from t1 where visit=no
برای تعداد count میگیریم count(*)as tedad
بعد به tedad دسترسی داریم
order by id desc
yes , no
از نوع bit بگیر

fakhravari
سه شنبه 02 اسفند 1390, 21:10 عصر
برای مثال
SELECT ISNULL(CONVERT(nvarchar(50), COUNT(1)), '0') AS Comment_Of_count
FROM B_Topics
WHERE (TopicID = 11)
اگرر همه میخواهی شرط میشه TopicID=TopicID
دریافت this.count_Cmnts = Int32.Parse(dt.Rows[0]["Comment_Of_count"].ToString());

sara_aryanfar
چهارشنبه 03 اسفند 1390, 00:09 صبح
راستش متاسفانه نتونستم این کد شما رو پیاده کنم وقتی از fill برای پر کردن دیتا تیبل استفاده می کنم همش ارر میده

hjran abdpor
چهارشنبه 03 اسفند 1390, 00:29 صبح
شما اول یه سلکت بگیرید تا تعداد بدست بیاید بعد براون اساس هر کاری خواستید انجام بدید!! کد خوتون را بزارید تا دوستان کمک کنند .

Javad_Darvish_Amiry
چهارشنبه 03 اسفند 1390, 00:42 صبح
select * from t1 where visit=noنیازی نیست کل رکوردها واکشی بشه و بعد تعداد گرفته بشه. میتونید با استفاده از COUNT از همون اول فقط تعداد رو واکشی کنید:

SELECT COUNT(*)
FROM [YourTableName]
WHERE [Visit] = N'no'



راستش متاسفانه نتونستم این کد شما رو پیاده کنم وقتی از fill برای پر کردن دیتا تیبل استفاده می کنم همش ارر میده



دقیقا چه کاری میخواید انجام بدید؟ اگه منظورتون فقط بدست آوردن تعداد هست، نیازی به کار کردن با دیتاتیبل نیست. با SqlDataReader و متود ExecutNoneQuery و یا ExecutScalar میتونید با کمترین هزینه ای این کارو انجام بدید؛ (مثلا اگه میخواید تعداد پیام های ناخوانده رو مثل نوتیفیکیشن فیسبوک نمایش بدید). ولی اگه تو صفحه پیامها هستید و خودبخود دارید یه دیتاتیبل از پیامها پر میکنید، نیاز به کوئری جداگانه نیست و رو همون دیتاتیبل پیامها میتونید کار کنید. فکر کنم اگه بیشتر در مورد کاری که قصد انجامش رو دارید توضیح بدید، نتیجه بهتری میگیرید.

sara_aryanfar
چهارشنبه 03 اسفند 1390, 01:22 صبح
من می خوام تعداد پیام هایی که خوانده نشده هستند رو شمارش کنم و در هنگام ورود مدیر به پنل مدیریت اعلام بشه این تعداد پیغام نخونده دارد

sara_aryanfar
چهارشنبه 03 اسفند 1390, 01:31 صبح
نیازی نیست کل رکوردها واکشی بشه و بعد تعداد گرفته بشه. میتونید با استفاده از COUNT از همون اول فقط تعداد رو واکشی کنید:

SELECT COUNT(*)
FROM [YourTableName]
WHERE [Visit] = N'no'



دقیقا چه کاری میخواید انجام بدید؟ اگه منظورتون فقط بدست آوردن تعداد هست، نیازی به کار کردن با دیتاتیبل نیست. با SqlDataReader و متود ExecutNoneQuery و یا ExecutScalar میتونید با کمترین هزینه ای این کارو انجام بدید؛ (مثلا اگه میخواید تعداد پیام های ناخوانده رو مثل نوتیفیکیشن فیسبوک نمایش بدید). ولی اگه تو صفحه پیامها هستید و خودبخود دارید یه دیتاتیبل از پیامها پر میکنید، نیاز به کوئری جداگانه نیست و رو همون دیتاتیبل پیامها میتونید کار کنید. فکر کنم اگه بیشتر در مورد کاری که قصد انجامش رو دارید توضیح بدید، نتیجه بهتری میگیرید.

خب در این کوئری مقداری رو که شمردین چطوری بدست میارین یعنی چطوری مثلا به یک لیبل میشه ریخت این مقدار رو؟

Javad_Darvish_Amiry
چهارشنبه 03 اسفند 1390, 02:31 صبح
var result = 0; // نتیجه کوئری در این متغیر ریخته می شود
var connectionString = "Your-Connection-String";
var commandText = "SELECT COUNT(*) FROM [Your-Table-Name] WHERE [Visit] = N'no'";
using(var connection = new SqlConnection(connectionString))
using(var command = new SqlCommand(commandText, connection)) {
connection.Open();
result = (int)command.ExecuteScalar();
}
// result حاوی مقدار مورد نظر است



یا



var result = 0; // نتیجه کوئری در این متغیر ریخته می شود
var connectionString = "Your-Connection-String";
var commandText = "SELECT COUNT(*) FROM [Your-Table-Name] WHERE [Visit] = N'no'";
using(var connection = new SqlConnection(connectionString))
using(var command = new SqlCommand(commandText, connection)) {
connection.Open();
using(var reader = command.ExecuteReader(CommandBehavior.SingleRow)) {
reader.Read();
result = (int)reader[0];
}
}
// result حاوی مقدار مورد نظر است



یا...

sara_aryanfar
چهارشنبه 03 اسفند 1390, 11:29 صبح
با تشکر سوال دیگه ای که برام پیش اومد این هست اگر ما بخواهیم این شمارش رو روی چند جدول مختلف با یک کوئری انجام بدیم چی یعنی چندین جدول باشه فیلد مشتری هم ندارند و ما می خواهیم تعداد رکوردهایی با شرط خاص رو بدست بیاریم که این شرط در هر جدول فرق داره

hjran abdpor
چهارشنبه 03 اسفند 1390, 11:37 صبح
سلام.
شرط را براساس فیلد جدول مورد نظرتون بزارید!!!البته میتونید از یک SP واحد استفاده کنید که مقدار پارامتر را به ان ارسال کنید .

alonemm
چهارشنبه 03 اسفند 1390, 12:15 عصر
var result = 0; // نتیجه کوئری در این متغیر ریخته می شود
var connectionString = "Your-Connection-String";
var commandText = "SELECT COUNT(*) FROM [Your-Table-Name] WHERE [Visit] = N'no'";
using(var connection = new SqlConnection(connectionString))
using(var command = new SqlCommand(commandText, connection)) {
connection.Open();
result = (int)command.ExecuteScalar();
}
// result حاوی مقدار مورد نظر است

سلام دوست من :

فقط یک نکته کوچک بهتره از متغییر Var استفاده نکنید و نوع متغییر رو مشخص کنید که عملیات Boxing و Unboxing انجام نشه و کد شما بهینه تر باشه.


یا



var result = 0; // نتیجه کوئری در این متغیر ریخته می شود
var connectionString = "Your-Connection-String";
var commandText = "SELECT COUNT(*) FROM [Your-Table-Name] WHERE [Visit] = N'no'";
using(var connection = new SqlConnection(connectionString))
using(var command = new SqlCommand(commandText, connection)) {
connection.Open();
using(var reader = command.ExecuteReader(CommandBehavior.SingleRow)) {
reader.Read();
result = (int)reader[0];
}
}
// result حاوی مقدار مورد نظر است



یا...

باسلام:

فقط یک نکته کوچک که بهتره از نوع Var استفاده نکنید و نوع متغییر رو که مشخص هست رو معرفی کنید که عملیات Boxing و Unboxing انجام نشه و سرعت و کد شما بهینه تر باشه.

A.S.Roma
چهارشنبه 03 اسفند 1390, 13:25 عصر
باسلام:

فقط یک نکته کوچک که بهتره از نوع Var استفاده نکنید و نوع متغییر رو که مشخص هست رو معرفی کنید که عملیات Boxing و Unboxing انجام نشه و سرعت و کد شما بهینه تر باشه.
موردی که شما عنوان کردید ارتباطی به Boxing و UnBoxing نداره. (کذوم مقدار Value Type داره به Reference Type‌ یا برعکس تبدیل میشه که Boxing و UnBoxing‌داشته باشیم ؟!)

خیلی برنامه نویس ها از var‌برای افزایش خوانایی (readability) استفاده می کنند. (البته من باهاشون موافق نیستم و ترجیح میدم Type رو ذکر کنم .)



It is important to understand that the var keyword does not mean "variant" and does not indicate that the variable is loosely typed, or late-bound. It just means that the compiler determines and assigns the most appropriate type.

alonemm
چهارشنبه 03 اسفند 1390, 14:29 عصر
موردی که شما عنوان کردید ارتباطی به Boxing و UnBoxing نداره. (کذوم مقدار Value Type داره به Reference Type‌ یا برعکس تبدیل میشه که Boxing و UnBoxing‌داشته باشیم ؟!)

خیلی برنامه نویس ها از var‌برای افزایش خوانایی (readability) استفاده می کنند. (البته من باهاشون موافق نیستم و ترجیح میدم Type رو ذکر کنم .)

مقدار Var چگونه مشخص میشه در CLR؟

A.S.Roma
چهارشنبه 03 اسفند 1390, 15:23 عصر
مقدار Var چگونه مشخص میشه در CLR؟
تا اونجا که من میدونم CLR اصلا" var‌رو نمی شناسه !

در واقع Compiler هست که در Compile Time به جای var تایپ صحیح رو جایگزین می کنه و در runtime ،
CLR‌با تایپ واقعی کار می کنه.


the var keyword is a feature of the compiler, not the .NET CLR. The same is true for automatic properties and object initialisers.

واسه امتحان این موضوع می تونید کد IL هر دو حالت را مقایسه کنید.
یا راحتتر،
سعی کنید چنین عبارتی رو بنویسید و compile error‌نگیرید :
var t;

alonemm
چهارشنبه 03 اسفند 1390, 15:28 عصر
دوست عزیز:
طبق گفته های خودتون Compiler داره جای var رو با تایپ صحیح مشخص میکنه پس عملیات تبدیل همانند Boxing انجام میشه.

سعی کنید مطلب و پست رو درست و کامل ملاحظه کنید تا نیازی به پست اضافه نباشه.

A.S.Roma
چهارشنبه 03 اسفند 1390, 15:45 عصر
دوست عزیز:
طبق گفته های خودتون Compiler داره جای var رو با تایپ صحیح مشخص میکنه پس عملیات تبدیل همانند Boxing انجام میشه.

سعی کنید مطلب و پست رو درست و کامل ملاحظه کنید تا نیازی به پست اضافه نباشه.

چی بگم والا !
پیشنهاد میدم یکبار پست قبلی من رو بخونید و به دو عبارت Compiletime‌و runtime دقت بیشتری کنید ! ( این نکته هم در نظر بگیرید که Application پابلیش شده dll‌هست . )

Boxing و UnBoxing‌هم دو Instruction در سطح IL‌هستند که بواسطه ی انتقال اطلاعات بین و Heap‌و Stack در Runtime‌بسیار پر هزینه اند !

alonemm
چهارشنبه 03 اسفند 1390, 15:52 عصر
چی بگم والا !
پیشنهاد میدم یکبار پست قبلی من رو بخونید و به دو عبارت Compiletime‌و runtime دقت بیشتری کنید ! ( این نکته هم در نظر بگیرید که Application پابلیش شده dll‌هست . )

Boxing و UnBoxing‌هم دو Instruction در سطح IL‌هستند که بواسطه ی انتقال اطلاعات بین و Heap‌و Stack در Runtime‌بسیار پر هزینه اند !


دوست خوبم:
کلا من به همین کلمه پر هزینه اشاره دارم که چه در کامپایلر و چه در هرجای دیگه اگه نوع رو مشخص نکنید این هزینه رو باید پرداخت بکنید.
حالا باز شما دلایل خودتو بگو.

Javad_Darvish_Amiry
چهارشنبه 03 اسفند 1390, 18:11 عصر
تا اونجا که من میدونم CLR اصلا" var‌رو نمی شناسه !
در واقع Compiler هست که در Compile Time به جای var تایپ صحیح رو جایگزین می کنه و در runtime ،CLR‌با تایپ واقعی کار می کنه.کاملا درسته؛


طبق گفته های خودتون Compiler داره جای var رو با تایپ صحیح مشخص میکنه پس عملیات تبدیل همانند Boxing انجام میشه.کاملا نادرسته؛


دوست عزیز سلام. تشکر بابت تذکرتون.
بله همونطور که اشاره شد کلمه var ارتباطی با Boxing و UnBoxing‌ نداره. Boxing و UnBoxing‌ یه مقوله مربوط به زمان اجرا هست و البته همینطور هزینه. در زمان کامپایل نه مفهوم Boxing و UnBoxing‌ و نه مفهوم «هزینه» معنا نداره. همونطور که دوستمون فرمودن در زمان کامپایل کلمه var با تایپ مربوطه جایگزین و بعد کامپایل میشه. کد کامپایل شده هم در زمان اجرا ارتباطی با سورس نداره. من شخصا (و همینطور ReSharper و کلی سمپل و سورس منتشر شده) var رو به استفاده از نام کامل تایپ ترجیح میدم. چون کوتاهه و باعث خوانایی و تمیزی بیشتر کد (از نظر من؛ این موضوع سلیقه ایه) میشه. در مورد اینکه فرمودید هزینه زمان کامپایل (که همون جایگزینی نام کامل تایپ با var هست) داره، خوب هزینه زمان کامپایل در قبال اینکه مزایای فوق رو برامون داشته باشه (البته عرض کردم سلیقه ایه؛ اگه فکر کنیم که کد کوتاهتر و خواناتر میشه) بسیار ناچیزه. نهایتش چند میلی ثانیه (یا نه حتی، تو یه پروژه بزرگ که var هزاران بار تکرار شده، چند ثانیه) زمان بیشتری صرف کامپایل بشه؛ خیلی از تکنیک هایی که استفاده میکنیم میتونن نباشن و به سرعت بالاتری چه در زمان کامپایل و چه اجرا برسیم. اما اصول توسعه و شیئ گرایی استفاده از اون روش ها رو توصیه میکنه. چون بالا رفتن هزینه های کامپایل و اجرا، در قبال پایین اومدن هزینه های توسعه، بسیار مقرون به صرفه است.
برای نمونه استفاده از property ها:
نکته اول: استفاده از پراپرتی باعث بالا رفتن هزینه زمان اجرا (یعنی یه هزینه واقعی؛ نه هزینه زمان کامپایل، اگه اونو هم هزینه بدونیم) میشه؛ چون به جای دسترسی مستقیم به فیلدهای اطلاعاتی باید به اونها از طریق متودهای get و set دسترسی پیدا کنیم. مسلما دسترسی مستقیم به فیلد، سرعت بسیار بالاتری نسبت به دسترسی از طریق متودها داره.
اما نکته دوم در مورد پراپرتی های اتوماتیک هست که زمان کامپایل باید تبدیل به پراپرتی های کامل (full property همون پراپرتی سنتی خودمون) بشه. (در زمان اجرا فرقی با پراپرتی معمولی نداره؛ این بخش مربوط به زمان کامپایل هست). خوب هزینه ی این تبدیل، خیلی سنگین تر از تبدیل var به اسم تایپ هست:

public string FirstName { get; set; }

که در زمان کامپایل تبدیل میشه به چیزی شبیه این:

private string <>_323439503889594834820;

public string FirstName{
get{
return <>_323439503889594834820;
}
set{
<>_323439503889594834820 = value;
}
}

که البته موضوع بعدی که در مورد هر دو نوع پراپرتی ها مشترکه، اینه که در نهایت بلاک های get و set قبل از اینکه کامپایل و به کد اجرایی تبدیل بشن،
یه بار دیگه بازنویسی شده و به متود های واقعی باید تبدیل بشن:

public string get_FirstName(){
return <>_323439503889594834820;
// یا اگه یه پراپرتی معمولی مثلا با فیلد
// _firstName
// نوشته بودیم میشه این:
// return _firstName;
}
public void set_FirstName(string value){
<>_323439503889594834820 = value;
// یا طبق توضیح متود بالا:
// _firstName = value;
}

میبینیم که هزینه کار کردن با پراپرتی ها (چه هزینه واقعی زمان اجرا؛ و چه حتی هزینه تفسیر و اعمال پیش-کامپایل) بسیار بیشتر از هزینه ناچیز زمان کامپایل تبدیل var هست؛ اما از اونا استفاده میکنیم چون مزایایی که دارن بسیار بیشتر از هزینه ای هست که براشون پرداخت میشه.

موفق باشید.

alonemm
پنج شنبه 04 اسفند 1390, 13:17 عصر
باسلام :

دوست عزیز فقط در یک کلمه بگم که در برنامه نویسی سمت وب همین نکته های کوچک هم میتونه روی سرعت و بارگزاری درکل خیلی تاثیر داشته باشه من روی چندتا پروژه با رعایت همچین مواردی نتیجه گرفتم.

موفق باشید.

Javad_Darvish_Amiry
پنج شنبه 04 اسفند 1390, 16:36 عصر
سلام. ممنون که توجه نشون دادی و نکات رو مطرح میکنی.
نه فرقی بین وب و دسکتاپ نیست. به هر حال ما یه run-time داریم که تفاوتی نمیکنه کجا اجرا بشه. این run-time کلمه کلیدی var رو نمیشناسه، درست همونطور که foreach رو نمیشناسه (امکانش هست که تا به حال از foreach هم استفاده نکرده باشی، به این دلیل که run-time اونو نمیشناسه و قبل از کامپایل کد به کد قابل اجرا باید تبدیل به حلقه while بشه؟؟؟)؛ و قبل از این که کدی تحویلش بشه برای اجرا (یعنی همون زمان کامپایل) باید اینگونه تبدیلات انجام بشه. پس کدی که به run-time ارسال میشه (یعنی همون کد کامپایل شده - که تو یه پروژه وب، شامل یه سری dll. و config. و ... هست) اساسا فاقد کلماتی مثل var و foreach و یا پراپرتی و ... هست. بنابراین این موضوع که رعایت همچین نکاتی میتونه کارایی رو بالا ببره کاملا از نظر فنی اشتباه و بی ارتباط هست، مگر این که بخوایم قبول کنیم یه پروژه (که مد نظر شما تحت وب هست) بخواد از روی سورس اجرا بشه، که این هم حداقل تا جایی که من میدونم در مورد سی شارپ امکان پذیر نیست (موضوع پروژه Roslyn بیرون از بحث ماست)؛ و یا اینکه بخوایم بپذیریم، هر پروژه ای تو هربار run شدن یه بار کامپایل میشه! که اینم نیست؛ هر چند اگه باشه خیلی باید ریزتر بشیم؛ چون وقتی پروژه اجرا شد، یعنی یه بار کامپایلشو شده، پس var ها تبدیل شدن و دیگه موضوع کارایی مطرح نیست؛ پس اگه بخوایم کارایی رو در نظر بگیریم که بیاد پایین، لاجرم باید قبول کنیم که نه تنها تو هر بار اجرا شدن، بلکه تو اجرای هر statement پروژه بخواد یه بار کامپایل بشه که اینطوری میشه قبول کرد که بله هر چقدر زمان کامپایل کوتاهتر باشه پروژه کارایی بالاتری داره؛ میتونم اینطوری مثال بزنم: هربار که یه صفحه ای رو از یه سایتی درخواست میکنیم، کل سایت یه بار کامپایل میشه! که طبیعتا اشتباه ست. یا خودمون سایت رو موقع آپلود کامپایل و بعد آپ کردیم؛ یا با اولین درخواستی که به سایت رسید، این اتفاق میفته؛ در هر صورت سورس ما نیاز به تفسیر یا کامپایل تو هر درخواست نداره؛ کد کامپایل شده است که اجرا میشه؛ و باقی قضایا...
بهرحال بازم ممنونم بابت بحث و نکات؛ پاینده باشی.


پاورقی:
چون به foreach اشاره کردم، شاید برای بعضی دوستان سوال پیش بیاد که foreach رو نمیشناسه یعنی چی؟ خوب درست مثل var که باید تبدیل بشه، حلقه foreach هم تبدیل میشه:


// A foreach statement of the form
foreach (V v in x)
embedded-statement


// is then expanded to:
{
E e = ((C)(x)).GetEnumerator();
try {
V v;
while (e.MoveNext()) {
v = (V)(T)e.Current;
embedded-statement
}
}
finally {
… // Dispose e
IDisposable disposable = e as System.IDisposable;
if (disposable != null) disposable.Dispose();
}
}


البته در مورد آرایه ها و رشته ها (string) (به عنوان آرایه ای از کاراکتر ها []char) این تبدیل متفاوت هست (foreach تبدیل به یه حلقه for معمولی میشه که با index معمولی کار میکنه). بله، کامپایلر سی شارپ یه دروغگوی تمام عیار و حرفه ایه! :دی