当你的dnn站点在线运行了一段时间之后,你会发现速度在不断下降,加载页面很慢很慢,这是为何呢?
仔细寻找,你可能会发现数 据库一直在膨胀,我想这就是站点变慢的罪魁祸首,在dnn中,如果你开启网站记录这一功能或某一任务调度,这些都会产生一堆的记录信息,久而久之就让你站 点的数据库不断的膨胀. 你如果有条件或权限的话,你不妨到主机管理/SQL服务或在SQL Manage里执行以下语句看看你的数据库大小都消耗在哪了:
sp_spaceused eventlog/sitelog/schedulehistory
一、如果日志文件太大,可以压缩日志文件,参考清除SQL SERVER日志
二、上面的方法的没法清除schedulehistory这一表里的数据,执行下列语句清除:
TRUNCATE TABLE eventlog
TRUNCATE TABLE schedulehistory
TRUNCATE TABLE sitelog
TRUNCATE TABLE SearchItemWordPosition
GO
转载地址: http://www.dnnsun.com/
posted @ 2009-12-12 18:44 fredxiong 阅读(111) 评论(0)
编辑
posted @ 2009-12-12 18:41 fredxiong 阅读(157) 评论(0)
编辑
一、简单静态游标示例:

代码
DECLARE product_cursor CURSOR STATIC FOR
SELECT cName FROM Product
OPEN product_cursor
FETCH NEXT FROM product_cursor INTO @product
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @message = ' ' + @product
PRINT @message
FETCH NEXT FROM product_cursor INTO @product
END
CLOSE product_cursor
DEALLOCATE product_cursor
二、静态游标与动态游标的区别
静态(STATIC)游标创建将由该游标使用的数据的临时复本。对游标的所有请求都从tempdb 中的这一临时表中得到应答;因此,在对该游标进行提取操作时返回的数据中不反映对基表所做的修改,并且该游标不允许修改
动态(DYNAMIC) 游标会反映在滚动游标时对结果集内的各行所做的所有数据更改。行的数据值、顺序和成员身份在每次提取时都会更改。动态游标不支持ABSOLUTE 提取选项。
FORWARD_ONLY
指定資料指標只能從第一個資料列捲到最後一個資料列。FETCH NEXT 是唯一支援的提取選項。若指定 FORWARD_ONLY 時未加上 STATIC、KEYSET 或 DYNAMIC 等關鍵字,資料指標便會作為 DYNAMIC 資料指標操作。沒有指定 FORWARD_ONLY 及 SCROLL 時,則預設為 FORWARD_ONLY,除非指定了 STATIC、KEYSET 或 DYNAMIC 關鍵字。
如果很在意游标的类型, 应该在定义游标的时候, 加上游标类型定义的关键字, 并加上TYPE_WARNING 关键字, 以便在游标类型不是预期的情况下, 收到警告信息

代码
--下面的演示针对 STATIC 和DYNAMIC 游标, 显示两者在游标循环期的差异
[code=SQL]
-- 定义演示数据
IF OBJECT_ID('tempdb..#tb') IS NOT NULL
DROP TABLE #tb
CREATE TABLE #tb(
id int PRIMARY KEY,
col sysname)
INSERT #tb(
id, col)
SELECT 1, 'AA' UNION ALL
SELECT 2, 'BB' UNION ALL
SELECT 3, 'CC' UNION ALL
SELECT 4, 'DD'
-- 游标测试
DECLARE CUR_tb CURSOR LOCAL FORWARD_ONLY READ_ONLY TYPE_WARNING STATIC --DYNAMIC
FOR
SELECT
id, col
FROM #tb
-- 游标打开前删除记录
DELETE TOP (1)
FROM #tb
WHERE id = 4
SELECT 'before cursor open', * FROM #tb
-- 打开游标
OPEN CUR_tb
-- 游标打开后删除记录
DELETE TOP (1)
FROM #tb
WHERE id = 3
SELECT 'after cursor open', * FROM #tb
FETCH CUR_tb
WHILE @@FETCH_STATUS = 0
BEGIN
-- 游标循环中删除记录
DELETE TOP (1)
FROM #tb
WHERE id = 2
FETCH CUR_tb
END
CLOSE CUR_tb
DEALLOCATE CUR_tb
posted @ 2009-12-12 17:59 fredxiong 阅读(724) 评论(1)
编辑

