علیرضا حسن زاده
شنبه 08 خرداد 1389, 16:49 عصر
سلام من از SP زیر برای گرفتن اطلاعات یکی از جدول های دیتابیسم استفاده می کنم:
CREATE PROCEDURE spCarDefGetData
@Year as int
AS
BEGIN
SET NOCOUNT ON;
Declare @count as int
Set @count = (Select Count(id) From CarDef Where [Year]>=@Year)
Select @count,* From CarDef Where [Year]>=@Year
ENDهمون طور که می بینید برای بدست آوردن تعداد سطرهایی که باید برگدونده بشن از یه Select جدا استفاده می کنم علت اینکار هم اینه که می خوام تو C# اطلاعات رو با DataReader بخونم و تو یه لیست قرار بدم (بیشتر هدفم دریافت اطلاعات به صورت ناهمزمان هست تا کاربر برنامه رو هنگ کرده تصور نکنه) تو C# هم از کد زیر برای دریافت اطلاعات استفاده می کنم:
private long Datacount;
public int LoadPercent {get;set;}
public List<CardefInfo> GetData(int currentYear)
{
long count = 0;
if (comm == null)
comm = new SqlCommand();
comm.CommandType = CommandType.StoredProcedure;
comm.CommandText = "dbo.spCarDefGetData";
comm.Connection = GetConnection();
reader = comm.ExecuteReader(CommandBehavior.CloseConnection );
comm.Parameters.AddWithValue("@CurrentYear", currentYear);
KeepOn = true;
if (reader == null) return null;
var retinfo = new List<CardefInfo>();
reader.Read();
long Datacount = Convert.ToInt64(reader[0]);
do
{
retinfo.Add(new CardefInfo
{
Id = Convert.ToInt64(reader["Id"].ToString()),
CarType = reader["Car_type"].ToString(),
Radif = reader["Radif"].ToString(),
Name = reader["Name"].ToString(),
Keshvar = Convert.ToBoolean(reader["Keshvar"]),
Price = Convert.ToInt64(reader["Price"]),
Year = Convert.ToInt16(reader["Year"])
});
count++;
LoadPercent = (long) (((double) count/Datacount)*100);
} while (reader.Read() && KeepOn);
KeepOn = false;
return retinfo;
}همونطور که می بیند تعداد کل سطرها که تو یه ستون توسط SP برگردونده میشه توسط Reader تو متغییر قرار داده میشه و حلقه شروع به دریافت اطلاعات می کنه و هربار درصد اطلاعات لود شده رو تو متغییر LoadPercent قرار میده این تابع رو تو یه Thread اجرا می کنم و روند پیشرفت کار رو به کاربر نشون میدم کلا مشکلی نداره (از نظر خودم تو C# مشکلی نداره مشکل با SQL) ولی نمیدونم چیکار کنم تا با یه Select اینکار رو انجام بدم (البته میشد count رو تو همون Select دوم قرار داد ولی فکر کردم شاید برای هر سطر داده تو SQL یه بار باید Count اجرا بشه که خوب نیست)
دوستان لطفا نظرات و پیشنهادهای خودتون رو بفرمایید تا بتونم عملیات رو بهینه تر و با سربار کمتری انجام بدم
متشکرم
CREATE PROCEDURE spCarDefGetData
@Year as int
AS
BEGIN
SET NOCOUNT ON;
Declare @count as int
Set @count = (Select Count(id) From CarDef Where [Year]>=@Year)
Select @count,* From CarDef Where [Year]>=@Year
ENDهمون طور که می بینید برای بدست آوردن تعداد سطرهایی که باید برگدونده بشن از یه Select جدا استفاده می کنم علت اینکار هم اینه که می خوام تو C# اطلاعات رو با DataReader بخونم و تو یه لیست قرار بدم (بیشتر هدفم دریافت اطلاعات به صورت ناهمزمان هست تا کاربر برنامه رو هنگ کرده تصور نکنه) تو C# هم از کد زیر برای دریافت اطلاعات استفاده می کنم:
private long Datacount;
public int LoadPercent {get;set;}
public List<CardefInfo> GetData(int currentYear)
{
long count = 0;
if (comm == null)
comm = new SqlCommand();
comm.CommandType = CommandType.StoredProcedure;
comm.CommandText = "dbo.spCarDefGetData";
comm.Connection = GetConnection();
reader = comm.ExecuteReader(CommandBehavior.CloseConnection );
comm.Parameters.AddWithValue("@CurrentYear", currentYear);
KeepOn = true;
if (reader == null) return null;
var retinfo = new List<CardefInfo>();
reader.Read();
long Datacount = Convert.ToInt64(reader[0]);
do
{
retinfo.Add(new CardefInfo
{
Id = Convert.ToInt64(reader["Id"].ToString()),
CarType = reader["Car_type"].ToString(),
Radif = reader["Radif"].ToString(),
Name = reader["Name"].ToString(),
Keshvar = Convert.ToBoolean(reader["Keshvar"]),
Price = Convert.ToInt64(reader["Price"]),
Year = Convert.ToInt16(reader["Year"])
});
count++;
LoadPercent = (long) (((double) count/Datacount)*100);
} while (reader.Read() && KeepOn);
KeepOn = false;
return retinfo;
}همونطور که می بیند تعداد کل سطرها که تو یه ستون توسط SP برگردونده میشه توسط Reader تو متغییر قرار داده میشه و حلقه شروع به دریافت اطلاعات می کنه و هربار درصد اطلاعات لود شده رو تو متغییر LoadPercent قرار میده این تابع رو تو یه Thread اجرا می کنم و روند پیشرفت کار رو به کاربر نشون میدم کلا مشکلی نداره (از نظر خودم تو C# مشکلی نداره مشکل با SQL) ولی نمیدونم چیکار کنم تا با یه Select اینکار رو انجام بدم (البته میشد count رو تو همون Select دوم قرار داد ولی فکر کردم شاید برای هر سطر داده تو SQL یه بار باید Count اجرا بشه که خوب نیست)
دوستان لطفا نظرات و پیشنهادهای خودتون رو بفرمایید تا بتونم عملیات رو بهینه تر و با سربار کمتری انجام بدم
متشکرم