2019-04-15上午.NET面试题2th

在这里插入图片描述
在Web 应用程序中,页面之间交换数据(传值)是一种基本应用,它的实现效率对程序性能有直接的影响。传统的解决方案是通过Get 或Post 方法来实现的。但在ASP.NET 中,这2 种方法的使用发生了变化。因为ASP.NET 使用了基于事件驱动的编程模型,页面采用了PostBack 技术(发回给自己),一些传统的方法必须做出一定的调整才能适应它。同时,ASP.NET 以其优秀的架构提供了更多可用于页面间传值的方法。这些方法各具特色,比较充分地适应了各种情况下页面间传值的需求。

1 页面重定向
页面间的传值方法总是与一定的页面重定向方法相联系,而且有些传值方法只能用某种重定向方法才能实现。ASP.NET 中有多种页面重定向的方法,这里仅介绍下文中用到(也是最常用的)的2 种。

(1)Redirect 方法
将客户端重定向到新的页面,只是简单地终止当前页面,并转入新的页面开始执行,对转入的页面无任何限制。

(2)Transfer 方法
终止当前页的执行,并为当前请求开始执行新的页面。把执行流程从当前页面转到同一服务器中的另一页面,但是新的页面仍然使用当前页面创建的应答流。这两种方法的主要区别是:(1)Redirect 方法可以实现任意网页间的重定向,而Transfer 方法只能实现同一服务器中ASPX 页面间的重定向。(2)Redirect 方法不会保留当前页面的表单(Form)数据和查询字符串(QueryString),而Transfer 方法则可以保留这些数据。

2 传值方法
为了简化问题的讨论,本文作如下约定:示例基于C#语言;源页和目标页已经导入了必要的命名空间;源页面设为Src.aspx,值的传送点设在控件Button1 的Click 事件中,待传送的数据保存在控件TextBox1 中; 目标页面设为Dst.aspx,值的接收点设在该页面的Page_Load 事件中,接收的数据显示在控件Label1 中;不深入讨论与之相关的编程问题,所有示例仅给出基本实现方法,所有代码在Visual Studio2005 中调试通过。

2.1 QueryString 的使用
最简单最常用的传值方法,与传统的 Get 方法相对应,使用变化相对较小。数据直接在URL 中以明文传递,对于用户来说是可见的,但是可以加密。此方法的优点是简单、方便,缺点是能传递的数据量少,而且不能传递对象。示例如下:
Src.aspx:

Private void Button1_Click(object sender, EventArgs e)
{//将待传送的数据保存到URL 中
strUrl=“Dst.aspx?id=+TextBox1.Text;
//重定向到目标页面
Response.Redirect(strUrl);
}
Dst.aspx:
private void Page_Load(object sender, EventArgs e)
{//接收数据并显示在Label1 控件中
Label1.Text = Request.QueryString[“id”];
}

因为方法的描述完全相同,为节省篇幅,下文示例只给出数据传送和接收的实现代码。

2.2 Form 的使用
通过表单中的控件来传递数据,与传统的Post 方法相对应,使用变化相对较大。该方法的优点是可以传递大量数据,并且可以访问源页面控件中的数据;缺点是操作比较复杂,生命周期仅限于当前请求。示例如下:
Src.aspx:

public string id{get{return TextBox1.Text;}} //定义公共属性
Server.Transfer("Dst.aspx"); //重定向到目标页面
Dst.aspx:
//HTML 中引入PreviousPageType 指令
<%@ PreviousPageType VirtualPath="~/Src.aspx" %>
//代码中获取Form 数据
Label1.Text=PreviousPage.id;