代码
SQLServer 中的回车符与换行符
制表符:CHAR(9) 换行符:CHAR(10) 回车符:CHAR(13)
1、将 varchar 值作为条件,查询Where Id in 列表的值
declare @a varchar ( 100 )
set @a = '56,58'
-- 正确的:
select * from tb where charindex ( ',' + ltrim (id) + ',' , ',' + @a + ',' ) > 0
-- 错误的:
select * from tb where id in + @a
2、找出与某id相近的四条记录
Create table tb(id int ,cName char ( 10 ))
DECLARE @ID INT
SET @ID = 7
SELECT * FROM TB A WHERE id in
( SELECT TOP 4 id FROM TB ORDER BY ABS (id - @id ))
ORDER BY ID
3、按名称,规格分组,将单价数据合并成一行,并计算数量
Create table [tb] (tName varchar(4), [tSize] varchar (7), [ tPrice ] int , [ tQty ] int )
insert [ tb ]
select '高瓦' , '880*110' , 22 , 1 union all select '高瓦' , '880*110' , 25 , 1 union all
select '高瓦' , '880*110' , 22 , 1 union all select '高瓦' , '880*120' , 22 , 1
select tName, tSize,
tPrice = stuff (( select ',' + ltrim (tPrice) from tb
where tName = t.tName and tSize = t.tSize FOR XML PATH('')),1,1,''), sum(tQty) as tQty
from tb t group by tName, tSize
---结果-----------------------------
tName tSize tPrice tQty
高瓦 880*110 22,25,22 3
高瓦 880*120 22 1
4、根据出生日期,计算出准确的年龄
SET @A = '2008-08-12'
DECLARE @A DATETIME
SELECT 年龄 =
case when datediff(day,dateadd(year,datediff(year,@A,getdate()),@A), getdate())>= 0
then datediff(year,@A,getdate()) else datediff(YY,@A,getdate())- 1 end
5、找出某目录列表中所有下级目录,包括自己

