PDA

View Full Version : مشکل : در نوشتن کد شمارش تعداد فیلدهای جدول



ya30ien2
جمعه 26 آبان 1391, 02:47 صبح
سلام من کد زیر رو برای شمارش نوشتم اما ارور میگیره
البته بگم داخل کلاس مینویسم


public string countPayment(string record="")
{

using (SqlConnection con = new SqlConnection(conn))
{
SqlCommand cmd = new SqlCommand("SELECT count(*) FROM Basked", con);
con.Open();
using (SqlDataReader rdr = cmd.ExecuteReader())
{
if (rdr.HasRows)
record = Convert.ToString(cmd.ExecuteScalar());
con.Close();
Count = Convert.ToInt32(record);
}
}

return record;
}

fakhravari
جمعه 26 آبان 1391, 03:33 صبح
/// <summary>
/// موقعی که می خواهیم تعداد رکورد ها رو بگیریم
/// . البته در صورتیکه دستور اجرای شمابیشتر از یک مقدار بر گردونه فقط یک موردش در اختیار شما خواهد بود
/// .اولین ستون از اولین سطر.
/// </summary>
public static string ExecuteScalar(string cmdText)
{
string ret = "0";
using (SqlConnection connection = new SqlConnection(Config.Connection))
{
SqlCommand command = new SqlCommand(cmdText, connection);
command.CommandTimeout = 100000000;
try
{
if (connection.State == ConnectionState.Closed)
{ connection.Open(); }
ret = (string)command.ExecuteScalar();
}
finally { connection.Close(); }
return ret;
}
}

ya30ien2
جمعه 26 آبان 1391, 11:51 صبح
بازم ارور میگیره
ret = (string)command.ExecuteScalar();

fakhravari
جمعه 26 آبان 1391, 12:09 عصر
تست بزن
SELECT CONVERT(NVARCHAR, count(*))FROM Basked

ya30ien2
جمعه 26 آبان 1391, 12:58 عصر
بازم از همون قسمت ارور میگیره
داخل صفحه مسترپیج کد رو بنویسم مشکلی نیستا وقتی داخل کلاس میزارم ارور میگیره

rana-writes
جمعه 26 آبان 1391, 13:32 عصر
سلام
من براي شمارش تعداد كاربرهاي سايتم از يه همچين تابعي استفاده كردم
توي كلاس نوشتمش



public static int ShowCountSiteUser()
{
int count = 0;
SqlConnection connection = ConnectionManager.ConnectToMySiteDB();
SqlCommand command = new SqlCommand("Sp_CountUser", connection);
command.CommandType = CommandType.StoredProcedure;

SqlDataReader reader = command.ExecuteReader(CommandBehavior.SingleResult | CommandBehavior.CloseConnection);

if (reader.Read())
{
if (reader.IsDBNull(0))
count = 0;
else
count = reader.GetInt32(0);
}

return count;
}



از استور پروسيجر استفاده كردم و اينم كد استورم


CREATE PROCEDURE dbo.Sp_CountUser



AS
BEGIN TRANSACTION
SELECT COUNT(UserName) AS countUser
FROM TblLogin

IF @@ERROR<>0
ROLLBACK TRANSACTION

ELSE
COMMIT TRANSACTION
GO



موفق باشين

ya30ien2
جمعه 26 آبان 1391, 13:41 عصر
لطف میکنید نمونه کوچیکی بزارید

fakhravari
جمعه 26 آبان 1391, 13:52 عصر
دارید خراب کار می کنید :اشتباه:
داخل صفحه مسترپیج کد رو بنویسم مشکلی نیستا وقتی داخل کلاس میزارم ارور میگیره
این چی دیگه:اشتباه:

mehdi.mousavi
جمعه 26 آبان 1391, 14:14 عصر
سلام.
هر چه سعی کردم از کنار این تاپیک به آرومی رد بشم، نشد که نشد! آخه اینا چیه شما ها نوشته اید؟



سلام من کد زیر رو برای شمارش نوشتم اما ارور میگیره
البته بگم داخل کلاس مینویسم


public string countPayment(string record="")
{

using (SqlConnection con = new SqlConnection(conn))
{
SqlCommand cmd = new SqlCommand("SELECT count(*) FROM Basked", con);
con.Open();
using (SqlDataReader rdr = cmd.ExecuteReader())
{
if (rdr.HasRows)
record = Convert.ToString(cmd.ExecuteScalar());
con.Close();
Count = Convert.ToInt32(record);
}
}

return record;
}