2.3 Session 的使用
Sessionss 对象为当前用户会话提供信息。通过其属性可以方便地设置和检索ASP.NET 会话状态变量,这些变量的值在会话持续期间保留不变,并且可以被同一个会话中的所有页面访问,这就为页面传值提供了途径和方便。该 方 法 的 特点是: (1)用户数据存储在服务器端;(2)ASP.NET 中的Session 对象也可以不依赖Cookie 而正常工作;(3)可以直接存储对象,且无大小限制;(4)有效期与用户的活动时间有关,具体为用户活动时间+自定义延迟时间。该方法的缺点是:由于Web 应用程序对每个用户都会生成Session 变量,因此它会随着用户数量的增多而加重服务器的负担。如果数据量比较小,Sessionss 对象是保存只需要在当前对话中保持的特定数据的极好位置。实例代码如下:
Src.aspx:

Session[“id”]=TextBox1.Text;
Response.Redirect(“Dst.aspx”);
Dst.aspx:
Label1.Text=Session[“userid”].ToString();
Session.Remove(“id”); //清除Session 变量

2.4 Application 的使用
Application 对象提供了对应用程序状态的访问。与Session 对象相比,两者对数据的存储与访问都相似,不同之处在于:每个Web 应用程序只生成一个Application 实例,并应用于所有的用户和会话;有效期为整个Web 应用程序的生命周期。因此,该方法非常适合存储那些数量少、不随用户变化而变化的常用数据。在多用户并发访问控制方面,Apllication 对象采用了锁定机制,但是它串行化了对Application 对象的访问,而这对于应用程序来说有可能形成严重的性能瓶颈。示例如下:
Src.aspx:

Application[“id”]=TextBox1.Text;
Response.Redirect(“Dst.aspx”);
Dst.aspx:
Application.Lock(); //加锁
Label1.Text=Application[“userid”].ToString();
Application.Unlock(); //解锁
Application.Remove(“id”); //清除Application 变量

2.5 Cookie 的使用
Cookie 是网站存放在用户机器上的一小块信息,主要用来保存一些与用户相关的东西。浏览器一般都对Cookie 的使用进行了一些限制[3]:(1)每个域最多只能在一台用户机器上存储20 个Cookie;(2)每个Cookie 的总尺寸不能超过4 096 Byte;(3)一台用户的机器上Cookie 的总数不能超过300 个。该方法的缺点是:并非所有的浏览器都支持Cookie;用户可以禁用和删除它;信息采用明文保存,安全性差。当特定的用户需要特定的数据片,并且需要把数据在某个可变的时段中保持的时候,Cookie 就非常方便。实例代码如下:
Src.aspx:

Response.Cookies[“id”].Value=TextBox1.Text;
Response.Redirect(“Dst.aspx”);
Dst.aspx:
Label1.Text=Request.Cookies[“id”].Value;
//清除Cookie 变量
Response.Cookies[“id”].Expires=Now.AddDays(-1);
//清除当前域名(和路径)下的所有Cookie
Response.Cookies[cookie].Expires=Now.AddDays(-1);

2.6 Static(静态)变量的使用
准确地说,是使用类的公共静态变量。这种变量在应用程序运行期间分配固定的存储空间,它依类而不依类实例而存在,使用时直接通过类名即可访问。在ASP.NET 中,每个页面对应一个类,因此,可以利用它们的公共静态变量在页面间传递数据。该方法的优点是如果善加利用,则可以有效提高数据传递效率,缺点是如果滥用,则会导致用户或页面间数据紊乱,造成极大的隐患。示例如下:

public static string id; //在类Src 中定义公共静态变量
Src.aspx:
id=TextBox1.Text;
Response.Redirect("Dst.aspx");
Dst.aspx:
Label1.Text=Src.id;

2.7 Cache 的使用
应用程序中的缓存机制用于将需要大量服务器资源来创建的对象存储在内存中,以此大大改进应用程序的性能。这个机制同样可以用来传值。与其他方法不同的是,该方法需要设置缓存项优先级和缓存时间。因为当系统内存缺乏时,缓存机制会自动移除很少使用或优先级较低的项,从而造成传值失败。该方法的优点是传递数据的大小和数量无限制,速度快。缺点是缓存机制的操作相对比较复杂。在 ASP.NET 中,缓存机制通过Cache 类实现。示例如下:
Src.aspx:

