Joffre's tech weblog

持而盈之 不如其已

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  18 随笔 :: 27 文章 :: 60 评论 :: 5 Trackbacks

2005年7月6日 #

如何实现在SPS中像传统网站一样,通过手工进行各种语言(中、英)的转换呢?

据本人了解WSS支持多语言站点,通过打语言补丁。但要实现Portal及WSS的多语言切换,有点晕!当安装SPS后,其对应的数据库(配置、内容)就确定语言了,WSS站点也是一样,在生成WSS时可以选择站点的语言,但生成后,其数据库也确定了语言。如何进行切换,在相应数据库上想办法?没有思路了?

听说中国台湾有人实现了,没道理中国大陆实现不了呀?神六都上天了。

希望能借助博客园,获得有些思绪,灵感,谢谢!

posted @ 2005-10-20 16:51 Joffre 阅读(1031) | 评论 (7)编辑

由于我们这个项目中使用微软的报表服务(Reporting Services)作为报表输出工具,本人也对它进行一点点研究,虽没有入木三分,但这点知识至少可以在大部分Reporting Service的场景中应用。

原先刚装上Reporting Service时还觉得有点神秘,毕竟在做这个项目前还没有真正接触这个微软用于代替水晶报表的报表工具,而且微软似乎还不满足于一个报表工具那么简单。

Reporting Services 是一种基于服务器的新型报表平台,部署在Microsoft® SQL Server 2000基础上,可用于创建和管理包含来自关系数据源和多维数据源的数据的表格报表、矩阵报表、图形报表和自由格式报表。可以通过基于 Web 的连接来查看和管理您创建的报表。

Reporting Services 提供了一套完整的服务、工具和应用程序编程接口 (API),您即使不是程序员也可以使用 Reporting Services。可以使用 Reporting Services 中包含的应用程序和工具来制作、发布和管理报表。此外,还提供了支持报表生存周期的各个阶段的工具或应用程序。程序员可以使用 API 将报表功能扩展或集成到自定义解决方案中。

本文主要简介Reporting Service开发中所涉及到的部分技术,首先我们可以从其是一个服务(Service)可知,它提供了Web Service接口,并且允许我们在报表中嵌入代码(必须是VB .Net),还可以引用基于.Net Framework的程序集。

在此主要讲Reporting Service开发相关技术的二个方面
 1.在自定义的应用程序中集成Reporting Service提供的报表服务
1.1生成报表展示组件

要想把Reporting Service的报表(RDL文件)集成到自定义的应用程序中,我们可以通过Reporting Service自带的一个报表展示组件,它可以通过对sample项目ReportViewer编译得到,默认为ReportViewer.dll

我们通过通过对sample项目ReportViewer进行编译,可以得用于在自定义应用程序集成RDL文件的组件,但如果我们需要在自定义应用程中传递参数给报表,用默认编译得到的ReportViewer.dll组件将不支持。接下来,我们要解决这个问题,如何将在自定义应用程中给报表参数赋值?
private void SetParameter(string name, string value)
{
    …
    …
}

  上图为ReportViewer.cs中的一个方法,此方法的作用将是给报表参数设置值,这时大家可能会很高兴,因为它提供了一个方法来支持,但当我们看到private时,我们也许高兴不起来了,微软基本安全考虑,默认状态下并不把传递参数的方法暴露出来。但往往实现应用与安全都是互斥的。

现在我们至少知道如何扩展该功能来达到我们的目的。

public void SetQueryParameter(string Name, string value)
{
    
this.SetParameter(Name, value);
}

我们新增一个public的方法SetQueryParameter,即可,如上图。再重新编绎一下,那么这个组件就具备了参数传递功能。

1.2把组件导入到工具箱

在工具箱中,选择Web窗体,选择右击菜单“添加/移除项”,在“Net Framework组件”项目中,点击“浏览”,选择我们之前生成的ReportViewer.dll文件。此时将会在工具箱中显示一个控件,如下图:


 1.3应用到我们的应用程序中

我们把控件拖到.aspx页面中,将会显示如下代码

<cc1:reportviewer
id="ReportViewer1"
runat="server" Format="HTML4.0"
Parameters="False" //在报表展示时不会显示报表自带参数
ServerUrl=""
ReportPath=""
></cc1:reportviewer>

我们可以设置ServerUrlReportPath属性来指定相应的报表服务器及报表RDL文件。

2.在报表中使用表达式、VB.NET代码、引用基于.Net Framework的程序集

