zoukankan      html  css  js  c++  java
  • 第五节 21类型化DataSet 简单

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using _21类型化DataSet_2.DataSet1TableAdapters;
    using System.Data.SqlClient;
    
    /* 弱类型DataSet的缺点
     * 只能通过列名引用,dataset.Table[0].Rows[0]["age"],如果写错了列名编译时不会发现错误,因此开发时必须要记首列名
     * int age = Convert.Toint32(dataset.Rows[0]["age"]),取到的字段的值是object类型,必须小心翼翼的进行类型转换,不仅麻烦,而且容易出错
     * 将DataSet传递给其他使用者,使用者很难识别出有哪些些列可以供使用
     * 
     * 运行时才能知道所有列名,数据绑定麻烦,无法使用Winform. ASP.Net的快速开发功能
     * 
     * 自己动手写强类型DataSet(类型化DataSet,TypedDataSet),创建继承自DataSet的PersonDataSet类,封装出int? Age等属性和bool IsAgeNull等方法,向PersonDataSet中填充
     * 
     * VS自动生成强类型DataSet
     * 
     * 添加->新建项->数据集
     * 
     * 将表从服务器资源管理器拖放到DataSet中,注意拖放过程是自动根据表结构生成强类型dataSet类型,没有把数据也拖过来,程序还连的那个数据库,自动将数据库连接字符串写在了App.Config中
     * 
     * 代码中使用DataSet示例: CC_RecordTableAdapter adapter = new CC_RecotdTableAdapter();
     * 如何得知Adapter的类名? 选中DataSet中下半部分的Adapter,Name属性就是类名,需要右键点周类名->解析
     * 
     * 取得所有数据: adapter.GetData(), 例子程序: 历显示所有数据,i<adapter.Getdata().Count; 
     * adapter.GetData[i].Age;
     * 
     * 常见问题,类名敲不对,表名+TableAdapter,表名+DataTable,表名+Row,然后用"解析"来填充类名,别照着我的代码
     * 
     * 常见问题: 类的内部定义的类要通过包含namespace的全名来引用,不能省略,类的内部定义的类就能避免同一个namespace 下类不能重名的问题
     * 
     */
    /* 其了问题
     * 插入新行,调用Insert方法
     * 增加字段怎么办,dataSet设计器中点[配置],对话框中点(查询生成器),勾选新增加的字段即可,删除字段同样如此,如果是高手也可以直接手改SQL语句
     * 
     * 要修改字段就要重新配置生成,这就是强类型Dataset的弱点,因此强类型DataSet不一定真的就是强,还是叫"类型化DataSet吧
     * 常见错误: 报错,数据为空,判断列的值为空的方法: is**null
     * 
     * 为什么select方法会填充,update方法会更新,insert方法会插入?没有多么神奇,看看adapter的selectCommand等属性,是那些SQL语句在起作用,如果有需要完全可以手工调整
     * 
     * 
     * 
     * 增加新的SQL语句
     * 设计器的Adapter中点右键,选择"添加查询"->使用SQL语句,就可以添别致多种类型的SQL语句,如果是"select(返回行)"
     * 则SQL语句的列必须是对应的dataset类的父集合,生成两个方法:FillBy*和getBy*,方法名根据查询语句的意义定,比如FillByAge,FillBy是将结果填充到现有DataSet
     * GetBy是将结果以DataSet方式返回,建议两个都生成,方便以后,看看默认生成的GetData就明白了
     * 
     * GetDataByld, incAge
     * Select(返回单个值)就是ExecuteScalar
     *
     * 对于增加的Sql语句在代码中是以方法的形式使用的,方法的参数类型,顺序就是VS猜测的,如果不正确或者需要调整只要选中对应的语句,然后[属性]窗口中此伏彼起改parameters属性即可
     * 
     * 添加新的SQL语句本质论,探索寻源码,不能并发调用
     * 
     * 像使用普通类的方法一样使用Adapter,SQL语句不用再写在界面代码中,这就是一种类据访问层 DAL data Access Layer
     */
    
    namespace _21类型化DataSet_2
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                T_UserTableAdapter adapter = new T_UserTableAdapter();
                _21类型化DataSet_2.DataSet1.T_UserDataTable user = adapter.GetData();
                for (int i = 0; i < user.Count; i++) 
                {
                    _21类型化DataSet_2.DataSet1.T_UserRow us = user[i];
                    string msg = string.Format("姓名{0},年龄{1}",us.name, us.age);
                    MessageBox.Show(msg);
                }
                
                
                //更新Dataset
                //user[0].name = "aaa";
                //adapter.Update(user);
    
                //查入数据
                //adapter.Insert("小向",44);//好像这里并没有进数据库
    
                //SqlCommandBuilder builder = new SqlCommandBuilder(adapter);
                //adapter.Update(user);
    
    
                //adapter.Delete(
            }
    
            //引用一下类中的类
            private void button2_Click(object sender, EventArgs e)
            {
                Class1.User user = new Class1.User();
                user.age = 11;
                user.name = "小向";
                string msg = string.Format("姓名:{0},年龄:{1}",user.name,user.age);
                MessageBox.Show(msg);
            }
    
            private void button3_Click(object sender, EventArgs e)
            {
                T_UserTableAdapter adapter = new T_UserTableAdapter();
                _21类型化DataSet_2.DataSet1.T_UserDataTable user = adapter.GetData();
                _21类型化DataSet_2.DataSet1.T_UserRow p = user[0];
                //MessageBox.Show(p.name); //如果name的值为空,会报异常
                if (p.IsnameNull())
                {
                    MessageBox.Show("姓名为空");
                }
                else {
                    MessageBox.Show(p.name);
                }
            }
    
            private void button4_Click(object sender, EventArgs e)
            {
                T_UserTableAdapter adapter = new T_UserTableAdapter();
                int? age = adapter.GetByAge();
                MessageBox.Show(Convert.ToString(age));
    
            }
    
            private void tb_login_Click(object sender, EventArgs e)
            {
                string username = tb_username.Text;
                string passwrd = tb_password.Text;
                if (username != "" && passwrd != "")
                {
                    T_LoginTableAdapter adapter = new T_LoginTableAdapter();
                    _21类型化DataSet_2.DataSet1.T_LoginDataTable logins = adapter._GetByUserName(username);
                    if (logins.Count <= 0)
                    {
                        MessageBox.Show("用户名错误");
                    }
                    else {
                        _21类型化DataSet_2.DataSet1.T_LoginRow row = logins[0];
                        if (row.errortimes >= 3)
                        {
                            MessageBox.Show("用户被锁定!");
                        }
                        else {
                            if (row.password == passwrd)
                            {
                                MessageBox.Show("登陆成功!");
                                adapter.UpdateErrorTimesByUidzeor(row.id);
                            }
                            else {
                                MessageBox.Show("登陆失败!");
                                adapter.UpdateErrorTimesByUid(row.id);
                            }                    
                        }
                    }
                }
                else {
                    MessageBox.Show("用户名不能为空!");
                }
            }
        }
    }
    

      

  • 相关阅读:
    判断某个元素是否显示/隐藏
    文件file
    文件上传原理--FileReader
    angular搭建
    判断滚动条滚到底部
    bugDone
    webstorm界面主题
    自定义滚动条
    用电脑免费给手机发短信(转)
    c++ 面试常见问题
  • 原文地址:https://www.cnblogs.com/xiangxiaodong/p/2379787.html
Copyright © 2011-2022 走看看