Cache["id"]=TextBox1.Text;
Response.Redirect("Dst.aspx");
Dst.aspx:
if(Cache["id"]!=null) Label1.Text=Cache["id"].ToString();
Cache.Remove("id"); //移除缓存项
//如果 Cache["id"]为空,则传值失败。可使用如下方法实现过期策略(以10 min 过期为例):
Cache.Insert("id",TextBox1.Text,null,
Cache.NoAbsoluteExpiration,new TimeSpan(0,10,0));

2.8 Context 的使用
Context 对象包含与当前页面相关的信息,提供对整个上下文的访问,包括请求、响应、以及上文中的Session 和Application 等信息。可以使用此对象在网页之间共享信息,从而实现页面间的传值。与使用 Form 的方法类似,该方法也能保持大量的数据,缺点也相同,但使用方法相对比较简单。示例如下:
Src.aspx:

Context.Items["id"]=TextBox1.Text;
Server.Transfer("Dst.aspx");
Dst.aspx:
Label1.Text=Context.Items["id"].ToString();
Context.Items.Remove("id"); //移除项

2.9 ViewState 的使用
ViewState 是ASP.NET 用来在同一页面的多个请求之间保存和还原服务器控件视图状态的一种机制。与传统的“同一页面”不同,ASP.NET 中“同一页面”的每一个请求都会导致服务器重新生成该页面,但是新生成的页面并不包含原来页面的数据。ViewState 的任务就是保存原来页面中服务器控件视图状态的数据供新页面使用。从这个意义上讲,ViewState 也可以看作是一种在页面间传递数据的工具。
(参考:https://www.xuebuyuan.com/1430300.html)
在这里插入图片描述
每一个DataSet都是一个或多个DataTable 对象的集合(DataTable相当于数据库中的表),这些对象由数据行(DataRow)、数据列(DataColumn)等组成。
DataView是对某一个DataTable建立视图,用来在观察数据时提供排序和过滤的功能。
1.DataSet与DataTable的相互转换
DataSet ds = new DataSet();//也可以是一段获取sql的语句
DataTable dt = ds.Tables[0];
这样获取到了ds中的对象集合也就是数据库中的表格数据集。

2.DataTable的简单操作
1)获取所有行。
DataRow[] rows = dt.Select();
或者可以这样写获取单行数 DataRow row =dt.Tables[0].Rows[0];
2)按主键顺序(如没有主键,则按照添加顺序)获取符合筛选条件的行。
DataRow[] rows = dt.Select(“ID>1”);
3)获取符合筛选条件的行,并按指定的排序条件排序。
DataRow[] rows = dt.Select(“ID>1”,“ID DESC”);
4)获取符合筛选条件和指定状态的行,并按指定的排序条件排序。
string strExpr = “ID>1”;
string strSort = “ID DESC”;
DataRow[] foundRows = dt.Select(strExpr, strSort, DataViewRowState.OriginalRows);
3.合并两个DataTable表的数据
DataTable dt1 = ds.Tables[0];
DataTable dt2 = ds.Tables[1];
dt1.Merge(dt2, true, MissingSchemaAction.AddWithKey);
//或者
//将两个DataTable合并成一个
DataTable d1 = null;//源数据1
DataTable d2 = null;//源数据2
DataTable newDataTable = d1.Copy();//复制出一个新表
//添加DataTable2的数据
foreach (DataRow dr in d2.Rows)
{
newDataTable.ImportRow(dr);//将两个datatable合并
}
4.DataView
DataView dv = ds.Tables[0].DefaultView;
//或
DataView dv = new DataView(ds.Tables[“Product”], “ID > 1”, “ID DESC”,
DataViewRowState.CurrentRows);
5.DataColumn创建与赋值
DataColumn dc = new DataColumn(“ID”, typeof(string));
dt.Columns.Add(dc);
DataRow row = dt.NewRow();
row[“ID”] = “1”;
获取数据行的写法:

