今天策劃部提出新需求:要分等級分配會員上傳文件的空間
不僅文件要算容量,nvchar 和text字段的內容也要算容量
根據這個需求我需要建一個用戶輔表,寫好獲取空間的類,然後遍歷所有表,同步更新到用戶輔表
表結構如下:
字段
類型
Null
備注
外健表
Inid
INT
Y
ID
UserID
Int
會員
PageFormat
Int
Y
版式定義(1-左中右,2-左右,3-中…..)
系統中存放的字典
PageFormIDs
Nvarchar(500)
版式組合ID字串(1,3,4|7,2|9,8)
BlogFormatInfo
PageStyleID
Int
用戶界面的風格ID
系統中存放的字典
PageFlashID
Int
用戶界面的FlashID
系統中存放的字
BlogName
Nvarchar(50)
博客名稱
BlogInfo
Nvarchar(100)
博客個性備注
BlogSaveSize
Int
會員博客當前空間使用大小
LastDate
Smalldatetime
修改時間
PageDiaryType
Int
博客日志模塊顯示方式,1-全文,2-摘要,3-標題,(默認為2)
PageDiaryNum
int
博客日志模塊顯示條數
AllAccessNum
int
所有訪問量
BlogMicUsize
Int
會員博客音樂占用空間(MB)
BlogVideoUsize
Int
會員博客視頻占用空間(MB)
BlogVocUsize
Int
會員博客詞占用空間(MB)
BlogBendUsize
Int
會員博客曲占用空間(MB)
BlogPicUsize
Int
會員博客圖片中用空間(MB)
BlogDaryUsize
Int
會員博客日志占用空間(MB)
BlogUseRiseSize
Int
允許會員所用最大空間(MB)
字段
類型
Null
備注
外健表
MusicID
INT
Y
MVID
MusicName
Nvarchar(30)
MV名稱
MusicURL
Nvarchar(50)
Y
MV存放目錄/a.mp3
字段
類型
Null
備注
外健表
VideoID
INT
Y
MVID
VideoName
Nvarchar(100)
MV名稱
VideoURL
Nvarchar(100)
Y
MV存放目錄/a.mp3
字段
類型
Null
備注
外健表
VocableID
INT
Y
VocName
Nvarchar(100)
詞名稱
BallotNew
int
鮮花值(15088)/顯示順序
EggNew
Int
砸雞蛋數
TotalAudition
int
試聽計數
TotalDownload
int
下載計數
暫不用
MusicIntro
Nvarchar(1000)
作品介紹
字段
類型
Null
備注
外健表
BendID
INT
Y
BendName
Nvarchar(30)
曲名稱
MusicURL
Nvarchar(50)
Y
MV存放目錄/a.mp3
列名
數據類型
備注
Null
AlbumID
INT
相冊ID
Y
AlbumName
Nvarchar(100)
相冊名稱(默認為”我的相冊”) shooting\ shooting2
UserID
INT
相冊所屬會員ID
CreateTime
smallDateTime
相冊創建時間
Taxic
Float
排序
AlbumInfo
Nvarchar(100)
相冊簡介
UpdateTime
smallDateTime
更新時間
AlbUMLable
Nvarchar(100)
標簽
AlbumTopPic
Nvarchar(100)
相冊封面
注:會員在第一次初始化博客時,系統自動插入一條記錄
列名
數據類型
備注
Null
PicID
INT
相冊圖片ID
Y
PhotoName
Nvarchar(100)
照片名稱
SmallPhotoLink
Nvarchar255)
縮略圖存放地址
列名
數據類型
Null
備注
外健表
DiaryID
INT
否
UserID
Int
會員ID
UserInfo
DiaryTag
Nvarchar(200)
日志標簽(a,c,b,d)
Title
Nvarchar(100)
日志標題
Content
Ntext(16)
日志內容
獲取空間的類很簡單就是 枚舉幾種類型 不同的枚舉類型去找相應的文件相對路徑計算出空間大小或計算出字段的字節。
然後遍歷所有表,同步更新到用戶輔表:
這是個比較大的操作,要保證效率我首先想到批處理,要解決不超時我覺得AJax可能比較好
下面是代碼:
public class InitSpaceSize : Common.PageBase
{
protected System.Web.UI.WebControls.DataGrid DataGrid1;
Common.FileOp.FileSize fo=new Common.FileOp.FileSize();
private void Page_Load(object sender, System.EventArgs e)
{
AjaxPro.Utility.RegisterTypeForAJax(typeof(InitSpaceSize));
}
#region Web 窗體設計器生成的代碼
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 該調用是 ASP.Net Web 窗體設計器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// 設計器支持所需的方法 - 不要使用代碼編輯器修改
/// 此方法的內容。
/// </summary>
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
private DataTable UniteFiles()
{
fo.DummyPath="../";
string strSql=@"
Select MusicURL as BlogMicUsize,'0' as BlogVideoUsize,'0' as BlogVocUsize,'0' as BlogBendUsize,'0' as BlogPicUsize
,'0' as BlogDaryUsize ,UserID from BlogMusic where MusicURL !=''
union Select '0' as BlogMicUsize,VideoURL as BlogVideoUsize,'0' as BlogVocUsize,'0' as BlogBendUsize
,'0' as BlogPicUsize,'0' as BlogDaryUsize,UserID from BlogVideo where VideoURL !=''
union Select '0' as BlogMicUsize,'0' as BlogVideoUsize,MusicIntro as BlogVocUsize,'0' as BlogBendUsize
,'0' as BlogPicUsize,'0' as BlogDaryUsize,UserID from BlogVocable where MusicIntro!=''
Union Select '0' as BlogMicUsize,'0' as BlogVideoUsize,'0' as BlogVocUsize
,MusicURL as BlogBendUsize,'0' as BlogPicUsize,'0' as BlogDaryUsize,UserID
from BlogBend where MusicURL !=''
Union
Select '0' as BlogMicUsize,'0' as BlogVideoUsize,'0' as BlogVocUsize
,'0' as BlogBendUsize,PhotoLink as BlogPicUsize,'0' as BlogDaryUsize,UserID
from BlogAlbum,BlogAlbumPic where BlogAlbumPic.AlbumID=BlogAlbum.AlbumID and PhotoLink !=''
";
IStatement dbment = Db.CreateStatement(strSql);
DataTable dt = dbment.GetDataTable();
if(dt!=null)
{
for(int i=0;i<dt.Rows.Count;i++)
{
if(dt.Rows[i]["BlogMicUsize"].ToString()!="0")
{
fo.FileName=dt.Rows[i]["BlogMicUsize"].ToString();
dt.Rows[i]["BlogMicUsize"]=fo.GetFileSize(Common.FileOp.enumFilePath.BlogMicUsize);
}
else if(dt.Rows[i]["BlogVideoUsize"].ToString()!="0")
{
fo.FileName=dt.Rows[i]["BlogVideoUsize"].ToString();
dt.Rows[i]["BlogVideoUsize"]=fo.GetFileSize(Common.FileOp.enumFilePath.BlogVideoUsize);
}
else if(dt.Rows[i]["BlogVocUsize"].ToString()!="0")
{
fo.FileName=dt.Rows[i]["BlogVocUsize"].ToString();
dt.Rows[i]["BlogVocUsize"]=fo.GetFileSize(Common.FileOp.enumFilePath.BlogVocUsize);
}
else if(dt.Rows[i]["BlogBendUsize"].ToString()!="0")
{
fo.FileName=dt.Rows[i]["BlogBendUsize"].ToString();
dt.Rows[i]["BlogBendUsize"]=fo.GetFileSize(Common.FileOp.enumFilePath.BlogBendUsize);
}
else if(dt.Rows[i]["BlogPicUsize"].ToString()!="0")
{
fo.FileName=dt.Rows[i]["BlogPicUsize"].ToString();
dt.Rows[i]["BlogPicUsize"]=fo.GetFileSize(Common.FileOp.enumFilePath.BlogPicUsize);
}
string sqlstr = string.Format(@"Insert Into TempUserSpace (BlogMicUsize,BlogVideoUsize,BlogVocUsize,BlogBendUsize,BlogPicUsize,UserID)
Values('{0}','{1}','{2}','{3}','{4}','{5}')"
,decimal.Parse(dt.Rows[i]["BlogMicUsize"].ToString()),decimal.Parse(dt.Rows[i]["BlogVideoUsize"].ToString()),decimal.Parse(dt.Rows[i]["BlogVocUsize"].ToString())
,decimal.Parse(dt.Rows[i]["BlogBendUsize"].ToString()),decimal.Parse(dt.Rows[i]["BlogPicUsize"].ToString()),int.Parse(dt.Rows[i]["UserID"].ToString()));
IStatement dbment1 = Db .CreateStatement (sqlstr);
dbment1.Update();
}
}
return dt;
}
private void UniteFilesGroup()
{
string >strSql=@"Select
Sum(BlogMicUsize) as BlogMicUsize
,Sum(BlogVideoUsize) as BlogVideoUsize
,Sum(BlogVocUsize) as BlogVocUsize
,Sum(BlogBendUsize) as BlogBendUsize
,Sum(BlogPicUsize) as BlogPicUsize
,UserID
from TempUserSpace
Group By UserID
order by UserID desc";
IStatement dbment = Db.CreateStatement(strSql);
DataTable dt = dbment.GetDataTable();
if(dt!=null)
{
for(int i=0;i<dt.Rows.Count;i++)
{
string sqlstr = string.Format(@"Update BlogIndividuation Set BlogMicUsize='{0}',BlogVideoUsize='{1}'
,BlogVocUsize='{2}',BlogBendUsize='{3}',BlogPicUsize='{4}' Where UserID='{5}'"
,decimal.Parse(dt.Rows[i]["BlogMicUsize"].ToString()),decimal.Parse(dt.Rows[i]["BlogVideoUsize"].ToString()),decimal.Parse(dt.Rows[i]["BlogVocUsize"].ToString())
,decimal.Parse(dt.Rows[i]["BlogBendUsize"].ToString()),decimal.Parse(dt.Rows[i]["BlogPicUsize"].ToString()),int.Parse(dt.Rows[i]["UserID"].ToString()));
IStatement dbment1 = Db .CreateStatement (sqlstr);
dbment1.Update();
}
}
}
private void UniteBlogFiles()
{
fo.DummyPath="../";
string strSql=@"
Select Content as BlogDaryUsize,UserID from BlogDiary Where Content is not null
";
IStatement dbment = Db.CreateStatement(strSql);
DataTable dt = dbment.GetDataTable();
if(dt!=null)
{
for(int i=0;i<dt.Rows.Count;i++)
{
if(dt.Rows[i]["BlogDaryUsize"].ToString()!="0")
{
fo.FileName=dt.Rows[i]["BlogDaryUsize"].ToString();
dt.Rows[i]["BlogDaryUsize"]=fo.GetFileSize(Common.FileOp.enumFilePath.BlogDaryUsize);
}
string sqlstr = string.Format(@"Insert Into TempBlogSpace (BlogDaryUsize,UserID)
Values('{0}','{1}')"
,decimal.Parse(dt.Rows[i]["BlogDaryUsize"].ToString()),int.Parse(dt.Rows[i]["UserID"].ToString()));
IStatement dbment1 = Db .CreateStatement (sqlstr);
dbment1.Update();
}
}
this.UniteBlogGroup();
}
private void UniteBlogGroup()
{
string >strSql=@"Select
Sum(BlogDaryUsize) as BlogDaryUsize
,UserID
from TempBlogSpace
Group By UserID
order by UserID desc";
IStatement dbment = Db.CreateStatement(strSql);
DataTable dt = dbment.GetDataTable();
if(dt!=null)
{
for(int i=0;i<dt.Rows.Count;i++)
{
string sqlstr = string.Format(@"Update BlogIndividuation Set BlogDaryUsize='{0}' Where UserID='{1}'"
,decimal.Parse(dt.Rows[i]["BlogDaryUsize"].ToString()),int.Parse(dt.Rows[i]["UserID"].ToString()));
IStatement dbment1 = Db .CreateStatement (sqlstr);
dbment1.Update();
}
}
}
[AjaxPro.AJaxMethod()]
public void InitUserSpaces()
{
this.UniteFiles();
this.UniteFilesGroup();
this.UniteBlogFiles();
}
總結:解決過程中遇到3個問題:
1,博客會員日志表 BlogDiary 的Content是text類型 無法進行 Union操作 所以我分2步實現
2, Union後的DataTable 我想再Group By排序 但沒實現了 ,只好插入臨時表
3,插入臨時表的時候 我想把DataTable插到數據庫 也沒實現了 ,只好for循環