WEB开发技术

重新排序文本文件(txt)里面的内容

longmei阅读(54)

近段时间,Insus.NET学习练习物件与对象,怎样创建实际环境中的对象。对读取文本文件以及分析文本文件作为目标。因此搜索论坛一些例子,就如下面这题,实现的方法分享给大家。

 

 以文本行作为一个对象,所以我们可以写一个以[Computer]为对象的类,先判断是否为空(#72),#73,#74两行,以空格为分隔符,把一句分成两节。

再创建一个集合处理的类别:

现在我们可以处理文本文件了,根据条件,输出:

网页运行效果:

为支持ASP.NET5跨平台,Jexus再添新举措

longmei阅读(58)

      Jexus作为一款运行于Linux/FreeBSD平台上,以支持ASP.NET著称的高性能HTTP服务器和反向代理服务器,继5.6版完成对OWIN标准应用的支持后,就把着力点放到了对ASP.NET5的支持。

      但是,由于ASP.NET5与之前的ASP.NET相比,不管是从运行环境还是部署方式都发生了革命性的变化,Jexus很难像“前ASP.NET时代”那样,把ASP.NET5轻易地纳入其工作进程内直接运行。

      支持ASP.NET5,摆在Jexus面前有多种待选方案,比如利用OWIN协议针对ASP.NET5开发专用的适配器,或者利用Jexus的反向代理功能,等等等等,但反复权衡之后,Jexus 5.8.1版选择了一条更加直捷且现实可行的方案:使用一种类似于“端口转发”的新功能,把网站端口与应用程序宿主端口“桥接”起来。

      之所以选择这个方案,是因为其它方案目前的局限性都比较大:

      1,OWIN方案。由于mono与.NET Core是完全不同的两个运行平台,本质上有很大的不同,为在Jexus进程内运行的OWIN适配器的开发工作造成了极大的困难,而且ASP.NET5还在发展中,架构方面、API方面都有相当的不确定性;

      2,反向代理方案。Jexus支持反向代理并且可以利用它做负载均衡,但是,反向代理由于需要对外部用户发过来的请求包和工作服务器发回来的响应包进行不同程度的解析和重组,必然会消耗一定的计算资源。而且,反向代理对于WebSocket等技术的支持也有很大的难度和更大的性能消耗;

      3,基于.NET Core重新改写Jexus。这个方案明显不现实:原因之一,Jexus必须继续支持已经在生产环境中被广泛使用的“前ASP.NET”,如果基于core改写,就会出现与“前ASP.NET”兼容性问题甚至出现“断代”风险,这绝不是Jexus用户愿意看到的事;原因之二,Jexus已经是一个开发了多年的成熟的WEB服务器,重写Jexus绝不是一个简单的事情,需要花费相当长的时间和非常大的精力。

      端口“转发”有着类式端口“桥接”的直接效果,它既避免OWIN方案的开发难度,也避免了反向代理方案在性能方面的耗损和应用层交互协议的局限性。而且更重要的是,这个方案在支持微软为ASP.NET5量身打造的Kestrel这个宿主服务器的同时,也支持其它的花样繁多的自宿主应用,把Tomcat、node.js的服务让Jeuxs整合起来对外统一用80端口提供服务,也完全是可行的。

      Jexus 5.8.1 BETA1已经发布,感兴趣的朋友可以到 http://www.linuxdot.net/ 去下载。

      ASP.NET跨平台技术QQ群:102732979。

 

关于遗留代码的测试

longmei阅读(20)

    在大多时候代码的测试很难,因为很多代码无法进行参数注入,那么这个时候有一款不受限的隔离框架TypeMock供你使用,不过遗憾这款软件是付费的一个隔离框架,有15天的免费使用权,如果能解决你现有的问题我想这份费用并不能算多。TypeMock的官方下载http://www.typemock.com/。下面开始看看TypeMock是怎么样使用的。

1:伪造一个静态的方法来看一个例子

被测试的静态方法

public static int DoSomethingSpecialOnALeapYear()
        {
            if ((DateTime.Now.Month == 3) && (DateTime.Now.Day == 29))
                return 100;
            return 0;
        }

DoSomethingSpecialOnALeapYear

测试方法

1 [TestMethod, Isolated]
2         public void FakingDateTime()
3         {
4             Isolate.WhenCalled(() => DateTime.Now).WillReturn(new DateTime(2016, 3, 29));//当调用当前时间的时候会返回指定的时间
5             int result = MyStatic.DoSomethingSpecialOnALeapYear();
6             Assert.AreEqual(100, result);
7         }

FakingDateTime

2:伪造一个sealed的类

被测试的静态方法

 1 public static bool SignedIn { get; set; }
 2 
 3         public static bool SignOut(HttpContext current)
 4         {
 5             if (SignedIn)
 6             {
 7                 HttpSessionState session = current.Session;
 8                 session.Abandon();
 9                 return true;
10             }
11             return false;
12         }

SignOut

如果我们要保证上面的方法能不在依赖HttpContext 那么我们必须要注入这个依赖我们看测试代码

1 [TestMethod, Isolated]
2         public void FakingHttpContext()
3         {
4             var fakeHttp = Isolate.Fake.Instance<HttpContext>();//需要注入的伪对象
5             MyStatic.SignedIn = true;
6             var result = MyStatic.SignOut(fakeHttp);
7             Assert.AreEqual(true, result);
8         }

FakingHttpContext

3:重写伪造类中的方法

如果一些类现在要按照我们的需要来返回相应的值我们来看看下面这个例子

1 public static bool IsMySiteNameTypemock(Process process)
2         {
3             var name = process.MachineName;
4             if (process.MainModule.Site.Name.StartsWith("Typemock"))
5                 return true;
6             else
7                 return false;
8         }

IsMySiteNameTypemock

为了上面的程序正常工作那么我们必须需要通过site.Name以Typemock开始所以在测试中我们必须这么做

1 [TestMethod, Isolated]
2         public void SetBehaviorOnChainExample()
3         {
4             var fake = Isolate.Fake.Instance<Process>();
5             Isolate.WhenCalled(() => fake.MainModule.Site.Name).WillReturn("Typemock rocks");//设置Site.Name
6             var result = MyStatic.IsMySiteNameTypemock(fake);
7             Assert.AreEqual(true, result);
8         }

SetBehaviorOnChainExample

现在我们来运行测试一下看看结果

4:跳过某一个异常的方法

如果在一个方法体中要先执行一个方法(一个依赖项)然后在执行后面的代码下面我们在来看这个例子

1 public class Dependency//一个依赖项
2     {
3         public virtual void CheckSecurity(string name, string password)
4         {
5             throw new SecurityException();
6         }
7     }

Dependency

1 public int Calculate(int a, int b, Dependency dependency)
2         {
3             dependency.CheckSecurity("typemock", "rules");
4             return a + b;
5         }

Calculate

然后我们进行需要跳过CheckSecurity这个会报异常的方法来看看例子

1 [TestMethod, Isolated]
2         public void FakeMethod_OnLiveObject() {
3             var dependency = new Dependency();
4             Isolate.WhenCalled(() => dependency.CheckSecurity(null, null)).IgnoreCall();//不去管这个方法的调用
5             var classUnderTest = new ClassUnderTest();
6             var result = classUnderTest.Calculate(1, 2, dependency);
7             Assert.AreEqual(3, result);
8         }

FakeMethod_OnLiveObject

5:在未来某个方法体中创建伪对象

比喻在一个放法A中我们会依赖一个B类那么这个在内部实例化的那么我们该怎么办呢。看下面这个例子

这个外部的依赖项依然是上面的Dependency。

现在我们来修改Calculate这个方法体如下

1 public static int Calculate(int a, int b) {
2             var dependency = new Dependency();
3             dependency.CheckSecurity("typemock", "rules");
4             return a + b;
5         }

Calculate

我们在Calculator中直接去实例化Dependency这个对象了。

那么我们来看看怎么去注入这个伪对象

1     [TestMethod, Isolated]
2         public void FakeConstructor() {
3             var fakeHandle = Isolate.Fake.NextInstance<Dependency>();//不需要注入在未来进行创建的伪对象
4             var result = ClassUnderTest.Calculate(1, 2);
5             Assert.AreEqual(3, result);
6         }

FakeConstructor

我们采用了NextInstance这个表示在未来的某个方法体中去创建这个伪对象。ok我们来看下测试的效果

上面就简单介绍了一个typemock的基本用法。

 

大家说说看针对微信的这个限制,如何吐槽????

longmei阅读(34)

今天早上一打开前段时间开发的微信后台,结果出现了“customer block”错误,我去,上周五还没有出现这个问题,结果一查,腾讯又做限制了….微信一而再再而三的做各种限制,平台的功能限制不断的增加,我们只有苦逼的改来改去,现在这个限制出来,我是真心不好搞了,只能放弃微信了。我觉得,一个好的平台必定需要我们这些开发者,但是,微信的这个平台显然在走向一个牢笼,将我们这些开发者封死在里面,如何救赎???更新微信的平台的时候,是否考虑到我们这些开发者?如果你一开始就有这些限制就算了,哎,当初选择微信平台就是个错误……

ASP.NET Aries 4.0 开源发布:已完成基础功能优化重写

longmei阅读(55)

主要更新:

1:增加AR.Global.GetUser() 方法返回当前登陆者的用户信息。

2:重写AR.Combobox 支持下拉树。

3:调整及扩展Input下拉的配置参数。

4:优化及新增AR.Combobox相关的方法。

5:重写层级表头的配置及算法。

6:扩展下拉数据的参数。

7:重写Excel导入模块。

8:重写Excel导出相关。

9:部分参数简化和名称调整。

从旧版本升级的注意事项:

1:Config_Excel表字段变更:新增(WhereType、AcceptType)两字段,去掉(IsUniqueOr)字段。

升级方式:删除表(重新用脚本执行即可)

2:Config相关的html名称已变更

升级方式:修改菜单指向的路径。

3:Config_KeyValue(配置维护表) 新增配置项(异或(对应WhereType)、导入方式(对应AcceptType))。

升级方式:数据不多,手工添加,或找到脚本执行。

4:Config_Grid 系统的配置表头修改:

升级方式:重新数据脚本,或忽略系统配置(根据自己情况在配置表头手工调整配置)。

开源地址:

GitHub:https://github.com/cyq1162/Aries

Demo演示:http://aries.cyqdata.com/login.html

升级功能的详细介绍:

1:获取当前登陆用户信息

后台的获取用户信息,可以通过:UserAuth这个静态类或取;

前端的获取用户信息,除了Cookie的User拿到用户名,没有其它方式,所以追加了一个获取的方法:AR.Global.GetUser(callback);

下面说说使用:

第一次调用(index.html已调用)需要传递回调函数:

 <script>
        AR.Global.GetUser(function (data) {
            $("#lbUserName").html('' + data.fullname + '');
        });
    </script>

后续调用则不需要回调(直接递归到index.html去拿数据):

var user=AR.Global.GetUser();

下面补充下思考过程的知识:

之前一直在思考,前端怎么即给出简单的调用方式,又能最大力度的兼顾性能和实时性。

想过放在Cookie、或后端缓存、或前端时时请求,最后都被精神洁癖给否了,直到上面的解决方案被想出来,才满意的动手实现了。

2:AR.Combobox及Input配置:

1:Input配置:(统一了Combobox和Combotree配置)

树型下拉,只需要多一个tree属性,效果如下图:

2:AR.Combobox.setParas方法:

对于下拉数据,想加过滤条件:

可以通过在html中:

AR.Combobox.setParas({C_SYS_Deparment:”参数值”});

参数会被带到后台,并进行条件替换。

3:被修改defaultWhere参数:

如果通过dg.addWhere方法添加默认参数的,则不受影响,如果是通过:

dg.options.defaultWhere=[{paramName:”abc”,paramPattern:”=”,paramValue:1}] 方式指定的,则简化参数为:

dg.options.defaultWhere=[{name:”abc”,pattern:”=”,value:1}] 

4:简化的层级表头配置:

如图,对于以下复杂的表头,现在只需要指定表头跨几个列即可:

相关的表头配置[层级表头字段以mg_开头](旧版本的配置比较复杂,就不介绍了):

配置方式:新增字段(mg_开头),设置好序号和跨列数。

5:导出:带多级表头:

 

6:导入:模板及导入的错误验证功能

1:下载的模板带有效性数据验证:

Sheet2存档下拉数据:

3:Excel导入时的错误提示:

返回下载的Excel列表上的错误信息:(错误字段及错误信息会被标红)

 

总结:

最近,几乎把所有的时间都花在了Aries框架的优化重写上;

经过无数个熬夜,Aries框架的所有前端后端功能总算全部落实了;

框架在性能、安全、使用性、可扩展性等全面落实,总算做到前无古人,后等来者的份上了;

最后,在这深深的夜里,该入眠了~~~~

顺带标记一下,流行语:

 

 

实战CENTOS6.5安装docker并创建asp.net mvc 5 镜像,运行MVC 网站

longmei阅读(10)

 

Docker,容器,让研发、测试、生产同一环境,可在linux平台上混合使用JAVA与net 程序

 

Centos6.5安装docker 参考http://my.oschina.net/kcw/blog/355612

 

rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

rpm –import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6

yum -y install docker-io

service docker start

chkconfig docker on

 

 

安装asp.net mvc5镜像请参考http://dockerone.com/article/164

但是这个教程做出来的镜像只能跑个小DEMO,用MVC代码则会报引用错误,应该要参考其中提到的https://registry.hub.docker.com/u/microsoft/aspnet/

结合二者最终的Dockerfile如下

 

FROM mono:3.10

 

ENV KRE_VERSION 1.0.0-beta2

ENV KRE_USER_HOME /opt/kre

 

RUN apt-get -qq update && apt-get -qqy install unzip

 

RUN curl -sSL https://raw.githubusercontent.com/aspnet/Home/v$KRE_VERSION/kvminstall.sh | sh

RUN bash -c “source $KRE_USER_HOME/kvm/kvm.sh \

&& kvm install $KRE_VERSION -a default \

&& kvm alias default | xargs -i ln -s $KRE_USER_HOME/packages/{} $KRE_USER_HOME/packages/default”

 

# Install libuv for Kestrel from source code (binary is not in wheezy and one in jessie is still too old)

RUN apt-get -qqy install \

autoconf \

automake \

build-essential \

libtool

RUN LIBUV_VERSION=1.0.0-rc2 \

&& curl -sSL https://github.com/joyent/libuv/archive/v${LIBUV_VERSION}.tar.gz | tar zxfv – -C /usr/local/src \

&& cd /usr/local/src/libuv-$LIBUV_VERSION \

&& sh autogen.sh && ./configure && make && make install \

&& rm -rf /usr/local/src/libuv-$LIBUV_VERSION \

&& ldconfig

 

ENV PATH $PATH:$KRE_USER_HOME/packages/default/bin

 

COPY . /app

WORKDIR /app

RUN [“kpm”, “restore”]

 

EXPOSE 5004

ENTRYPOINT [“k”, “kestrel”]

 

 

 

以下生成镜像并启动

 

docker build -t mvc .

docker run -t -d  -p 80:5004 mvc

 

 

其它相关命令

docker ps

docker stop

docker images

docker rmi

 

 

所需要的DEMO代码在

https://github.com/aspnet/Home/

 

 

执行效果图

 

 

初见,Devexpress

longmei阅读(14)

绥江一百http://www.sj100.net                                                  欢迎,进入绥江一百感谢点击[我的小网站,请大家多多指教相互共勉]

1.连接数据库

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Web;
 4 using System.Data.OleDb;
 5 
 6 namespace myBPB
 7 {
 8     public class myDB
 9     {
10       OleDbConnection conn = null;
11       public OleDbConnection getConn()
12         {
13             string sServer = "192.168.132.10";
14             string sDatabase = "myBPB";
15             string sUser = "sa";
16             string sPassword = "12345678";
17             //Provider=SQLOLEDB; 指的是连接数据库所用的相关数据库驱动
18             //Data Source; 指的是服务器地址或服务器名称
19             //Persist Security Info; 指的是是否保存安全信息,其实可以简单的理解为"在数据库连接成功后是否保存密码信息",True表示保存,False表示不保存            
20             //Initial Catalog; 指的是要连接的数据库名称
21             //User ID; 登录数据库的名称
22             //Password; 登录数据库的密码
23             String sSQL = String.Format("Provider=SQLOLEDB;Data Source={0};" +"Persist Security Info=True;User ID={2};" +"Initial Catalog={1};Password={3};",sServer, sDatabase, sUser, sPassword);//数据库连接语句
24             try
25             {
26                 conn = new OleDbConnection(sSQL);
27                 conn.Open();
28                 return conn;
29             }
30             catch (System.Exception ex)
31             {
32                 return null;
33             }
34         }
35     }
36 }

连接数据库

2.填充ASPxGridView

 1 public void BindGridView()
 2         {
 3             OleDbConnection conn = new myDB().getConn();
 4             string str = "select * from 区域";
 5             OleDbDataAdapter da = new OleDbDataAdapter(str, conn);
 6             DataSet ds = new DataSet();
 7             da.Fill(ds);
 8             this.ASPxGridView1.DataSource = ds.Tables[0].DefaultView;
 9             this.ASPxGridView1.DataBind();
10             conn.Close();
11         }

填充ASPxGridView

3.布局

控件:ASPxSplitter(分离器)

作用:布局时多用于分割页面

属性:Orientation(方向)= Vertical(垂直)或 Herizontal(水平)

        ASPxSplitter1.Panes[0].PaneStyle.Paddings.Padding = 0;         //第一个面板的内边距为0

        ASPxSplitter1.Panes[1].PaneStyle.Paddings.Padding = 0;         //第二个面板的内边距为0

        ASPxSplitter1.Panes[0].Size = 63;                                        //第一个面板的高度(大小)为63

        ASPxSplitter1.Panes[1].ScrollBars = ScrollBars.Auto;              //自动出现滚动条 

        ASPxSplitter1.AllowResize = false;                                       //不允许调整ASPxSplitter1

        ASPxSplitter1.FullscreenMode = true;                                   //全屏模式为true



控件:ASPxMenu1(菜单)

作用:制作菜单

属性:width(宽度)=100%

        Items(菜单的选项)

        ItemAutoWidth(菜单选项宽度自动调整)=True(真)或False(假)

        AutoSeparators=”RootOnly”(菜单选项之间用竖线隔开)

        ClientInstanceName=”ASPxMenu1″(控件的前端名称)



控件:表格

作用:排版

属性:Style—>表格—>table-layout=fixed(表格宽度为固定值)



控件:ASPxImage

作用:显示图标、图片

属性:ASPxImage1.ImageUrl = “~/Images/man.gif”;



控件:ASPxGridView

作用:显示数据

属性:ASPxGridView1.Width = 2000;

        ASPxGridView1.SettingsBehavior.AllowFocusedRow = true;//每行都可以选择

        Columns(列)— Caption(显示名称)— FieldName(数据库连接字段)

        AutoGenerateColumns=”False”//数据源自动绑定为假

        KeyFieldName=”bh”//关键字为bh

        ClientInstanceName=”ASPxGridView1″(控件的前端名称)

前端运用:

1.在每行前面添加一个ASPxCheckBox

 1         <dx:ASPxGridView ID="ASPxGridView1" runat="server">
 2            <Columns>
 3 
 4              <dx:GridViewCommandColumn Caption="操作" ShowSelectCheckbox="true" VisibleIndex="0" Width="20px">
 5              <HeaderTemplate>
 6              <dx:ASPxCheckBox ID="ASPxCheckBox1" runat="server" ToolTip="Select/Unselect all rows on the page"
 7              ClientSideEvents-CheckedChanged="function(s, e) { ASPxGridView1.SelectAllRowsOnPage(s.GetChecked()); }" />
 8              </HeaderTemplate>
 9              </dx:GridViewCommandColumn>
10 
11            </Columns>
12         </dx:ASPxGridView>

自动添加ASPxCheck.xml

2.在第一列显示行号

 1         <dx:ASPxGridView ID="ASPxGridView1" runat="server">
 2            <Columns>
 3 
 4               <dx:GridViewDataTextColumn Caption="序号" FieldName="XH" UnboundType="Integer" VisibleIndex="0"Width="36px">
 5               <Settings AutoFilterCondition="Contains" />
 6               <CellStyle HorizontalAlign="Center">
 7               </CellStyle>
 8               </dx:GridViewDataTextColumn>
 9 
10            </Columns>
11         </dx:ASPxGridView>

自动添加行号.xml

1         protected void ASPxGridView1_CustomUnboundColumnData(object sender, DevExpress.Web.ASPxGridView.ASPxGridViewColumnDataEventArgs e)
2         {
3             if (e.Column.FieldName == "XH" && e.IsGetData)
4                 e.Value = (e.ListSourceRowIndex + 1).ToString();
5         }

自动添加行号.后台

3.将Columns分组

 1             <dx:GridViewBandColumn Caption="使用于">
 2                     <Columns>
 3                               <dx:GridViewDataTextColumn Caption="部门" FieldName="部门" 
 4                                    ShowInCustomizationForm="True" VisibleIndex="9" Width="150px">
 5                                    <Settings AutoFilterCondition="Contains" />
 6                                </dx:GridViewDataTextColumn>
 7                                <dx:GridViewDataTextColumn Caption="何工序或何设备" FieldName="何工序或何设备" 
 8                                    ShowInCustomizationForm="True" VisibleIndex="11" Width="200px">
 9                                    <Settings AutoFilterCondition="Contains" />
10                                </dx:GridViewDataTextColumn>
11                     </Columns>
12             </dx:GridViewBandColumn>

Columns.xml

4.ASPxComboBox配置数据源

1 <asp:SqlDataSource ID="SqlDataSource1_BuMen" runat="server" 
2             ConnectionString="<%$ ConnectionStrings:ConnectionString %>" 
3             ProviderName="<%$ ConnectionStrings:ConnectionString.ProviderName %>" 
4             SelectCommand="SELECT DISTINCT [部门名称], [部门编码] FROM [部门设置]"></asp:SqlDataSource>

数据源—部门.xml

 1 <dx:ASPxComboBox ID="Com_BuMen" runat="server" 
 2                                     DataSourceID="SqlDataSource1_BuMen" ValueField="部门编码" DropDownStyle="DropDownList" 
 3                                     ValueType="System.String" TextFormatString="{1}" EnableCallbackMode="true" 
 4                                     IncrementalFilteringMode="Contains" TextField="部门编码" 
 5                                     ClientInstanceName="Com_BuMen" >
 6                                     <Columns>
 7                                     <dx:ListBoxColumn FieldName="部门编码" Width="45px" />
 8                                     <dx:ListBoxColumn FieldName="部门名称" Width="100%" />
 9                                     </Columns>
10                                 </dx:ASPxComboBox>

部门文本框.前台

5.增加

 1 public void Add()
 2 {
 3     String str_add= "insert into 区域(区域号,区域,备注) values('" + QuYuHao + "','" + QuYu + "','" + BeiZhu + "')";
 4     OleDbConnection conn = new myDB().getConn();
 5     OleDbCommand com = new OleDbCommand(str_add, conn);
 6     if(Convert.ToInt32(com.ExecuteNonQuery())>0)
 7     {
 8       Page.ClientScript.RegisterClientScriptBlock(typeof(QuYuEdit), "CustomEdit", "alert('添加成功!!');", true);
 9     }
10     else
11     {
12      Page.ClientScript.RegisterClientScriptBlock(typeof(QuYuEdit), "CustomEdit", "alert('添加失败!!');", true);
13     }
14      conn.Close();
15 }

增加.后台

6.删除

 1 public void Del()
 2         {
 3             String str_Del = "delete from 区域 where bh=" + 3;
 4             OleDbConnection conn = new myDB().getConn();
 5             OleDbCommand com = new OleDbCommand(str_Del, conn);
 6             int counts = com.ExecuteNonQuery();
 7             if (counts > 0)
 8             {
 9                 Page.ClientScript.RegisterClientScriptBlock(typeof(WuLiaoBianMa), "CustomEdit", "alert('删除成功!');", true);
10             }
11             else
12             {
13                 Page.ClientScript.RegisterClientScriptBlock(typeof(WuLiaoBianMa), "CustomEdit", "alert('删除失败!');", true);
14             }
15             conn.Close();
16         }

删除.后台

7.修改

 1 public void Update()
 2         {
 3             String str_Update = "update 区域 set 区域号='" + QuYuHao + "',区域='" + QuYu + "',备注='" + BeiZhu + "' where bh=" + Convert.ToInt32(ASPxHiddenField1.Get("SBH1"));
 4             OleDbConnection conn = new myDB().getConn();
 5             OleDbCommand com = new OleDbCommand(str_Del, conn);
 6             int counts = com.ExecuteNonQuery();
 7             if (counts > 0)
 8             {
 9                 Page.ClientScript.RegisterClientScriptBlock(typeof(WuLiaoBianMa), "CustomEdit", "alert('修改成功!');", true);
10             }
11             else
12             {
13                 Page.ClientScript.RegisterClientScriptBlock(typeof(WuLiaoBianMa), "CustomEdit", "alert('修改失败!');", true);
14             }
15             conn.Close();
16         }

修改.后台

8.查询

 1 public String Old_Name()
 2         {
 3             OleDbConnection conn = new myDB().getConn();
 4             string str = "select * from 物料编码 where bh='" + Convert.ToInt32(ASPxHiddenField1.Get("sBH")) + "'";
 5             OleDbDataAdapter da = new OleDbDataAdapter(str, conn);
 6             DataSet ds = new DataSet();
 7             da.Fill(ds);
 8             String m = ds.Tables[0].Rows[0]["物料编码"].ToString();
 9             return m;
10         }

查询(DataAdapter、DataSet).后台

 1 public void Lei_Xing()
 2         {
 3             OleDbConnection conn = new myDB().getConn();
 4             string str = "select * from 基础数据 where 目录='供应商类型'";
 5             OleDbCommand com = new OleDbCommand(str, conn);
 6             OleDbDataReader read = com.ExecuteReader();
 7             while (read.Read())
 8             {
 9                 Txt_LeiXing.Items.Add(read["内容"].ToString());
10             }
11         }

查询后台(DataReader).后台

9.ASPxGridView中勾选ASPxCheckBox删除数据

 1 List<object> keyValues = this.ASPxGridView1.GetSelectedFieldValues("bh");  //需要在ASPxGridView1的源设置 KeyFieldName="bh"
 2 ASPxGridView1.Selection.UnselectAll();   //清空ASPxGridView中所有选择的语句。
 3 int count = keyValues.Count;
 4 if (str == "删除")
 5    {
 6      if (count <= 0)
 7        {
 8           Page.ClientScript.RegisterClientScriptBlock(typeof(WuLiaoBianMa), "CustomEdit", "alert('请选择要删除的数据!');", true);
 9           return;
10         }
11      foreach (object key in keyValues)
12         {
13           do_del(key.ToString()); //删除
14          }
15           keyValues.Clear();
16           count = keyValues.Count;
17           BindGridView();
18     }

ASPxGridView中勾选ASPxCheckBox删除数据

10.ASPxGridView过滤

后台:ASPxGridView1.Settings.ShowFilterRow = true;

前台:<Settings AutoFilterCondition="Contains" />//ASPxGridView属性—>Columns—>要实现过滤的列—>Settings—>AutoFilterCondition="Contains"

11.ASPxGridViewExporter导出

 1                 if (Directory.Exists(Server.MapPath("tmp")) == false)
 2                 {
 3                     Directory.CreateDirectory(Server.MapPath("tmp"));
 4                 }
 5                 string path = Server.MapPath("~/tmp/");//获取完整路径
 6                 ASPxGridViewExporter1.FileName = "物料编码";
 7                 ASPxGridViewExporter1.PageHeader.Font.Size = 14;
 8                 string message1 = @"物料编码";
 9                 ASPxGridViewExporter1.PageHeader.Center = message1;
10                 this.ASPxGridViewExporter1.WriteXlsToResponse();

ASPxGridViewExporter导出.后台

12.ASPxHiddenField隐藏字段

设置前台名称:ClientInstanceName="hf1";
后台赋初值:ASPxHiddenField1.Add("SBH",0);
前台赋值:hf1.Set('sBH', ASPxGridView1.GetRowKey(ASPxGridView1.GetFocusedRowIndex())); //给隐藏字段赋值为ASPxGridView1当前被选中行的bh值
后台取值:ASPxHiddenField1.Get("sBH");
前台取值:hf1.Get('sBH')

13.ASPxPopupControl自定义约会表单

设置前台名称:ClientInstanceName="ASPxPopupControl1";
前台显示ASPxPopupControl自定义表单:ASPxPopupControl1.Show();
前台隐藏ASPxPopupControl自定义表单:ASPxPopupControl1.Hid();

14.ASPxUploadControl上传、导入实例(导入)

点击导入按钮,弹出下图的自定义约会表单,将选择的文件上传至固定的地址并导入ASPxGridView中

导入对话框

 1 1.前台弹出表单:ASPxPopupControl1.Show();
 2 
 3 2.上传文件到指定的地址:
 4   String ExcelFileName = "";
 5   protected voidASPxUploadControl1_FileUploadComplete(objectsender,DevExpress.Web.ASPxUploadControl.
 6   FileUploadCompleteEventArgs e)
 7    {
 8             if (Directory.Exists(Server.MapPath("tmp")) == false)
 9             {
10                 Directory.CreateDirectory(Server.MapPath("tmp"));
11             }
12             if (e.IsValid)
13             {
14                 ASPxUploadControl1.PostedFile.SaveAs(Server.MapPath("~/tmp/")+ ASPxUploadControl1.PostedFile.FileName);
15                 ExcelFileName = ASPxUploadControl1.PostedFile.FileName;
16             } 
17    }
18 
19 3.导入ASPxGridView:
20   #region 从Table导出数据DaoRu()
21   public void DaoRu(ASPxGridView ASPxGridView1,String ExcelFileName)
22   {
23     try    //步骤一:先将用户选择的EXCEL文件上传至服务器端。
24     {
25            if (Directory.Exists(Server.MapPath("tmp")) == false)
26            {
27               Directory.CreateDirectory(Server.MapPath("tmp"));
28            }
29            string path = Server.MapPath("~/tmp/") + ExcelFileName;//获取完整路径              
30            GetOneSheet("Sheet", path, ASPxGridView1);
31 
32     }
33     catch
34     {
35        throw;
36      }
37   }
38 
39           //  步骤二:将上传的文件导入至DataSet
40   public static void GetOneSheet(string sheetname, string Path, ASPxGridView ASPxGridView1)
41   {
42             try
43             {
44               string connString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Path + ";Extended Properties=Excel 8.0;";
45               OleDbConnection con = new OleDbConnection(connString); //连接excel表
46               con.Open();
47               String strOutPutExcel = "select * from [" + sheetname + "$]";
48               OleDbDataAdapter ad = new OleDbDataAdapter(strOutPutExcel, con);
49               DataSet table = table = new DataSet();
50               ad.Fill(table,"table1");  //填充dataset
51               int count = table.Tables[0].Rows.Count;
52               OleDbConnection conn = new myDB().getConn();
53               OleDbCommand com = null;
54               for (int i = 4; i < count; i++)
55               {
56 
57                     String QuYuHao = table.Tables[0].Rows[i][1].ToString().Trim();  
58                     String LeiBeiHao = table.Tables[0].Rows[i][2].ToString().Trim();
59                     String str_insert = "INSERT INTO [物料编码] ( [区域号], [类别号]) VALUES ( ,  )";
60 
61                     OleDbParameter op1 = new OleDbParameter();
62                     OleDbParameter op2 = new OleDbParameter();
63                   
64                     op1.OleDbType = OleDbType.VarChar;
65                     op2.OleDbType = OleDbType.VarChar;
66                     op1.Value = QuYuHao.ToString();
67                     op2.Value = LeiBeiHao.ToString();
68                     com = new OleDbCommand(str_insert,conn);
69                     com.Parameters.Add(op1);
70                     com.Parameters.Add(op2);
71                     try
72                     {
73                         com.ExecuteNonQuery();
74                     }
75                     catch 
76                     {
77                         //Debug.WriteLine();
78                     }
79                     
80                 }
81                 con.Close();
82             }
83             catch
84             {
85                 throw;
86             }
87   }
88         #endregion
89 
90 4.确定按钮单击事件中调用DaoRu():
91 DaoRu(ASPxGridView1, ExcelFileName);
92 BindGridView();  //重新填充ASPxGridView

代码实现

 15.根据ASPxGridView值得变化,前端给控件赋值实例(修改)

 1 1.ClientInstanceName="ASPxGridView1"   //要赋值的前端控件也需设置前端名称
 2 2.判断是否选择了"修改"
 3 if (str == "修改")
 4 {
 5     Session.Add("Add_Or_Update", 1);
 6      Response.Redirect("~/WuLiaoBianMaEdit.aspx"); //转到下图的修改页面
 7 }
 8 
 9 3."修改"页面加载:
10  if (!IsPostBack)
11      {
12            if (Convert.ToInt32(Session["Add_Or_Update"]) == 1)
13                 {
14                     ASPxImage1.ImageUrl = "~/Images/m5.gif";
15                     ASPxRoundPanel1.HeaderText = "修改";
16                     ASPxHiddenField1.Add("sBH2", 1);
17                     ASPxHiddenField1.Add("sBH", 0);
18                 }
19 }
20 
21 4.ASPxGridView单击事件:           
22   <ClientSideEvents FocusedRowChanged="function(s, e) { OnGridFocusedRowChanged(); }" />   
23   <ClientSideEvents FocusedRowChanged="function(s, e) { OnGridFocusedRowChanged(); }"></ClientSideEvents>   
24   <%--ASPxGridView的单击事件--%>
25 
26 5.Javascript实现ASPxGridView单击事件:
27   <script language="javascript" type="text/javascript">
28     function OnGridFocusedRowChanged()
29     {
30         ASPxGridView1.GetRowValues(ASPxGridView1.GetFocusedRowIndex(), '区域号;类别号', OnGetRowValues); //前端访问控件
31     }
32     function OnGetRowValues(values) 
33     {      
34         hf1.Set('sBH', ASPxGridView1.GetRowKey(ASPxGridView1.GetFocusedRowIndex())); //给隐藏字段赋值
35         if (hf1.Get('sBH2') == 1) 
36         {
37             Com_QuYuHao.SetText(values[0]);
38             Com_LeiBieHao.SetText(values[1]);
39         }
40     }
41   </script>

代码实现

16.选择”区域号”,”类别号”后,点击”已用流水号”按钮,从数据库中读取数据加载到表单中,并弹出表单(防止刷屏问题)

 

 1 4.ClientInstanceName="grid2"
 2 2.写一个自定义函数,填充表单中的ASPxGridView:
 3    public void LiuShuiHao(String QuYuHao,String LeiBieHao)
 4         {
 5             String str_LiuShuiHao = "";
 6             if (QuYuHao != "" && LeiBieHao != "")
 7             {  
 8                str_LiuShuiHao = "select * from 物料编码 where 区域号='" + QuYuHao + "' and 类别号='" + LeiBieHao + "'";
 9             }
10             else if (QuYuHao != "")
11             {
12                 str_LiuShuiHao = "select * from 物料编码 where  区域号='" + QuYuHao + "'";
13             }
14             else if (LeiBieHao != "")
15             { 
16                 str_LiuShuiHao = "select * from 物料编码 where  类别号='" + LeiBieHao + "'";
17             }
18             if(str_LiuShuiHao!="")
19             {
20             OleDbConnection conn = new myDB().getConn();
21             OleDbDataAdapter da = new OleDbDataAdapter(str_LiuShuiHao, conn);
22             DataSet ds = new DataSet();
23             da.Fill(ds);
24             this.ASPxGridView2.DataSource = ds.Tables[0].DefaultView;
25             this.ASPxGridView2.DataBind();
26             conn.Close();            
27             }
28         }
29 
30 3.在页面的load中调用该方法:
31     if (Com_QuYuHao.Text != "" || Com_LeiBieHao.Text != "")
32       {
33                 LiuShuiHao(Com_QuYuHao.Text, Com_LeiBieHao.Text);
34       }
35 
36 4.按钮的前端Click事件:
37    ASPxPopupControl1.Show();
38    grid2.Refresh();
39    e.processOnServer = false;
40 
41 读取数据库防止—刷屏

读数据库—防止刷屏

 

 

 

 

 

 

 

 

 

 

SSL通信-忽略证书认证错误

longmei阅读(17)

.NET的SSL通信过程中,使用的证书可能存在各种问题,某种情况下可以忽略证书的错误继续访问。可以用下面的方式跳过服务器证书验证,完成正常通信。

1.设置回调属性ServicePointManager.ServerCertificateValidationCallback

  注:这个属性设置为要用于客户端的服务器证书的自定义验证方法

       True:认证成功; False:认证失败。

C#代码

1 ServicePointManager.ServerCertificateValidationCallback =
2           new RemoteCertificateValidationCallback(
3                    OnRemoteCertificateValidationCallback); 

 VB.NET代码

1 ServicePointManager.ServerCertificateValidationCallback = _
2           New RemoteCertificateValidationCallback( _
3                     AddressOf OnRemoteCertificateValidationCallback) 

2.把证书认证函数OnRemoteCertificateValidationCallback返回值True

C#代码

1 // 忽略证书认证错误处理的函数
2 private bool OnRemoteCertificateValidationCallback(
3   Object sender,
4   X509Certificate certificate,
5   X509Chain chain,
6   SslPolicyErrors sslPolicyErrors)
7 {
8   return true;  // 认证正常,没有错误
9 } 

VB.NET代码

' 忽略证书认证错误处理的函数
Private Function OnRemoteCertificateValidationCallback( _
  ByVal sender As Object, _
  ByVal certificate As X509Certificate, _
  ByVal chain As X509Chain, _
  ByVal sslPolicyErrors As SslPolicyErrors _
) As Boolean
  Return True  ' 认证正常,没有错误
End Function

 

RedisRepository封装—Redis发布订阅以及StackExchange.Redis中的使用

longmei阅读(4)

本文版权归博客园和作者本人吴双共同所有,转载请注明本Redis系列分享地址。http://www.cnblogs.com/tdws/tag/NoSql/

Redis Pub/Sub模式 基本介绍

Redis发布订阅—Pub/Sub模式或者说是观察者模式。我想大家即使没有使用过,也已经耳熟能详了。

先简单举例说明下应用场景,在场景中我们可以分析到其优势在哪。

比如你的线上应用应用,你想设置一个日志报警系统,当应用出现异常的时候,立马发送通知给你,可能是短信的形式,也可能是邮件的形式。当然如果只将报警通知给你一个人,实现起来很简单,在报警系统中将你的手机号和短信写死在程序中。但是如果你的项目庞大,每个模块有各自的负责人,并且负责人也经常会变更,那么咱们就不能总修改代码了吧?

或者说你的个人博客可以让读者订阅,读者这么多,咱们根本控制不过来呀。

现在发布订阅模式,就可以解决你的问题。在某一点发生改变的时候,其他客户端立即得到通知。也可以说订阅服务器得到应用发布消息,由服务器立即通知给你手中的客户端。这样的好处就是一种松耦合的模式,你不再需要修改发布端和订阅端的任何代码,你只要提供好发布和订阅的操作接口,今后调用就可以了。

首先看一下Redis在控制台中的发布订阅操作。

我开启两个redis命令客户端对相同的一个redis服务进行操作。

首先我们在第一个客户端我们对message01进行订阅,channel名称是我们自定义的,订阅哪个就是哪个。

其次,我们在第二个客户端对message01这个channel进行发布消息。返回值表示有几个客户端订阅。

发布消息后,订阅的客户端立即受收到消息。

StackExchange.Redis操作发布订阅

毕竟我们不可能只将其用在Redis命令控制台哈,最后来看一下在.NET中的使用。我们依然借助StackExchange.

基础配置,本系列第一篇分享已经包含。还记得静态构造函数中,下面这段代码吗?

1 _redis.PreserveAsyncOrder = RedisClientConfigurations.PreserveAsyncOrder;//并行

配置中,定义了使用并行的方式来执行命令,大大提高了效率(在你无所谓消息传递的顺序时,可以这样使用)。

在接口中定义如下方法:

 1  #region Redis发布订阅
 2         /// <summary>
 3         /// Redis发布订阅  订阅
 4         /// </summary>
 5         /// <param name="subChannel"></param>
 6         void RedisSub(string subChannel);
 7         /// <summary>
 8         /// Redis发布订阅  发布
 9         /// </summary>
10         /// <typeparam name="T"></typeparam>
11         /// <param name="channel"></param>
12         /// <param name="msg"></param>
13         /// <returns></returns>
14         long RedisPub<T>(string channel, T msg);
15         /// <summary>
16         /// Redis发布订阅  取消订阅
17         /// </summary>
18         /// <param name="channel"></param>
19         void Unsubscribe(string channel);
20         /// <summary>
21         /// Redis发布订阅  取消全部订阅
22         /// </summary>
23         void UnsubscribeAll();
24 
25         #endregion

实现如下:

 1  #region Redis发布订阅
 2         /// <summary>
 3         /// Redis发布订阅  订阅
 4         /// </summary>
 5         /// <param name="subChannel"></param>
 6         public void RedisSub(string subChannel)
 7         {
 8             sub.Subscribe(subChannel, (channel, message) =>
 9             {
10                 Console.WriteLine((string)message);
11             });
12         }
13         /// <summary>
14         /// Redis发布订阅  发布
15         /// </summary>
16         /// <typeparam name="T"></typeparam>
17         /// <param name="channel"></param>
18         /// <param name="msg"></param>
19         /// <returns></returns>
20         public long RedisPub<T>(string channel, T msg)
21         {
22 
23             return sub.Publish(channel, SerializeContent(msg));
24         }
25         /// <summary>
26         /// Redis发布订阅  取消订阅
27         /// </summary>
28         /// <param name="channel"></param>
29         public void Unsubscribe(string channel)
30         {
31             sub.Unsubscribe(channel);
32         }
33         /// <summary>
34         /// Redis发布订阅  取消全部订阅
35         /// </summary>
36         public void UnsubscribeAll()
37         {
38             sub.UnsubscribeAll();
39         }
40         #endregion

客户端测试,我将建立一个ConsoleApp和一个Winform程序,并在其中定义两个按钮。代码如下:

在ConsoleApp中我们作为订阅

1      static void Main(string[] args)
2         {
3             IRedisClient client = new RedisClient();
4 
5             client.RedisSub("myFirstChannel");
6             client.RedisSub("mySecondChannel");
7          }          

在Winform程序中进行发布

 1  IRedisClient client = new RedisClient();
 2         private void button1_Click(object sender, EventArgs e)
 3         {
 4             client.RedisPub("myFirstChannel", "first");
 5         }
 6 
 7         private void button2_Click(object sender, EventArgs e)
 8         {
 9             client.RedisPub("mySecondChannel", "second");
10         }

将两个应用运行起来,操作以及结果如下:

下面操作两个按钮,得到结果。

 

订阅成功。

 

如果我的点滴分享,对您能有一点帮助,欢迎点赞支持,也欢迎大牛们持续关注和给予指导建议。

 

csv 文件用Excel打开乱码

longmei阅读(5)

     最近在做一个上传的功能,记录下自己的感受。

     刚开始我用的是excel上传;但是发现客户服务器有用64位的,使用的时候程序会报错;

  未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序

     经查阅资料,发现是excel对64位的兼容性很差;64位操作系统不支持Microsoft OLE DB Provider for Jet驱动程序,也不支持更早的Microsoft Access Driver (*.mdb)方式连接。所以用于Access 和 Excel 数据库的 MicrosoftOLE DB Provider for Jet 在 64 位版本中不可用,也就是说,如下两种连接字符串都已经无法正常工作了:

“Provider=Microsoft.Jet.OLEDB.4.0;DataSource=”&Server.mappath(db)
“driver=Microsoft AccessDriver (*.mdb);DBQ=”&Server.MapPath(db)

我查找的解决方案中最多的是把程序在vs下重新编译:“生成-配置管理器-点击anyCPU-选择新建-创建x86”;解决。
刚解决了这个问题,又一个问题出来了,另一个客户的服务器上没有装office;这又要怎么办呢,再求救度娘,发现要将excel的几个dll打包到自己的程序中,可素可素

这样也太麻烦点了吧。这次我没有照做,而是选择的改变上传的文件格式;本来就是一块儿很小的东西,没有必要把它搞这么麻烦。我选择了csv文件。在网上有现成的

读文件代码;直接用就行了。但是又遇到问题了,编码问题;用记事本或者写字板打开都没问题;但是用excel打开的时候问题来了,一堆乱码。肿么回事捏捏捏!原来excel打开默认的编码方式是ANSI,而ANSI标准不太统一,程序处理中文一般采用gb2312或者gbk,等;不过这个小问题对于我的项目来说可以忽略;让客户选择其他打开方式就行了,也没再往下探索了,你,知道吗?

     总结:在使用某种特定技术之前应该要考虑它的使用平台和可移植性。

大前端WP主题 更专业 更方便

联系我们联系我们