2.1 嵌入代码(VB.net
您可以编写自定义代码,用在报表的表达式中。嵌入代码中的方法必须采用 Visual Basic .NET 编写,并且必须是基于实例的方法。下面图中显示了VB.net的一个方法。


这个报表中的代码段在本报表文件内都有效。
接下来我们要在报表的表达式中引用自定义编写的代码段,引用方法是通过Code来调用方法名,如下图。

2.2引用基于.Net Framework的程序集
要在报表设计中使用自定义程序集,您必须先创建程序集,让它可供报表设计器使用,再在报表中添加对该程序集的引用,然后在报表中使用一个表达式来引用该程序集中的方法。

要使用引用的程序集,必须把受托管的程序集引用到报表中,被引用的程序集也必须经过强名签字,如下图:


要引用表达式中的自定义代码,您必须调用自定义程序集中某个类的成员。调用方式取决于该方法是静态方法还是基于实例的方法。自定义程序集中的静态方法可在报表内全局使用。您可以通过命名空间、类和方法名称来访问表达式中的静态方法。例如:
=ClassLibrary1.Class1.ToChineseName1(Fields!EmpCode.Value)+"Test"

基于实例的方法可通过全局定义的 Code 成员使用。您可以通过先引用 Code 成员,再引用实例和方法名称来访问这些方法。例如:
=Code.objClass1.ToChineseName2(Fields!EmpCode.Value)+"Test"

以上方法只是在设计期的一些操作,要想我们引用的程序集成功运行在报表上,还需要进行安全、信任部署。如果需要在报表的设计期中的预览使用程序集,则需要把经过强名处理程序集(DLL),复制到C:\Program Files\Microsoft SQL Server\80\Tools\Report Designer(默认)目录下,如果报表被部署到报表服务器,您还必须向报表服务器部署这一自定义程序集,则需要把经过强名处理程序集(DLL),复制到C:\Program Files\Microsoft SQL Server\MSSQL\Reporting Services\ReportServer\bin(默认) 目录下。

posted @ 2005-08-17 21:47 Joffre 阅读(2216) | 评论 (4)编辑

    当我们项目中同时应用了COM技术及.NET技术时候,其最重要是解决它们之间如何通信、调用的问题,按理论来说,作为非托管代码(UnManaged Code)COM组件与托管代码(Managed Code).Net组件是无法相互调用的,COM组件根本不能在CLR基础构造上运行,受托管的.Net代码也要求其相互作用的代码也必须运行在CLR基础下。既然我们无法做到COM.Net之间的直接调用,那我们就需要创建一个相当于代理的中间介质,它叫做可调用COM包装器(COM callable wrapper (CCW),以下简称为CCW)



 

如果使用CCW包装器来实现COM.Net之间的调用问题?

1. 开发可在COM组件调用的.Net组件,其中要遵守的两个前提条件。

1.1必须用托管代码创建接口,并确保接口在类中实现。

1.2允许COM组件调用的方法必须定义为Public

创建.Net组件,并通过强名工具进行签名注册。
sn –k sample.snk
将创建一个新的密钥文件

2. 部署可在COM组件调用的.Net组件。

2.1 为你的.net组件创建一个类型库,该.net组件的类型库含有与COM组件相同的元数据,类型库文件扩展名为“.tlb”(工具:tlbexp
   方法:tlbexp sample.dll /out: sample.tlb

2.2 注册.net组件(工具:regasm
   方法:regasm /tlb sample.tlb sample.dll

2.3.net组件安装到全局装配件缓存(GAC)中(工具:gacutil
   方法:gacutil /i sample.dll

 

参考

Msdn: http://www.microsoft.com/china/MSDN/library/NetFramework/default.mspx

 

posted @ 2005-07-23 17:47 Joffre 阅读(420) | 评论 (0)编辑

因部署组人员工作较忙,无法到现场支持,而一向没有负载均衡经验的我有点后怕,总觉得那玩意挺复杂的,也没有时间去学,因我把时间都花在软件开发技术上了。

公司邮件已收到了,最高指示,负载均衡部署公司不会派人来现场,必须自已搞定,但公司总算有点仁慈的心,技术总监亲自授教10分钟。以下就把今天到现场的部署过程列一下,以作参考(三台前端Server)。

1. 确保三台服务器的OS一致,IP地址设置正确,最好在同一网段,服务器之间Ping没有问题。
假设三台服务器的IP分别为
a. 192.168.0.252
b. 192.168.0.253
c. 192.168.0.254
了网掩码:255.255.255.0

2. 配置三台服务器的网卡,确保“网络负载均衡”已选中



3. 打开负载均衡配置程序,在管理工具中,新建群集。


4. 群集参数配置,主要三个地方:虚拟IP、子网掩码、虚拟主机名。虚拟IP(虚拟主机名)是供客户端访问的地址,它会把客户端的请求、访问由系统自动根据网络负载路由到每个服务器上,减少单台服务器的压力。这里所配的虚拟IP为:192.168.9.1, 虚拟主机名:test.domain.com,子网掩码与服务器一致,配置完毕,下一步。




5. 这一步,我是跳过的,现在还不知道做何用?以后再搞明白吧,点下一步。

 

6.端口规则,点下一步。



7.连接本机IP,选中被连接主机的其中一块网卡(绑定负载均衡),点下一步。



8.



9.完成




10.其他二台服务器按照此步骤做一遍即可,当然在第7步时,要连接本机的IP。

后言

可能有人会问为什么不能在一台服务器上完成呢?
因为单播模式下的单个网络适配器不具有 intrahost 通讯功能,所以不能使用这台计算机上的“网络负载平衡管理器”来配置和管理其他主机。但是,您可以与群集之外的计算机通讯。

这只是一些配置负载均衡环境的简单步骤,知其然,并不知其所以然。其中的原理本人并不太清楚,有兴趣的人可以参考。
a.  网络负载平衡疑难解答

b. Windows 2003负载平衡策略全攻略

网络负载平衡疑难解答


 

posted @ 2005-07-14 23:04 Joffre 阅读(1046) | 评论 (2)编辑

1.ASP.NET Starter Kit
Portal Starter Kit
Commerce Starter Kit
Reports Starter Kit
Time Tracker Starter Kit
Community Starter Kit
Issue Tracker Starter Kit

2.duwamish(自带网上书店)

3.Fitch and Mather 7.0 (自带企业应用方面)

4.PetShop
一个基于.net的宠物商店

5.DNN

6.Rainbow

7.SharpDevelop

一个用于制作C#或者VB.NET的项目而设计的一个编辑器(类似于VS.netIDE,当然没法和MS相比较)

8.Community Server

posted @ 2005-07-13 22:21 Joffre 阅读(567) | 评论 (0)编辑

1.1 基本简介

主要属性的含义

AutoGenerateColumns:自动产生列,如果你想自已通过DataGrid<Columns>来自定义列,则必须把此值设为false

AllowSorting:允许排序(true),结合SortExpression来使用

AllowPaging:允许分页(true),结合PageSize, PagerStyle来使用,可以定义NumericPages, NextPrev二种模式,即数字与下一页。

PageSize:每页显示的记录数

DataKeyField:主键

DataMember:数据源中的数据成员,比如你有多个返回table,你可以指定某个table

DataSource:绑定的数据源,一般是Dataview,datatable,dataset

AccessKey:按键

AllowCustomPaging:允许自定义分页

CurrentPageIndex:当前页码

SelectedIndex:当前选择的行

ShowHeader:是否显示表头

ShowFooter:是否显示表脚

 1.2 DataGrid的通用功能

1.2.1 DataGridEditCommandColumn如何使用图片作为按钮?

<asp: EditCommandColumn ButtonType="LinkButton" UpdateText="<img src='update.jpg' border='0'>" CancelText="<img src='cancel.jpg' border='0'>" EditText="<img src='edit.jpg' border='0'>"></asp:EditCommandColumn>

1.2.2 在我做的项目中同事经常对我说DataGrid的事件丢失了,为什么丢失呢?

:是因为在aspx中有绑定数据,且绑定数据又是一个超链接时,在aspx页面设计界面与代码界面切换时,就可能会导致某些事件的丢失,不仅仅是Datagrid,其他通过双击控件自动产生的事件或通过属性来产生的事件都有可能丢失。

最保险的方法是不要通过以上方法来产生控件的事件,如按扭控件就直接在控件的OnClick=” Button1_Click”,但要修改一下Button1_Click方法访问修饰符。

1.2.3. 利用footertext位置显示新增行,并进行新增操作。

这种方法就是利用了footertext这个属性,在footertext中可以这样写

footertext="<input type=text name=Class>"

运行的时候这就是一个输入框,类似的下面就是一个按钮

footertext="<input type=button value='增加'>"

输入和提交都有了,下面就是把数据提交到数据库中,我要利用一个隐藏的服务器控件

<asp:linkbutton id="AddNew" runat="server"></asp:linkbutton>

来帮忙(这个就是以前解决一个问题时用的方法),从工具箱里拽一个linkbutton出来,在它的属性中把Text属性设为空(也就是让运行的时候看不见),然后双击这个linkbutton(也就是增加它的事件关联),你可以在创建好的事件里面写你要往数据库中添加的数据

接受提交过来的数据要这样写Request.Form["Class"].ToString()

接下来是最主要的部分了,在页面中添加

<script language="javascript">

function AddNew()

{

__doPostBack('AddNew','');

}

</script>

然后把datagridfoot里含有按钮的那列的footertext属性改成下面这样

footertext="<input type=button value='增加' onclick='javascript:return AddNew();'>"

这样就可以实现datagrid带增加新数据的功能了

 1.2.4. DataGrid的数据编辑功能

更新数据库在 Web 应用程序中可能经常很棘手。针对这种情况,DataGrid 控件提供了一些使更新更容易的内置支持。为了允许对行进行编辑,DataGrid 支持整型 EditItemIndex 属性,该属性指示网格的哪一行应该是可编辑的。设置了该属性后,DataGrid 按该索引将行呈现为文本输入框,而不是简单的标签。值 -1(默认值)指示没有行是可编辑的。页可以在服务器端窗体中包含 DataGrid,并通过 DataGrid 的对象模型获取对编辑数据的访问。

<asp:datagrid id="dg1"

runat="server"

AllowSorting="True"

AutoGenerateColumns="False"

AllowPaging="True"

PageSize="2"

OnPageIndexChanged="dg1_PageIndexChanged"

ShowFooter="True"

ShowHeader="true"

DataKeyField="id">

 

<asp:EditCommandColumn ButtonType="LinkButton" HeaderText="操作" UpdateText="确定" CancelText="取消" EditText="编辑"

footertext="<input type=button value='增加' onclick='javascript:return append();'>">

</asp:EditCommandColumn>

首先要设置DataGrid中事件属性,可以通过属性栏来设置,也可以直接在以上的DataGrid中添加OnEditCommand=””等方式来绑定事件。

DataGrid 标记本身上,将事件处理程序连到从 EditCommandColumn 激发的每个命令。这些处理程序的 DataGridCommandEventArgs 参数使您得以直接访问由用来设置 DataGrid EditItemIndex 的客户端选择的索引。注意,需要重新绑定 DataGrid 以使更改生效

代码如下:

编辑后将调用的方法


private void dg1_EditCommand_1(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)

         
{

              Response.Write(
"Edit");

              
this.dg1.EditItemIndex  = (int)e.Item.ItemIndex;

              Sort_Bind();

 

         }

         取消后将调用的方法


       private void dg1_CancelCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)

         
{

              Response.Write(
"Cancel");

              
this.dg1.EditItemIndex = -1;

              
this.Sort_Bind();

 

         }

确定后将调用的方法


      private void dg1_UpdateCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)

         
{

              Response.Write(
"update");

         

              
string id = this.dg1.DataKeys[(int)e.Item.ItemIndex].ToString();

            
string code = ((TextBox)e.Item.Cells[0].Controls[0]).Text;

              
string name = ((TextBox)e.Item.Cells[1].Controls[0]).Text;

              
string sql ="update  notice_important set code='"+code+"',name='"+name+"' where id='"+id+"'";

              SqlHelper.ExecuteNonQuery(GetConnectionStr(),CommandType.Text,sql);

              
this.dg1.EditItemIndex = -1;

              
this.Sort_Bind();

 

         }


 

1.2.5 排序

概述

Datagrid的数据排序功能,Datagrid本身并不能实现,它只是一个展现数据的HtmlTable,没有对数据查询进行操作功能,,我们可以对Datagrid的数据源,即DataView数据视图对象进行操作来实现我们的排序功能。

应用(sample代码)

a.       DatagridAllowSorting 属性要设为true
<asp:datagrid id="dg1" runat="server" AllowSorting="True"> …</asp:datagrid>

b.       <Column>…</Column>中的各种列中要指SortExpression的属性值,即排序的字段。
<asp:BoundColumn DataField="code" SortExpression="code" HeaderText="code" >

c.       Datagrid添加OnSortCommand事件调用的方法,并在方法中添加处理代码。

protected void dg1_SortCommand(object source, System.Web.UI.WebControls.DataGridSortCommandEventArgs e)

         
{

              
string strSortExpression = e.SortExpression.ToString();

              
string strSortDirection = "ASC";

              
if(strSortExpression == this.dg1.Attributes["SortExpression"])

              
{

                   strSortDirection 
= (this.dg1.Attributes["SortDirection"].ToString() == strSortDirection?"DESC":"ASC");

              }


              
this.dg1.Attributes["SortExpression"= strSortExpression;

              
this.dg1.Attributes["SortDirection"= strSortDirection;

              
this.Sort_Bind();

     }


         
private void Sort_Bind()

         
{

              
string sql = "select  id,code,name  from notice ";

              DataView dv 
= new DataView();

 

              dv 
= SqlHelper.ExecuteDataset(GetConnectionStr(),CommandType.Text,sql).Tables[0].DefaultView;

              dv.Sort 
= this.dg1.Attributes["SortExpression"]+ " " +this.dg1.Attributes["SortDirection"];    //或者dv.Sort = “code asc”

              

              
this.dg1.DataSource = dv;

              
this.dg1.DataBind();

 

         }

 

1.2.6 DataGrid的多选(CheckBox)/单选(radio)

对于多选我们会想到在DataGrid<templatecolumn>中绑定<asp:check..>控件来实现,并通过对每一行进行遍历判断其是否checked。单选如何实现呢?首先要实现单选,其控件的name必须相同,如果DataGrid<templatecolumn>中绑定,其控件的name是不同的,当然也达不到单选择效果。为此我们可以在DataGrid<templatecolumn>中绑定一个labelLiteral,在DataGridItemDataBound事件中,添上如下代码:

Label1 .Text = "<input type=radio name='rd' value=" & e.Item.Cells(0).Text & ">"

Literal1 .Text = "<input type=radio name='rd' value=" & e.Item.Cells(0).Text & ">"

确定被选中的check

foreach(DataGridItem item in this.dg1.Items)

{        
         
string str=string.empty;

         
if(((System.Web.UI.WebControls.RadioButton)item.FindControl("rb")).Checked)

                   
{

                       str 
+= item.Cells[2].Text;

                   }


         Response.write(str);

}

 1.2.7 简单的分页

这里讲DataGrid本身只带的分页功能,在博客园上看到有些网友做了一些包含分页、排序的DG控件,真的要感谢这些人的努力,不像我还在写这些全国人民都知道的东西,其实写这些也是以便以后要用时,可以很方便地拿来用,对于一些细节,作为一个软件开发人员,至少本人真的很容易遗忘。
a. AllowPaging="True" OnPageIndexChanged="dg1_PageIndexChanged" PageSize="5"
b. <PagerStyle BackColor="Blue" ForeColor="#ffffff" Mode="NextPrev"></PagerStyle>
Mode:
NextPrev :代表用”>”"<"等上一页、下一页来导航
NumericPages:代表用数字来导航
c.添加PageIndexChanged事件

        protected void dg1_PageIndexChanged(object source, System.Web.UI.WebControls.DataGridPageChangedEventArgs e)
        
{
            
this.dg1.CurrentPageIndex = e.NewPageIndex;
            Sort_Bind();

        }

posted @ 2005-07-12 21:46 Joffre 阅读(663) | 评论 (1)编辑



这几天,就这个问题快把我给搞死了,刚才对系统中的可用端口数设置到了65534个,默认为5000,对于这种方法成功与否还有待进一步观察。

配置方法:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services:\Tcpip\Parameters

MaxUserPort REG_DWORD 5000-65534(十进制)(默认值0x1388--十进制为5000)

不知哪位兄弟有没有较好的解决方法?在此谢谢先。


环境:
1. 负载均衡 四台Web Server
2. State Server模式存储状态Session, 单独一台服务器用作State Server.
3. Web Server 与 State Sever网络相通,且State Server中的asp.net state service保证启动。

posted @ 2005-07-11 22:53 Joffre 阅读(1638) | 评论 (12)编辑

今天在写一个VB.net程序时,竟然忘了VB.net的转义双引号,一个劲地用\"来表示,可就是出错!因习惯写C#代码了,后来终于搞清楚了,在vb.net中原来是用两个双引号表示""。现在只贴出这些,以后再补吧!

C#

转义符     字符名
 
\'    单引号
 
\"   双引号
 
\\  反斜杠
 
\0  空字符
 
\a  感叹号
 
\b   退格
 
\f  换页
 
\n  新行
 
\r  回车
 
\t   水平 tab
 
\v     垂直tab

--------------

VB.net
转义符     字符名
""  :           "
posted @ 2005-07-06 12:31 Joffre 阅读(2333) | 评论 (0)编辑