fredxiong

导航

统计
公告
 

2009年12月12日

当你的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),6FROM tb WITH(XLOCK,PAGLOCK))
END 
GO 
-- 在表中应用函数 
CREATE TABLE tb(
BH 
char (8PRIMARY 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
=countCASE 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(80NOT NULL

 

 

posted @ 2009-12-12 11:09 fredxiong 阅读(214) 评论(0) 编辑