代码
DECLARE @FolderList varchar ( 800 )
SET @FolderList = '1'
SET NOCOUNT ON
CREATE TABLE # Temp (FolderId int )
INSERT # Temp
SELECT FolderId FROM Doc_Folder
WHERE CHARINDEX ( ',' + LTRIM (FolderId) + ',' , ',' + @FolderList + ',' ) > 0
WHILE @@Rowcount > 0
BEGIN
INSERT # Temp SELECT FolderId FROM Doc_Folder AS A WHERE
EXISTS ( SELECT 1 FROM # Temp AS B WHERE B. [ FolderId ] = A.ParentFolderId)
AND NOT EXISTS(SELECT 1 FROM # Temp AS B WHERE B. [FolderId] = A.[FolderId])
END
6、简单静态游标

代码
DECLARE product_cursor CURSOR STATIC FOR
SELECT cName FROM Product
OPEN product_cursor
FETCH NEXT FROM product_cursor INTO @product
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @message = ' ' + @product
PRINT @message
FETCH NEXT FROM product_cursor INTO @product
END
CLOSE product_cursor
DEALLOCATE product_cursor
7、要求是取得每个ID对应postId的前三条

代码
CREATE TABLE [tb] (Id INT ,postId INT )
INSERT INTO [tb]
SELECT 2788 , 45753530 UNION ALL
SELECT 6417 , 46862065 UNION ALL
SELECT 61773 , 47407456 UNION ALL
SELECT 61773 , 47436468 UNION ALL
SELECT 61773 , 47448259 UNION ALL
SELECT 61773 , 47474393 UNION ALL
SELECT 83604 , 41671947 UNION ALL
SELECT 83604 , 45858681 UNION ALL
select id, postid from ( select * ,cid = row_number() over (partition by id order by id) from tb ) as t
where t.cid <= 3
8、实现编号自动增长

代码
--下面的代码生成长度为8的编号,编号以BH开头,其余6位为流水号。
-- 得到新编号的函数
CREATE FUNCTION f_NextBH()
RETURNS char ( 8 )
AS
BEGIN
RETURN (SELECT 'BH' +RIGHT(1000001 + ISNULL(RIGHT(MAX(BH),6),0),6) FROM tb WITH(XLOCK,PAGLOCK))
END
GO
-- 在表中应用函数
CREATE TABLE tb(
BH char (8) PRIMARY KEY DEFAULT dbo.f_NextBH(),col int)
-- 插入资料
BEGIN TRAN
INSERT tb(col) VALUES ( 1 )
INSERT tb(col) VALUES ( 2 )
INSERT tb(col) VALUES ( 4 )
INSERT tb(BH,col) VALUES (dbo.f_NextBH(), 14 )
COMMIT TRAN
9、表Age_AssignedNum中的字段CallRecordId,其值有三种:K、N、null,
按PlanId分组统计出这三种值各有多少行

代码
SELECT PlanId,sK=count(CASE CallRecordId WHEN 'K' then CallRecordId end),
sN=count(CASE CallRecordId WHEN 'N' then CallRecordId end),
sNull=count( CASE isnull(CallRecordId,'') WHEN '' then '1' end)
FROM Age_AssignedNum GROUP BY PlanId
posted @ 2009-12-12 17:47 fredxiong 阅读(307) 评论(0)
编辑
一、客户端调用实例
1、JS获取aspx页面在客户端请求的地址:
Request.Url.Host:取得主页地址的头
ResolveUrl:将URL转换为在客户端可以访问的URL地址
<a src= 'http://<%=Request.Url.Host %><%= ResolveUrl("../PayCenter/AlipayAdd.aspx")%>'>地址</a>
2、重新设置父窗体的地址
top.window.document:表示父窗体,如果是MainFrame对象在本窗体中,则不加top.window.document
function navurl(url) {
$("#mainFrame",top.window.document).attr("src", url);
}
二、C#调用客户端实例
1、C#调用客户端的方法(function navurl(strUrl))

代码
string navUrl = "javascript:navurl('" + "http://" + Request.Url.Host + ResolveUrl("../Document/callIndex.aspx?FolderId=");
DocName.NavigateUrl = navUrl + txtDocId.Value.Trim() + "')";
2. C#注册脚本块:

代码
page.ClientScript.RegisterStartupScript(page.GetType(), "message", "<script>alert('" + msg.ToString() + "');</script>");
posted @ 2009-12-12 17:29 fredxiong 阅读(167) 评论(0)
编辑
摘要: 在.net里静态类型分成:静态类、静态成员
静态类:一个类里面如果只包含静态成员和静态方法,则该类可以定义为静态类,给类加上static修饰符;
静态成员:静态成员包括静态字段和静态属性,静态成员和类相关联,不依赖于对象而存在,只能由类访问,而不能由对象访问;
静态成员属于类所有,无认创建多少实例对象,静态成员在内存中只有一份;实例成员属于类的实例所有,每创建一个实例对象,实例成员都会在内存中分配一块内存区域;所以静态成员一般用于存放共享的数据段,如数据库连接字符串等。
阅读全文
posted @ 2009-12-12 13:51 fredxiong 阅读(162) 评论(0)
编辑
摘要: 接口和抽象类的使用是大家经常讨论的问题,什么时候使用接口,什么该用抽象类,两者经常交叉在一起,对它们进行彻底的分析是很有必要的。
接口是包含一组虚方法的抽象类型,其中每一种方法都有其名称、参数和返回值,接口方法不能包含任何实现。
抽象类提供多个派生类共享基类的公共定义,它既可以提供抽象方法,也可以提供非抽象方法。抽象类不能实例化,必须通过继承由派生类实现其抽象方法,因此对抽象类不能使用new关键字,如果派生类没有实现所有的抽象方法,则该派生类也必须声明为抽象类,在抽象方法声明中不能使用 static 或 virtual 修改符, 实现抽象方法由override方法来完成。
阅读全文
posted @ 2009-12-12 13:42 fredxiong 阅读(29) 评论(0)
编辑
实例一,用HyperLink控件,数据绑定时增加链接地址:
UI代码:

代码
<asp:GridView ID="grdResult" runat="server" CssClass="DataGrid_Container" AllowPaging="False"
AutoGenerateColumns="False" BorderWidth="0" OnRowDataBound="grdResult_RowDataBound" >
<RowStyle CssClass="DataGrid_Item" />
<SelectedRowStyle CssClass="DataGrid_SelectedItem" />
<HeaderStyle CssClass="DataGrid_Header" />
<AlternatingRowStyle CssClass="DataGrid_AlvternatingItem" />
<Columns>
<asp:TemplateField HeaderText="选择" >
<ItemTemplate >
<input id="SelectId" type="checkbox" value='<%# Eval("DocId") %>' />
<asp:HiddenField id="DocId" value='<%# Eval("DocId") %>' runat="server" />
<asp:HiddenField id="DocType" value='<%# Eval("DocType") %>' runat="server" />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="名称" HeaderStyle-HorizontalAlign="Left" ItemStyle-HorizontalAlign="Left" >
<ItemTemplate >
<asp:Image ID="imgFolder" runat="server" />
<asp:HyperLink ID="DocName" Text='<%# Eval("DocName") %>' runat="server"></asp:HyperLink>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="FileSize" HeaderText="文件大小(KB)" />
<asp:BoundField DataField="CreateDate" HeaderText="修改时间" DataFormatString="{0:yyyy年MM月dd日 HH:mm}" />
</Columns>
</asp:GridView>
C#代码绑定方法一:

代码
protected void Page_Load(object sender, System.EventArgs e)
{
if(!Page.IsPostBack)
{
BindGridData();
}
}
private void BindGridData()
{
List<DocumentInfo> di=DocumentController.GetListDocument(this.UserId);
if (di.Count == 0)
{
di.Add(new DocumentInfo());
}
grdResult.DataSource = di;
grdResult.DataBind();
}
//数据绑定时增加链接地址
protected void grdResult_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow )
{
HyperLink DocName = (HyperLink)e.Row.FindControl("DocName");
Image imgFolder=(Image) e.Row.FindControl("imgFolder");
//List<DocumentInfo> di =e.Row.DataItem as List<DocumentInfo>;
HiddenField txtDocId = (HiddenField) e.Row.FindControl("DocId");
HiddenField txtDocType = (HiddenField)e.Row.FindControl("DocType");
//根据表中的列判断是否有数据
if (txtDocId.Value == "0")
{
int cols = e.Row.Cells.Count;
TableCellCollection tc = e.Row.Cells;
tc.Clear();
tc.Add(new TableCell());
tc[0].ColumnSpan = cols;
tc[0].Text = "没有找到你要的资料。";
}
if (txtDocType.Value.Trim().ToLower() == "fold")
{
imgFolder.ImageUrl = this.ControlPath + "images/folder1.gif";
string navUrl = "javascript:navurl('" + "http://" + Request.Url.Host + ResolveUrl("../Document/callIndex.aspx?FolderId=");
DocName.NavigateUrl = navUrl + txtDocId.Value.Trim() + "')";
}
}
}
C#代码绑定方法二:

