• 强类型DataSet的基本知识(转载)


    “typed DataSet是从DataSet派生的,它根据事先定义的Data Schema生成数据集,对数据集中的字段实行强类型约束。你可以通过它产生的cs文件看到许多方法对DataTable的操作进行了封装,这样你就可以通过MyDataSet.MyTable.Field对字段进行访问,而不是像DataSet那样:
    MyDataSet.Tables["TableName"]["Field"]; 简化了编程,同时不容易出错,想象一下如果在"Field"中拼错了字段名,那么编译器也不会检查出来,对于typed DataSet就不用了,如果你Field写错的话,那么马上就可以知道。
    还有就是如果你在Typed DataSet包含多数据集,同时在XSD中对这些数据集建立关系和约束,那么Type DataSet会生成相应的方法来反映这些关系和约束。如果使用untyped DataSet,你需要自己做。
    性能上的考虑:虽然Typed DataSet创建对象实例的时候比unTypede DataSet要多一些开销(时间和空间),但是在填充数据的时候要比untyped DataSet快,这是因为DataAdapter已经知道怎么Fill一个Typed DataSet,相比之下,DataSet需要两次读取数据库,第一次取得数据库中表的结构信息,第二次才fill数据。
    Typed DataSet相对于DataSet的缺陷:除了创建的开销之外,Typed DataSet不如DataSet灵活,因为Typed DataSet一旦确定,数据表的结构就固定了,如果需要修改,必须重新生成。
    而DataSet你可以随时根据需要进行操作(比如添加字段,删除字段等)。”

    上面一段话的出处不可考:)下面来看怎么用vs.net创建强类型DataSet
    项目-添加新项-从弹出窗口中选择数据-选择数据集,然后起一个名字,点确定。现在就可以看到设计视图了。
    下一步要做的就是打开服务器资源管理器,然后找到要创建到数据集里的数据表,把它拖到设计视图中,最后shift+ctrl+b生成,一个typed DataSet就创建完毕了。

    很简单吧,现在可以看看typed DataSet的后台.cs代码,推荐使用类视图来快速查看该typed DataSet的详细内容。可以看到属性方法事件一应具全,在typed DataSet里包含的原ado.net的datatable/datarow/datacolumn都是以套嵌类的方式公开的,数据库里的字段以属性方式公开
    下面是一个示例,通过填写序号和要修改的内容来修改数据库,演示了对typed DataSet属性方法事件的操作。
    typedDataSet.aspx
    <%@ Page language="c#" Codebehind="typedDataSet.aspx.cs" AutoEventWireup="false" Inherits="newCentury.typedDataSet" trace=true %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
    <HTML>
    <HEAD>
    <title>typedDataSet</title>
    <meta content="Microsoft Visual Studio .NET 7.1" name="GENERATOR">
    <meta content="C#" name="CODE_LANGUAGE">
    <meta content="JavaScript" name="vs_defaultClientScript">
    <meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema">
    </HEAD>
    <body>
    <form id="Form1" method="post" runat="server">
    序号:
    <asp:TextBox id="idToDel" runat="server"></asp:TextBox>&nbsp;
    新值:
    <asp:TextBox id="newMword" runat="server"></asp:TextBox>&nbsp;
    <asp:Button id="go" runat="server" Text="delete!"></asp:Button>
    </form>
    </body>
    </HTML>
    typedDataSet.aspx.cs
    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Web;
    using System.Web.SessionState;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;
    using System.Data.SqlClient;
    using System.Configuration;

    namespace newCentury
    {
    /// <summary>
    /// typedDataSet 的摘要说明。
    /// </summary>

    public class typedDataSet : System.Web.UI.Page
    {
    //声明typedDataSet的实例
    private myDS myds;
    private SqlConnection conn;
    private SqlCommand cmd;
    private SqlCommand cmdUp;
    private SqlDataAdapter ada;
    protected System.Web.UI.WebControls.TextBox idToDel;
    protected System.Web.UI.WebControls.TextBox newMword;
    protected System.Web.UI.WebControls.Button go;


    private void Page_Load(object sender, System.EventArgs e)
    {
    if(!Page.IsPostBack)
    {
    outPut();
    }

    }


    Web 窗体设计器生成的代码

    private void setUp()
    {
    string connStr=ConfigurationSettings.AppSettings[0];
    conn
    =new SqlConnection(connStr);
    cmd
    =conn.CreateCommand();
    cmd.CommandText
    ="select * from [member]";
    ada
    =new SqlDataAdapter();
    ada.SelectCommand
    =cmd;
    //创建实例
    myds=new myDS();
    }


    private void outPut()
    {
    setUp();
    try
    {
    //填充数据集,注意datatable的名字一定要指定为typed DataSet中的名字
    ada.Fill(myds,"member");
    //获得datatable,注意获取的方法
    myDS.memberDataTable mdt=myds.member;
    //遍历
    foreach(myDS.memberRow mr in mdt.Rows)
    {
    Response.Output.Write(mr.mid
    +" "+mr.mword+"<br>");
    }

    Response.Write(mdt.FindBymid(
    3).mname);
    }

    catch(SqlException ex)
    {
    Trace.Warn(
    "sql error","outPut",ex);
    }

    catch(Exception ex)
    {
    Trace.Warn(
    "comm error","outPut",ex);
    }

    finally
    {
    ada.Dispose();
    }

    }


    private void go_Click(object sender, System.EventArgs e)
    {
    setUp();
    cmdUp
    =conn.CreateCommand();
    cmdUp.CommandText
    ="update member set mword=@mword where mid=@mid";
    cmdUp.Parameters.Add(
    "@mword",SqlDbType.VarChar,20,"mword");
    cmdUp.Parameters.Add(
    "@mid",SqlDbType.Int,0,"mid");
    ada.UpdateCommand
    =cmdUp;
    try
    {
    ada.Fill(myds,
    "member");
    myDS.memberDataTable mdt
    =myds.member;
    mdt.RowChanged
    +=new DataRowChangeEventHandler(mdt_RowChanged);
    //直接使用方法来获得要更新的行
    myDS.memberRow mr=mdt.FindBymid(int.Parse(idToDel.Text));
    Trace.Warn(
    "in click handler before new mword",mr.RowState.ToString());
    //更改也是使用属性来操作
    mr.mword=newMword.Text;
    Trace.Warn(
    "in click handler after new mword",mr.RowState.ToString());
    ada.Update(myds,
    "member");
    Trace.Warn(
    "in click handler after update method",mr.RowState.ToString());
    foreach(myDS.memberRow dmr in mdt.Rows)
    {
    Response.Output.Write(dmr.mid
    +" "+dmr.mword+"<br>");
    }

    }

    catch(SqlException ex)
    {
    Trace.Warn(
    "sql error","outPut",ex);
    }

    catch(Exception ex)
    {
    Trace.Warn(
    "comm error","outPut",ex);
    }

    finally
    {
    ada.Dispose();
    }

    }


    //处理mdt_RowChanged事件的方法
    private void mdt_RowChanged(object sender, DataRowChangeEventArgs e)
    {
    Trace.Warn(
    "in mdt_RowChanged",e.Row.RowState.ToString());
    }


    }

    }

  • 相关阅读:
    textarea中的空格与换行
    js判断微信内置浏览器
    关于express4不再支持body-parser
    html5 geolocation API
    屏幕密度与分辨率
    nodebeginer
    手机浏览器下IScroll中click事件
    iphone手机上的click和touch
    AngularJS学习笔记一
    不用bootstrap实现居中适应
  • 原文地址:https://www.cnblogs.com/chorrysky/p/691537.html
Copyright © 2020-2023  润新知