1.

DataSet value = obj.GetSQLDataset("SELECT * FROM tbgZJBudgetImport WHERE State in ('0','1') AND BudgetYear=" + DropDownList_Year.SelectedValue);
DataRow ZJBudgetimport = value.Tables[0].Rows[0];

2.可以参考

DataSet dsZJBudgetList = obj.GetSQLDataset("Select * FROM tbgZJBudgetImportList Where ZJBudgetImportID =" + ZJBudgetImportID);
DataView dvBudgetListG = dsZJBudgetList.Tables[0].DefaultView;
DataRow drBudgetList = dtUpdate.Rows[0];
string ZJBudgetImportListID=dvBudgetListG[0].Row["ZJBudgetImportListID"].ToString().Trim();

(参考:https://blog.csdn.net/qq_42717786/article/details/83650810)

在这里插入图片描述
没有特定的继承类的,不过基类最终都是Control类。
在这里插入图片描述
(参考:https://blog.csdn.net/goodshot/article/details/6664559)
在这里插入图片描述
参考:https://www.cnblogs.com/diyunfei/p/6752618.html
在这里插入图片描述
在这里插入图片描述

 <script type="text/javascript">
  $(document).ready(function(){
 //input 单击事件
            $("input").click(function () {
                //获取checkbox选中项
                if ($(this).prop("checked") == true) {
                    $(this).parent().parent().css("background", "#b2dba1");
                } else {
                    $(this).parent().parent().css("background", "");
                }
            });
})
</script> 
<body>
    <table style="text-align: center" class="auto-style1">
        <tr>
            <td>选 择</td>
            <td>姓 名</td>
            <td>性 别</td>
            <td>年 龄</td>
        </tr>
        <tr>
            <td>
                <input id="Checkbox1" type="checkbox" /></td>
            <td>杨菲</td>
            <td></td>
            <td>23</td>
        </tr>
        <tr>
            <td>
                <input id="Checkbox2" type="checkbox" /></td>
            <td>刘儒龙</td>
            <td></td>
            <td>24</td>
        </tr>
        <tr>
            <td>
                <input id="Checkbox3" type="checkbox" /></td>
            <td>梁欢</td>
            <td></td>
            <td>23</td>
        </tr>
        <tr>
            <td>
                <input id="Checkbox4" type="checkbox" /></td>
            <td>罗宏祥</td>
            <td></td>
            <td>24</td>
        </tr>
        <tr>
            <td>
                <input id="Checkbox5" type="checkbox" /></td>
            <td>李清峰</td>
            <td></td>
            <td>24</td>
        </tr>
    </table>
</body>

在这里插入图片描述
3.一组数值的排列规则如:1、1、2、3、5、8、13、21、34…,用递归算法求第30位数。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace CsharperCode
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("值为:{0}",GetNum(29));
            Console.ReadKey();
        }

        private static int GetNum(int n)
        {
            if (n <= 1)
            {
                return 1;
            }
            else
            {
                return GetNum(n - 1) + GetNum(n - 2);
            }
        }
    }
}
//结果:832040

数据库题:
1.请写出向Employee表中进行新增、删除、更新的SQL语句。(更新的值可随意定义)
Employee的表结构如下:
在这里插入图片描述
2.表中有A B C三列,用SQL语句实现:当A列大于B列时选择A列,否则选择B列,当B列大于C列时选择B列否则选择C列。

drop table table1
create table table1(
	a int,
	b int,
	c int
)
insert into table1 values(22,24,23)
 
select * from table1
 
select (case when a>b then a else b end),(case when b>c then b else c end)
from table1
 
select (case when a>b then a
			 when a>c then a
			 when b>c then b else c
			 end)
from table1

  • 9
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值