代码
//绑定时设定链接地址
protected void grdResult_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow && e.Row.RowIndex >= 0)
{
DataRowView dr=(DataRowView)e.Row.DataItem;
int intTabID= Common.GetTabId(PortalId, "ReceiveAccount");
HyperLink likSendMsg = (HyperLink)e.Row.FindControl("OptSendMsg");
if (intTabID >= 0)
{
likSendMsg.NavigateUrl = Globals.NavigateURL(intTabID, "", "fId=" + dr["UserId"].ToString());
}
}
}
实例二,用ImageButton控件,当用户点击button时,通过事件处理程序按照DataKey的值,
进行转向链接或进行数据处理:
UI代码:

代码
<asp:GridView ID="grdData" runat="server" Visible="False" CssClass="DataGrid_Container"
PagerSettings-Visible="false" BorderWidth="0px" DataKeyNames="RowId"
AutoGenerateColumns="False" AllowSorting="True" OnRowEditing="grdData_RowEdit" OnSorting="grdData_Sorting"
OnRowDeleting="grdData_RowDeleting" >
<AlternatingRowStyle CssClass="DataGrid_AlvternatingItem" />
<RowStyle CssClass="DataGrid_Item" />
<HeaderStyle CssClass="DataGrid_Header" />
<Columns>
<asp:TemplateField HeaderText="执行操作">
<ItemTemplate >
<asp:ImageButton ID="BtnUpdate" runat="server" ToolTip="编辑" CommandName="Edit" ImageUrl="~/images/edit.gif" />
<asp:ImageButton ID="BtnDelete" runat="server" CausesValidation="False" CommandName="Delete"
ToolTip="删除" OnClientClick="return confirm('确认要删除此记录吗?')" ImageUrl="~/images/delete.gif"/>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
C#代码:

代码
protected void grdData_RowEdit(object sender, GridViewEditEventArgs e)
{
string RowId = grdData.DataKeys[e.NewEditIndex].Value.ToString();
Response.Redirect(EditUrl("RowId",RowId, "EditForm"));
}
protected void grdData_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
if (ListController.DeleteRow(TableName, grdData.DataKeys[e.RowIndex].Value.ToString()))
{
Common.ShowSuccessFacebox("删除成功!", Page, 0);
}
else
{
Common.ShowFailureFacebox("删除失败!", Page);
return;
}
grdData.EditIndex = -1;
BindData();
}
posted @ 2009-12-12 13:34 fredxiong 阅读(92) 评论(0)
编辑