پسر خوب اینا چیه نوشتی؟ ExecuteReader بعدش دوباره ExecureScalar ؟؟؟ پیش خودت نمی گی "من که تعداد رکوردها رو میخوام، باید یه دستور SQL اجرا کنم و تعداد رو بگیریم. پس چرا دو بار دارم Command ام رو اجرا می کنم؟؟؟" تبدیل String و پاس کردن Record و ... جای خودش...



/// <summary>
/// موقعی که می خواهیم تعداد رکورد ها رو بگیریم
/// . البته در صورتیکه دستور اجرای شمابیشتر از یک مقدار بر گردونه فقط یک موردش در اختیار شما خواهد بود
/// .اولین ستون از اولین سطر.
/// </summary>
public static string ExecuteScalar(string cmdText)
{
string ret = "0";
using (SqlConnection connection = new SqlConnection(Config.Connection))
{
SqlCommand command = new SqlCommand(cmdText, connection);
command.CommandTimeout = 100000000;
try
{
if (connection.State == ConnectionState.Closed)
{ connection.Open(); }
ret = (string)command.ExecuteScalar();
}
finally { connection.Close(); }
return ret;
}
}


تست بزن
SELECT CONVERT(NVARCHAR, count(*))FROM Basked

آخه دوست عزیز، شما که دارید Connection رو تازه new می کنید و هنوز Open اش نکرده اید، برای چی دارید State رو بررسی می کنید ببینید که Connection بازه یا بسته؟؟؟ اون به کنار، CommandTimeout رو برای چی به اون عدد عجیب تغییر داده اید؟ که Command Timeout نشه؟ (کافیه اونو 0 بذارید تا اجرای دستور با Timeout مواجه نشه. از این گذشته، یه همچین Query ی ساده ای اگه طی چند لحظه Result اش برنگرده، یعنی اوضاع به مراتب بدتر از این هستش که با Set کردن Timeout و ... بشه اونو رفع و رجوع کرد). همه اینا به کنار، اون try/catch دیگه برای چیه؟ خیلی خوب می شد این کد رو با همون using نوشت و ... همه اینا به کنار، چرا مقدار بازگشتی ExecuteScalar رو به string کست می کنید؟ آخه شما مگه تعداد رکورد های موجود در جدول رو نمی خواهید؟ پس چرا اونو به صورت رشته بر میگردونید؟؟؟


سلام
من براي شمارش تعداد كاربرهاي سايتم از يه همچين تابعي استفاده كردم
توي كلاس نوشتمش



public static int ShowCountSiteUser()
{
int count = 0;
SqlConnection connection = ConnectionManager.ConnectToMySiteDB();
SqlCommand command = new SqlCommand("Sp_CountUser", connection);
command.CommandType = CommandType.StoredProcedure;

SqlDataReader reader = command.ExecuteReader(CommandBehavior.SingleResult | CommandBehavior.CloseConnection);

if (reader.Read())
{
if (reader.IsDBNull(0))
count = 0;
else
count = reader.GetInt32(0);
}

return count;
}



از استور پروسيجر استفاده كردم و اينم كد استورم


CREATE PROCEDURE dbo.Sp_CountUser



AS
BEGIN TRANSACTION
SELECT COUNT(UserName) AS countUser
FROM TblLogin

IF @@ERROR<>0
ROLLBACK TRANSACTION

ELSE
COMMIT TRANSACTION
GO



موفق باشين

و ا... نمیدونم چی بگم.... ROLLBACK و COMMIT کارشون تو اون SP ی شما چیه؟ جریان اون ERROR چی هستش؟ یعنی SELECT با ERROR مواجه بشه؟ اونوقت گمان می کنید در چنین شرایطی سیستم در وضعیت Stable ای قرار داره؟ از همه بدتر، شما چه کاری خواسته اید انجام بدید که ASP.NET Membership در اختیارتون نذاشته و جدول Login برای خودتون ایجاد کرده اید؟ یا اونجا تو کد بر اساس Order ستون ها کار می کنید، اگر فردا روی مدیر سیستم تو SP ی شما دست برد، اونوقت دردسرهای بعدی یکی یکی خودشون رو نشون میدن.

