Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58
System.Guid.NewGuid().ToString();
System.Guid.NewGuid().ToString();
ViewState赋值后,在客户端以序列化形式保存。当发生窗体回调之后,服务器在LoadViewState方法里复原。
在Page指令中加入MaintainScrollPositionOnPostback=”true”属性即可:<%@ Page Language="C#" MaintainScrollPositionOnPostback="true">
?服务端返回让页面执行js的方法有三种:
1,Response.Write(“<script>alert(‘开头成功’);</script>”);
??? 因是Response,故一般会将js加在<html>标签之前,有时可能会使css不能正确执行
?2,ClientScript.RegisterClientScriptBlock( this.GetType(), “show”, “<script>alert(‘更新成功’);</script>” );
??? 将js加在紧跟着<form>标签出现之后,第一个
?3,ClientScript.RegisterStartupScript(this.GetType(), “show“, “<script>alert(‘最后成功’);</script>”);
将js加在紧跟着</form>标签出现之前,最后一个
RegisterStartupScript第二个形参指定js的关键字,要唯一,若相同,则以第一个为主
注:还可利用ClientScript让页面载入js文件:
Page.ClientScript.RegisterClientScriptBlock(Me.GetType(),?”MyScript”,? “MyJavaScriptFile.js”)
ClientQueryString: 得到传来的?之后的参数
?a.直接向控件添加客户端属性
<asp:Button ID=”MyButton” Text=”ClickMe” onmouseover=”this.style.cursor=’pointer'” runat=”server” />b.调用内置方法
可以通过调用WebControl.Attributes.Add()方法为控件添加客户端属性,如下所示:MyButton.Attributes.Add(“onmouseover”, “this.style.cursor=’pointer'”);
c. OnClientClick
MyButton.OnClientClick = “alert(‘Hello!’)”;
在
整个工程默认接收与发送都按gb2312进行。
public static void format(System.Web.UI.Control page, bool bFalg)
{
int nPageControls = page.Controls.Count;
for (int i = 0; i < nPageControls; i++)
{
foreach (System.Web.UI.Control control in page.Controls[i].Controls)
{
if (control.HasControls())
{
format(control, bFalg);
}
else
{
if (control is TextBox)
(control as TextBox).Enabled = bFalg;
if (control is Button)
(control as Button).Enabled = bFalg;
if (control is CheckBox)
(control as CheckBox).Checked = bFalg;
}
?每个页面的生命周期为用户的每一次访问,也就是说每一次客户端与服务器之间的一个往返过程.全局变量的生命周期在此之间. 也就是说,每次都会重建类对象,成员变量当然会初始化。但static的就会被共享。或存入于 ViewState中
1,!IsPostBack 用于第一个生命周期创建时。
2,Page_Load事件会在每次返回到服务器时执行,无论是点击按纽还是其它。故Page_Load主要用于各个控件通用的操作。
由上知:在每次刷新时,页面的状态会被保存,而对应类的非static成员则每次都将被初始化,故在IsPostBack中进行页面控件状态的设置如:btn1.visible =false;
而在之后根据条件做变量的设置。
if( !IsPostBack ){
??? //页面状态设置
???? txtOrderDate_begin.Text = DateTime.Now.ToString(“yyyy-MM-dd”);
???? txtOrderDate_end.Enabled = false;
}
//每次刷新,进行变量设置, 若是从数据库中取值,放到viewstatue,免得每次刷新都要操作数据库
if ( ViewState[“isReviewer”] !=null ){
??? isReviewer = stringhelper.formatobjtobool(ViewState[“isReviewer”]);
}else{
? if (_userBL.GetRoleByAccount(user.Account) == DataBaseConstant.ROLE_REVIEWER)
??????????????? {
??????????????????? isReviewer = true;
?? ??? ??? ??? ???? ViewState[“isReviewer”] = isReviewer;
??????????????? }
}
1, 可调用的Services , 提供IP,天气, 国内手机号码归属地等服务。
引用方法:工程右健 添加WEB引用,输入URL,引用对应的命名空间如:webxml,生成类调用方法即可。
2,自定义WebServices: 添加新项,WebServices, 在生成的WebService2.cs中编写对应的方法即可。
3,ajax 引用webservice:单击service属性后面 的按钮,就出现servicereference collection editer??》单击add??》在右边的path属性中填上服务的路径??》单击ok
????? string url = @”http://www.input8.com/ip/?ip=59.38.240.54“;
??????????? HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
??????????? httpWebRequest.Method = “GET”;
??????????? HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse();
??????????? if (((int)httpWebResponse.StatusCode) >= 400)
??????????? {
?????????????? ????? return;
??????????? }
??????????? Stream responseStream = httpWebResponse.GetResponseStream();
??????????? StreamReader streamReader = new StreamReader(responseStream, Encoding.UTF8);
??????????? String result = streamReader.ReadToEnd().Trim();?? //result为得到的URL源码
??????????? httpWebResponse.Close();
??????????? streamReader.Close();
每一个ASP.NET程序执行时都会对当前URL的请求进行解析,本文将分析ASP.NET页面请求的原理。当我们在浏览器上输入一个URL时, 流程如下:
首先被WWW服务器截获(inetinfo.exe进程), 该进程首先判断页面后缀, 然后根据IIS中配置决定调用具体的扩展程序。
如aspx就会调用aspnet_isapi.dll, 然后由aspnet_isapi.dll发送给w3wp.exe(iis 工作者进程,IIS6.0中叫做 w3wq.exe,IIS5.0中叫做 aspnet_wp.exe).
接下来就是w3wp.exe调用.net类库进行具体处理,流程如下:
ISAPIRuntime–>HttpRuntime–>HttpApplicationFactory–>HttpApplication–>HttpModule–HttpHandlerFactory–>HttpHandle
1. ISAPIRuntime
主要作用是调用一些非托管代码生成HttpWorkerRequest对象,HttpWorkerRequest对象包含当前请求的所有信息,然后传递给HttpRuntime,这里生成的HttpWorkerRequest对象可以直接在我们的页面中调用的,通过它取得原始的请求信息:
2. HttpRuntime
a. 根据HttpWorkerRequest对象生成HttpContext,HttpContext包含request、response等属性;
b. 调用HttpApplicationFactory来生成IHttpHandler(这里生成的是一个默认的HttpApplication对象,HttpApplication也是IHttpHandler接口的一个实现)
c. 调用HttpApplication对象执行请求
3. HttpApplicationFactory.
主要是生成一个HttpApplication对象:
首先会查看是否存在global.asax文件,如果有的话就用它来生成HttpApplication对象,从这里我们可以看到global.asax的文件名是在asp.net的框架中写死的,不能修改的。如果这个文件不存在就使用默认的对象。
4. HttpApplication
这个是比较复杂也比较重要的一个对象, 首先是执行初始化操作,比较重要的一步就是进行HttpModule的初始化:
HttpApplication代表着程序员创建的Web应用程序。HttpApplication创建针对此Http请求的 HttpContext对象,这些对象包含了关于此请求的诸多其他对象,主要是HttpRequest、HttpResponse、 HttpSessionState等。这些对象在程序中可以通过Page类或者Context类进行访问。
它会读取web.config中所有HttpModule的配置
5. HttpModule
6. HttpHandlerFactory
7. HttpHandler
<asp:Button ID=”btnConfirm” runat=”server” Text=”保存确认结果” onClientClick=”return chekCancel();” OnClick=”btnConfirm_Click” />
要加上return, 当返回为true时,才执行服务器上的OnClick
注:用onClick, onClientClick看控件是否拥有服务器上的onClick,若有,则onClick在服务器上运行,若没有,onClick在客户端上运行。具体看html源文件,看生成的控件是什么类型。
Session默认存在服务器的内存上,易丢失。可存在别的当前服务器之外的电脑上,或存入sql server这样即使服务器重启也不会丢失。
Asp.net 默认配置下,Session莫名丢失的原因及解决办法
正常操作情况下Session会无故丢失。因为程序是在不停的被操作,排除Session超时的可能。另外,Session超时时间被设定成60分钟,不会这么快就超时的。
这次到CSDN上搜了一下帖子,发现好多人在讨论这个问题,然后我又google了一下,发现微软网站上也有类似的内容。
现在我就把原因和解决办法写出来。
原因:
由于Asp.net程序是默认配置,所以Web.Config文件中关于Session的设定如下:
<sessionState mode=’InProc’ stateConnectionString=’tcpip=127.0.0.1:42424‘ sqlConnectionString=’data source=127.0.0.1;Trusted_Connection=yes’ cookieless=’true’ timeout=’60’/>
我们会发现sessionState标签中有个属性mode,它可以有3种取值:InProc、StateServer?SQLServer(大小写敏感) 。默认情况下是InProc,也就是将Session保存在进程内(IIS5是aspnet_wp.exe,而IIS6是W3wp.exe),这个进程不稳定,在某些事件发生时,进程会重起,所以造成了存储在该进程内的Session丢失。
哪些情况下该进程会重起呢?微软的一篇文章告诉了我们:
1、配置文件中processModel标签的memoryLimit属性
2、Global.asax或者Web.config文件被更改
3、Bin文件夹中的Web程序(DLL)被修改
4、杀毒软件扫描了一些.config文件。
更多的信息请参考PRB: Session variables are lost intermittently in ASP.NET applications
解决办法:
前面说到的sessionState标签中mode属性可以有三个取值,除了InProc之外,还可以为StateServer、SQLServer。这两种存Session的方法都是进程外的,所以当aspnet_wp.exe重起的时候,不会影响到Session。
现在请将mode设定为StateServer。StateServer是本机的一个服务,可以在系统服务里看到服务名为ASP.NET State Service的服务,默认情况是不启动的。当我们设定mode为StateServer之后,请手工将该服务启动。
这样,我们就能利用本机的StateService来存储Session了,除非电脑重启或者StateService崩掉,否则Session是不会丢的(因Session超时被丢弃是正常的)。
除此之外,我们还可以将Session通过其他电脑的StateService来保存。具体的修改是这样的。同样还在sessionState标签中,有个stateConnectionString=’tcpip=127.0.0.1:42424’属性,其中有个ip地址,默认为本机(127.0.0.1),你可以将其改成你所知的运行了StateService服务的电脑IP,这样就可以实现位于不同电脑上的Asp.net程序互通Session了。
如果你有更高的要求,需要在服务期重启时Session也不丢失,可以考虑将mode设定成SQLServer,同样需要修改sqlConnectionString属性。关于使用SQLServer保存Session的操作,请访问这里。
在使用StateServer或者SQLServer存储Session时,所有需要保存到Session的对象除了基本数据类型(默认的数据类型,如int、string等)外,都必须序列化。只需将[Serializable]标签放到要序列化的类前就可以了。
如:
[Serializable]
public class MyClass
{
??? ……
}
具体的序列化相关的知识请参这里。
至此,问题解决。
关于asp.net Session丢失问题的总结
asp中Session的工作原理:
asp的Session是具有进程依赖性的。ASP Session状态存于IIS的进程中,也就是inetinfo.exe这个程序。所以当inetinfo.exe进程崩溃时,这些信息也就丢失。另外,重起或者关闭IIS服务都会造成信息的丢失。
asp.net Session的实现
asp.net的Session是基于HttpModule技术做的,HttpModule可以在请求被处理之前,对请求进行状态控制,由于Session本身就是用来做状态维护的,因此用HttpModule做Session是再合适不过了。
原因1:
bin目录中的文件被改写,asp.net有一种机制,为了保证dll重新编译之后,系统正常运行,它会重新启动一次网站进程,这时就会导致Session丢失,所以如果有access数据库位于bin目录,或者有其他文件被系统改写,就会导致Session丢失
原因2:
文件夹选项中,如果没有打开“在单独的进程中打开文件夹窗口”,一旦新建一个窗口,系统可能认为是新的Session会话,而无法访问原来的Session,所以需要打开该选项,否则会导致Session丢失
原因3:
似乎大部分的Session丢失是客户端引起的,所以要从客户端下手,看看cookie有没有打开
原因4:
Session的时间设置是不是有问题,会不会因为超时造成丢失
原因5:
IE中的cookie数量限制(每个域20个cookie)可能导致session丢失
原因6:
使用web garden模式,且使用了InProc mode作为保存session的方式
解决丢失的经验
1. 判断是不是原因1造成的,可以在每次刷新页面的时候,跟踪bin中某个文件的修改时间
2. 做Session读写日志,每次读写Session都要记录下来,并且要记录SessionID、Session值、所在页面、当前函数、函数中的第几次Session操作,这样找丢失的原因会方便很多
3. 如果允许的话,建议使用state server或sql server保存session,这样不容易丢失
4. 在global.asa中加入代码记录Session的创建时间和结束时间,超时造成的Session丢失是可以在SessionEnd中记录下来的。
5. 如果有些代码中使用客户端脚本,如javascript维护Session状态,就要尝试调试脚本,是不是因为脚本错误引起Session丢失
1, string cc = @”http://www.baidu.com/s?wd=“;
?? cc = cc+ HttpUtility.UrlEncode(“郑雪松”, System.Text.UnicodeEncoding.GetEncoding(“GB2312”));
?
2,解出url: System.Web.HttpUtility.UrlDecode(url, System.Text.UnicodeEncoding.GetEncoding(“GB2312”));
?? google用:System.Web.HttpUtility.UrlDecode(bb);? 不指定编码格式
UrlEncode 加密 UrlDecode解密就可防止页面按自己设置的编码格式转换,出现乱码问题
3,
百度搜索命令中的参数
必备参数:
wd??查询的关键词(Keyword)
oq??上一次查询的关键词(Keyword)
pn??显示结果的页数(Page Number)
cl??搜索类型(Class),cl=3为网页搜索
可选参数:
rn??搜索结果显示条数(Record Number),取值范围在10–100条之间,缺省设置rn=10
ie??查询输入文字的编码(Input Encoding),缺省设置ie=gb2312,即为简体中文
tn??提交搜索请求的来源站点
tn=baidulocal 表示百度站内搜索,返回的结果很干净,无广告干扰.
tn=baiducnnic 想把百度放在框架中吗?试试这个参数就可以了,是百度为Cnnic定制的
si??在限定的域名中搜索,比如想在sofuc.com的站内搜索可使用参数si=sofuc.com,要使这个参数有效必须结合ct参数一起使用.
ct??此参数的值一般是一串数字,估计应该是搜索请求的验证码
si和ct参数结合使用,比如在sofuc.com中搜索”wordpress”,可用:http://www.baidu.com/s?q=& amp;ct=2097152&si=sofuc.com&ie=gb2312&cl=3&wd=wordpress
bs??上一次搜索的关键词(Before Search),估计与相关搜索有关
右键点 Microsoft Visual SourceSafe 启动的快捷方式,属性,修改目标栏
1,传参与调用:
?SqlParameter[] storedParams = {
????????????????????????????????????????????? new SqlParameter(“@TranType”, “INSERT”),
??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ? new SqlParameter(“@RoleName”, _RoleEntity.RoleName),
????????????????????????????????????????????? new SqlParameter(“@description”, _RoleEntity.Description),
????????????????????????????????????????????? new SqlParameter(“@CreateBy”, _RoleEntity.CreateBy),
????????????????????????????????????????????? new SqlParameter(“@isValid”, _RoleEntity.IsValid),
??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ? new SqlParameter(“@isSystem”, _RoleEntity.IsSystem),???????????????????????????????????????????????????????????????????????????????????????????
????????????????????????????????????????????? //new SqlParameter(“@LastEditBy”, _RoleEntity.LastEditBy),
?????????????????????????????????????????????
????????????????????????????????????????? };
??????????????? _RoleEntity.ID = int.Parse(SqlHelper.ExecuteScalar(HelpConstant.DBCONN_STRING,
??????????????????? CommandType.StoredProcedure,?????? //指定按存储过程执行
??????????????????? “frmRole_save”,?????????????????????????????? //存储过程名称
??????????????????? storedParams).ToString());
传的参数小于等于存储过程指定的参数个数,不能有存储过程不存在的参数。
2,存储过程技巧
????? 1,AND OrderNo LIKE ISNULL(@OrderNo, ”) + ‘%’? // 有则查,无查全部
????? 2, AND CONVERT(varchar(10), OrderDate, 20) =, //AND 语句中加入选择!
??? ??? CASE(ISNULL(@OrderDate, ”))
??? ??? ??? WHEN ” THEN? CONVERT(varchar(10), OrderDate, 20)
??? ??? ??? ELSE @OrderDate END
上面的可直接换成下面方式:先计算出值再查询
?IF ( @CustomerName IS NULL )
??? BEGIN
??? ??? SET @CustomerName = ”
??? END
?IF ( @ShipDateEnd IS NULL OR @ShipDateEnd = ” )
??? BEGIN
??? ??? SET @ShipDateEnd = ‘2999-01-01′
??? END???
3, 右连接对指定的条件进行聚合
SELECT DISTINCT ACCOUNT, a.departmentid,sum(a.amount) as amount FROM bdOrder a
RIGHT JOIN permUserDepartment p
on a.SalesStaff = p.Account
AND a.orderstatus = ’07’
where?? a.DepartmentID is null or a.DepartmentID IN (SELECT DepartmentID FROM permUserDepartment(NOLOCK)??? WHERE Account = ‘sa’)? — 销售部门
group by account,a.departmentid
order by account,a.departmentid
1,aspx文件:
<asp:UpdatePanel ID=”UpdatePanel2″ runat=”server”>
??????????????????????? <ContentTemplate>
??????????????????????????? <asp:TextBox ID=”txtModel” Text=”” runat=”server” Width=”130px” CssClass=”MustInputText”></asp:TextBox>
?????????????????????????? <asp:Panel CssClass=”ContainPanel” ID=”Panel2″ runat=”server”? Width=”130px”
??????????????????????????????? Style=”visibility: hidden” >
??????????????????????????????? <asp:GridView ID=”gdModel” runat=”server” ShowHeader=”False” BorderWidth=”0px” OnRowCreated=”gdModel_RowCreated”>
??????????????????????????????? </asp:GridView> //当可选时用GridView获取数据库数据,用来显示下拉框
??????????????????????????? </asp:Panel>
??????????????????????????
??????????????????????????? <cc1:DropDownExtender ID=”DropDownExtender2″ runat=”server” DropDownControlID=”Panel2″
??????????????????????????????? TargetControlID=”txtModel” Enabled=”true”>
??????????????????????????? </cc1:DropDownExtender>
??????????????????????????? <cc1:AutoCompleteExtender ID=”AutoCompleteExtender3″ runat=”server” TargetControlID=”txtModel”? CompletionInterval=”100″? //触发时间
??????????????????????????????? CompletionSetCount=”10″ EnableCaching=”true” MinimumPrefixLength=”1″ ServiceMethod=”GetModelList1″
??????????????????????????????? ServicePath=”~/WebService/AutoCompleteService.asmx”>
??????????????????????????? </cc1:AutoCompleteExtender>? //AutoComplete用来自动填充功能
??????????????????????? </ContentTemplate>
??????????????????? </asp:UpdatePanel>
注:DropDownExtender :用来在下拉时填充。主要是为TxtBox增加下拉功能,显示的内容来自 DropDownControlID, DropDownControlID用来指向用什么块显示,TargetControlID用来指向哪个控件触发,事件为点击。
?????? AutoCompleteExtender :用来输入时自动带出数据库中的相关提示。TargetControlID指向哪个控件触发,事件为输入。当输入时,调用webservice,执行ServiceMethod方法,返回string[]数组,用来显示下拉的内容如:
public string[] GetModelList1(string prefixText, int count)??????? //prefixText名称保持不变
??? {
??????? ProductBL _ProductBL = new ProductBL();
??????? SqlDataReader dr = _ProductBL.GetModelsByCategory(“乐知购”);
??????? DataTable dt = new DataTable();
??????? dt.Load( dr );
??????? List<String> Models = new List<string>(dt.Rows.Count);
??????? for (int i = 0; i < dt.Rows.Count; i++)
??????? {
??????????? Models.Add(dt.Rows[i][“Model”].ToString());
??????? }
??????? List<String> returnlist = new List<string>();
??????? foreach( string s in Models ){
??????????? if ( s.IndexOf(prefixText)!= -1 ){
??????????????? returnlist.Add(s);
??????????? }
??????? }
???????
??????
??????? return returnlist.ToArray();
??? }
注:(1)要想用此控件,要引入AjaxControlToolkit.dll
?????? (2)页面上放置: <asp:ScriptManager ID=”ScriptManager1″ runat=”server”>? </asp:ScriptManager>
2, 两个控件都启作用时会乱,一般进行控制,当一定条件时enabled = false;
DateTime.Now.ToString(“yyyy-MM-dd”);??????????????? //2009-08-14
DateTime.Now.ToString(“yyyy/MM/dd HH:mm:ss”); //2009-08-14 15:57:12″ToString 按指定形式转换 DateTime.Now.ToString(“aaaaa”) ; 输出aaaaa 除非在参数中指定了特定的格式。如:
年:yyyy 2009, yyy 2009, yy 09, y 9
月: MM 08 (不是mm的原因是mm代表时间中的分钟)
日:dd: 14
时:HH: 16 (以24小时制) hh:04 (12小时制)
分:mm
秒:ss即时间控制都用小写,除非是重合的MM与mm, 及小时。
//2009年09月18 17时55分48秒
? System.DateTime.Now.ToString(“yyyy年MM月dd HH时mm分ss秒”);??? 12345.ToString(“n”); //生成 12,345.00
??? 12345.ToString(“C”); //生成 ¥12,345.00
??? 12345.ToString(“p”); “1,234,500.00%”
DataAdapter:? 获取数据库中的数据
DataSet, SqlDateReader, DataTable存储DataAdapter得来的数据。
1,通过 DataAdapter 使用数据源中的数据生成和填充 DataSet 中的每个 DataTable。
??? SqlDataAdapter da = new SqlDataAdapter(cmd);
??? DataSet ds = new DataSet(); da.Fill(ds);
2, SqlDataReader的创建必须调用 SqlCommand 对象的 ExecuteReader方法,而不是用new
DataSet与DataReader区别:
3,DataSet, DataReader数据的读取
??? (1)
????? DataSet利用DataTable读取
???????? DataTable dt =DataSet1Tables[0];
????????
??????????? foreach (DataRow row in dt.Rows)
??????????? {
??????????????? Console.wirte(row[“Name”] );
??????????? }
??? (2)
? ? ?? MySqlDataReader dr = _newsDA.GetData(1, 3, 0);
???????? while (dr.Read()){
? ? ? ? ? ? Console.wirte(dr[“Name”]);
???????????????????????? // 或者dr[“0”], dr.GetInt32(0);指定类型返回
???? }?
???? (3)
? ? ?? DataReader也可用DataTable读取
???? ? DataTable dt = new DataTable();
?????? dt.Load( DataReader1 );
???? load:用DataReader数据源的值填充 DataTable。如果 DataTable 已经包含行,则从数据源传入的数据将与现有的行合并。
4, DataTable 与 DataView
利用DataView可对数据进行排序,筛选,并保存结果视图。
?DataView DV = dt.DefaultView;
?DV.Sort = “department, amount desc”;
5, GridView 的DataSource 可以是DataSet, DataReader, DataTable, DataView
1,DataTable dt = GetData(iPageSize, iPageIndex).Tables[0];? //GetData(iPageSize, iPageIndex)返回DataSet
? dt.Columns.Add(“Detail”);? //增加栏位? 注意的一点是dt的列名大小写不敏感,源于sql语句大小写不敏感
??????????? foreach (DataRow row in dt.Rows)
??????????? {
??????????????? row[“Detail”] =”123″
??????????? }
??????????? return dt;
GridView1DataSource = dt;? //gridview datasource可以是dataset, 也可以是datatable
? //dt.Columns.Add(“Detail”); Detail默认为string类型,指定类型可用:
? ? ?? DataColumn column = new DataColumn(“pageBy”);
??????? column.DataType = System.Type.GetType(“System.Int32”);
??????? column.AutoIncrement = true;
??????? column.AutoIncrementSeed = 0;
??????? column.AutoIncrementStep = 1;
?????? column.DefaultValue = 0;
??????? dt.Columns.Add(column);
加列
?DataRow srow = dt.NewRow();
??????????????? row[“OrderStatus”] = row[“OrderStatus”].ToString();
??????????????? row[“OrderNums”] = 1;
??????????????? row[“OrderAmounts”] = row[“Amount”].ToString();
?????????????? sdt.Rows.Add(srow);
2,排序
?DataView DV = dt.DefaultView;
?DV.Sort = “department, amount desc”;
//排序时注意的一点是列的类型,如amount若是string型,就不会按数字排序
//datatable是内存中的表,这个表可以增加,删除,update记录的,而dataview只是相当于视图,基本上是用来显示数据的,? 用于排序、筛选、搜索、编辑和导航的 DataTable 的可绑定数据的自定义视图。
?执行聚合函数:如sum,count
dt.Compute(“Sum(Total)”, “EmpID = 5”);
dt.Compute(“Sum(fenshu)”,”1=1″);?
注意没有count(*) count(1) 要指定具体的列
Sum(expression)中expression要注意的是:
1,expression这个参数中的列名不能是数字开头,否则就会报这个错。(这个很难排查出来。。。)
2,expression参数中字段的数据类型问题,例如Sum(字符类型)就会报这个错。
3,查询,取部分数据集
?? ?string expression = “Date > ‘1/1/00′”;
?? ?string sortOrder = “CompanyName DESC”;
?? ?DataRow[] foundRows = table.Select(expression, sortOrder); //查询带排序
?? (1)取部分行
?DataView davTemp = new DataView(datSource, “过滤条件”, “排序字段”, DataViewRowState.各种 状态);
//把过滤后的表赋给新表
DataTable datNew = davTemp.ToTable();
(2)取部分列
DataTable dat = YourDataTable.DefaultView.ToTable(false, new string[] { “你要的列名”, “你要的列名” });
false : 不去掉重复行
(3)删除列
YourDataTable.Columns.Remove(“列名”);
4,设主键
?? DataTable dt = new DataTable();
??????? dt.Columns.Add(“id”);
??????? dt.Columns.Add(“PartName”);
??????? dt.Columns.Add(“Style”);
??????? dt.Columns.Add(“quantity”);
??????? dt.Columns.Add(“Unit”);
??????? DataColumn dc1 = new DataColumn(“Amount”,typeof(float));
??????? dtAll.Columns.Add(dc1);
??????? //增加主键
??????? DataColumn[] columns = new DataColumn[2];
??????? columns[0] = dt.Columns[“id”];
??????? columns[1] = dt.Columns[“Style”];
??????? dt.PrimaryKey = columns;
按主键查询:
? object[] findTheseVals = new object[2];
?? findTheseVals[0] = id;
?? findTheseVals[1] = Style;
?? DataRow dr = dt.Rows.Find(findTheseVals);
两个DataTable合并: merge
dt1.Merge(dt2,true);
//true指示当dt2存在与dt1相同的主键值时dt1是否不修改,当为false时用dt2更新dt1, 要牢记的是同一个table中主键必须要保持唯一,若只想两个table简单的合在一起,那要在merge之前将两个DataTable的主键去掉,如:dt1.PrimaryKey = null;
DISTINCT
DataTable dataTable;
DataView dataView = dataTable.DefaultView;
DataTable dataTableDistinct = dataView.ToTable(true,”FieldName1″,”FieldName2″,”…”);
//注:其中ToTable()的第一个参数为是否DISTINCT
1,DataTable dt = GetData(iPageSize, iPageIndex).Tables[0];? //GetData(iPageSize, iPageIndex)返回DataSet
? dt.Columns.Add(“Detail”);? //增加栏位? 注意的一点是dt的列名大小写不敏感,源于sql语句大小写不敏感
??????????? foreach (DataRow row in dt.Rows)
??????????? {
??????????????? row[“Detail”] =”123″
??????????? }
??????????? return dt;
GridView1DataSource = dt;? //gridview datasource可以是dataset, 也可以是datatable
? //dt.Columns.Add(“Detail”); Detail默认为string类型,指定类型可用:
? ? ?? DataColumn column = new DataColumn(“pageBy”);
??????? column.DataType = System.Type.GetType(“System.Int32”);
??????? column.AutoIncrement = true;
??????? column.AutoIncrementSeed = 0;
??????? column.AutoIncrementStep = 1;
?????? column.DefaultValue = 0;
??????? dt.Columns.Add(column);
加列
?DataRow srow = dt.NewRow();
??????????????? row[“OrderStatus”] = row[“OrderStatus”].ToString();
??????????????? row[“OrderNums”] = 1;
??????????????? row[“OrderAmounts”] = row[“Amount”].ToString();
?????????????? sdt.Rows.Add(srow);
2,排序
?DataView DV = dt.DefaultView;
?DV.Sort = “department, amount desc”;
//排序时注意的一点是列的类型,如amount若是string型,就不会按数字排序
//datatable是内存中的表,这个表可以增加,删除,update记录的,而dataview只是相当于视图,基本上是用来显示数据的,? 用于排序、筛选、搜索、编辑和导航的 DataTable 的可绑定数据的自定义视图。
?执行聚合函数:如sum,count
dt.Compute(“Sum(Total)”, “EmpID = 5”);
dt.Compute(“Sum(fenshu)”,”1=1″);?
注意没有count(*) count(1) 要指定具体的列
Sum(expression)中expression要注意的是:
1,expression这个参数中的列名不能是数字开头,否则就会报这个错。(这个很难排查出来。。。)
2,expression参数中字段的数据类型问题,例如Sum(字符类型)就会报这个错。
3,查询,取部分数据集
?? ?string expression = “Date > ‘1/1/00′”;
?? ?string sortOrder = “CompanyName DESC”;
?? ?DataRow[] foundRows = table.Select(expression, sortOrder); //查询带排序
?? (1)取部分行
?DataView davTemp = new DataView(datSource, “过滤条件”, “排序字段”, DataViewRowState.各种 状态);
//把过滤后的表赋给新表
DataTable datNew = davTemp.ToTable();
(2)取部分列
DataTable dat = YourDataTable.DefaultView.ToTable(false, new string[] { “你要的列名”, “你要的列名” });
false : 不去掉重复行
(3)删除列
YourDataTable.Columns.Remove(“列名”);
4,设主键
?? DataTable dt = new DataTable();
??????? dt.Columns.Add(“id”);
??????? dt.Columns.Add(“PartName”);
??????? dt.Columns.Add(“Style”);
??????? dt.Columns.Add(“quantity”);
??????? dt.Columns.Add(“Unit”);
??????? DataColumn dc1 = new DataColumn(“Amount”,typeof(float));
??????? dtAll.Columns.Add(dc1);
??????? //增加主键
??????? DataColumn[] columns = new DataColumn[2];
??????? columns[0] = dt.Columns[“id”];
??????? columns[1] = dt.Columns[“Style”];
??????? dt.PrimaryKey = columns;
按主键查询:
? object[] findTheseVals = new object[2];
?? findTheseVals[0] = id;
?? findTheseVals[1] = Style;
?? DataRow dr = dt.Rows.Find(findTheseVals);
两个DataTable合并: merge
dt1.Merge(dt2,true);
//true指示当dt2存在与dt1相同的主键值时dt1是否不修改,当为false时用dt2更新dt1, 要牢记的是同一个table中主键必须要保持唯一,若只想两个table简单的合在一起,那要在merge之前将两个DataTable的主键去掉,如:dt1.PrimaryKey = null;
DISTINCT
DataTable dataTable;
DataView dataView = dataTable.DefaultView;
DataTable dataTableDistinct = dataView.ToTable(true,”FieldName1″,”FieldName2″,”…”);
//注:其中ToTable()的第一个参数为是否DISTINCT