代码
using System.Collections.Generic;
using System.Reflection;
using System.Data;
partial class ViewFolder: System.Web.UI.Page
{
protected void Page_Load(object sender, System.EventArgs e)
{
if (!Page.IsPostBack)
{
GetNotes();
}
}
private void GetNotes()
{
//根节点
TreeNode tn=new TreeNode("我的文档", "0", this.ControlPath + "images/folder0.gif");
int FolderControlID = DocumentController.GetTabId(this.PortalId, "ViewDocument");
tn.NavigateUrl = Globals.NavigateURL(FolderControlID, "", "FolderId=0");
TreeFolder.Nodes.Add(tn);
DataTable dt=null;
try
{
dt = DocumentController.GetListFolder(UserId);
}
catch (Exception exc)
{
//Module failed to load
Exceptions.ProcessModuleLoadException(this, exc);
}
//增加子节点
IntiTree(TreeFolder.Nodes , dt, 0);
TreeNode dustbin = new TreeNode("垃圾箱", "-1");
dustbin.ImageUrl = this.ControlPath + "images/Dustbin.gif";
TreeFolder.Nodes.Add(dustbin);
}
//递归增加子节点
private void IntiTree(TreeNodeCollection Nds,DataTable dt, int parentId)
{
DataView dv=new DataView();
TreeNode tmpNd; //创建临时节点
dv.Table = dt;
dv.RowFilter = "ParentFolderId=" + parentId; //筛选数据
int FolderControlID = DocumentController.GetTabId(this.PortalId, "ViewDocument");
foreach(DataRowView drv in dv)
{
tmpNd=new TreeNode();
int FolderId=Convert.ToInt32(drv["FolderId"]); //当前节点的ID号
tmpNd.Value=FolderId.ToString();
tmpNd.Text=drv["FolderName"].ToString();
string navUrl = "javascript:navurl('" + "http://" + Request.Url.Host + ResolveUrl("../Document/callIndex.aspx?FolderId=");
tmpNd.NavigateUrl = navUrl + drv["FolderId"].ToString() + "')";
tmpNd.ImageUrl = "images/folder1.gif";
tmpNd.Expanded = false; //节点是否展开
//tmpNd.Target="main"; //节点重定向的方向
Nds[Nds.Count-1].ChildNodes.Add(tmpNd); //将临时节点添加到TreeView菜单中
IntiTree(Nds[Nds.Count-1].ChildNodes,dt,FolderId); //递归调用,进行遍历
}
}
}
posted @ 2009-12-12 13:21 fredxiong 阅读(245) 评论(0)
编辑
最近自已开发了一个自定义表单管理系统,就是让用户自己定制自己的表,字段,通过此系统自动生成表,并提供数据录入与修改的界面。
我参照SQL Server帮助文档中Alter Table命令,对表结构进行修改时,出错了一些错误,下面特针对此常见错误做出详细说明,文章中有引用作者[Leo]的方法例题

代码
一、为标识列添加默认值
下面对表MyCustomers中的字段CompanyName进行修改,使其具有默认值'Datum Corporation'
ALTER TABLE MyCustomers ADD DEFAULT 'Datum Corporation' FOR [CompanyName]
如果该列设置了默认值,那么对该列结构作修改操作,都将引发错误(如删除或修改该列的默认值等)
出错信息如下:
“消息 5074,级别 16,状态 1,第 1 行
对象'DF__Tb_SalaryPar__aa__7DB89C09' 依赖于 列'aa'。
消息 4922,级别 16,状态 9,第 1 行
由于一个或多个对象访问此列,ALTER TABLE DROP COLUMN aa 失败。”
因为存在了default约束,此时我们需要查找出表中该列的约束名称,删除约束,再对此列进行修改
1.查找出表中该列的约束名称
declare @conName varchar(50)
select @conName =b.name from sysobjects b join syscolumns a on b.id = a.cdefault
where a.id = object_id('TableName')
and a.name ='ColumName'
2. 删除约束删除该列 即可
exec('alter table TableName drop constraint ' + @conName)
exec('alter table TableName drop column ColumName')
二、对表distributors中address字段的其它操作
向表中增加一个address字段:
ALTER TABLE distributors ADD COLUMN [address] varchar(30)
从表中删除一个字段:
ALTER TABLE distributors DROP COLUMN [address] RESTRICT
修改字段的长度或类型:
ALTER TABLE distributors ALTER COLUMN [address] varchar(20)
给一个字段增加一个非空约束:
ALTER TABLE distributors ALTER COLUMN [address] varchar(80) NOT NULL
posted @ 2009-12-12 11:09 fredxiong 阅读(214) 评论(0)
编辑