با کمال احترام به همگی، متاسفانه باید بگم همه این کد ها خیلی بی پروا و بی توجه نوشته شده اند. :( لطفا کمی در مورد کاری که می خواهید انجام بدید تحقیق کنید و کدهایی که اینجا گذاشته اید رو تصحیح کنید...

موفق باشید.

fakhravari
جمعه 26 آبان 1391, 15:38 عصر
با سلام
به شخصه ممنون از کمکتون mehdi.mousavi (http://barnamenevis.org/member.php?41233-mehdi.mousavi)
خوب راستش اینایی که گفتین درسته اما رای هر کدوم محکم کاری بد نیت.
این try/catch قبل که پست بزنم یه تغیراتی دادم سریع گزاشتمش catchنیومد.
متد دیگه یه هو خراب میشه میفته تو catch
مقدار نهایی string باشه فرقی نداره چون اول کار 0 دادم اگر چیزی نبود 0 برگرده. اگر توی catch افتاد مقدار 0 میدیم به rat
حالا این Timeout هم به دل نگرین :لبخند:

rana-writes
شنبه 27 آبان 1391, 00:44 صبح
سلام
ممنون آقاي موسوي
راستش من هميشه مي ترسيدم سراغ membership خود دات نت برم، چون اينكه كنترلها و همه چيز آماده است احساس مي كردم شايد نتونم درست مديريتش كنم.
اين سايت هم اولين كارم بود و سيستم اعضاي ساده اي داشت، براي همين اصلا سراغش نرفتم، امروز در موردش سرچ كردم و به چيزهاي خوبي رسيدم.
در مورد اين مدل sp نويسي من اينو توي يكي از پروژه هاي تقريبا بزرگ مربوط به يه بانك ديده بودم، يعني اونجا توي ديتابيسشون براي سيستم مكانيزه امور اداريشون spهاشونو اينطوري نوشته بودن. طبيعتا با توجه به گسترده بودن كار، فكر مي كردم بايد شيوه استانداردي باشه.

ممنون ازتون كه ساده از كنار اين تاپيك نگذشتين :)

mehdi.mousavi
شنبه 27 آبان 1391, 06:17 صبح
سلام.

@rana-writes:
منم متوجه شدم که کدها رو از یکی از پروِژه هاتون Copy & Paste کرده اید، بخاطر همین هشدار دادم. وجود تکه کد یا تکنیکی در یک پروژه بزرگ، مطلقا به این معنا نیست که اون مورد تایید هستش. در دنیای واقعی، خیلی از افراد بنا به شرایطی که در فیلد باهاش مواجه میشن، ممکنه یکی دو Hack در بخش هایی از کدشون قرار بدن تا اجرای کل پروژه در معرض خطر قرار نگیره. نمیدونم به چه دلیلی، اما در حالت عادی، آوردن اون ROLLBACK و COMMIT در SP کار صحیحی نیست. حالا اینکه این کار در کدوم پروژه و توسط چه کسی پیاده سازی شده، مساله ای است که در رده بعدی اهمیت قرار میگیره. در مورد Membership هم بهتون اطمینان میدم هر کاری که لازم باشه باهاش انجام بدید رو براحتی می تونید باهاش انجام بدید. یک بار وقت بذارید، خوب و دقیق مطالعه اش کنید، بعد باهاش دست و پنجه نرم کنید و ... بعد مدتی دیگه حاضر نیستید وقت ارزشمندتون رو صرف ایجاد جداول و نوشتن کد برای عملیاتی کنید که تقریبا بخشی جدایی ناپذیر هر پروژه ای رو تشکیل میده.

@fakhravari: واقعیتش اگه همه توضیحاتتون رو هم بپذیرم و به قول شما Timeout رو هم به دل نگیرم و از try/catch هم بگذرم، از مقدار بازگشتی تابع نمیشه گذشت. واقعا این کار درست نیست که یه فیلد عددی رو که قراره بعنوان عدد مورد استفاده قرار بگیره، بصورت رشته برگردونید. اینطوری، Caller تابع شما، باید اون رشته رو به عدد تبدیل کنه و هر جا نیاز به فراخوانی این تابع باشه، باید Conversion مزبور انجام بگیره و ... اگر شما هم اینو از تو کدهای Production اتون کپی کرده اید، براحتی می تونید اونو تغییر بدید و مقدار بازگشتی رو به int تبدیل کنید تا ببینید کدتون با یع تغییر ساده، تا چه اندازه بهتر خواهد شد. :)

در هر حال، ممنون...

موفق باشید.