zoukankan      html  css  js  c++  java
  • Net学习日记_ADO.Net_3_案例

    根据案例要求,在数据库中读取表格,进行增删改查等操作,并且还进行有效的管理。

    数据库建表

    create table PhoneType
    (
        ptId int identity(1,1) primary key,
        ptName nvarchar(50) 
    ) 
    
    go
    create table PhoneNum
    (
        pId int identity(1,1) primary key,
        pTypeId int not null,
        pName nvarchar(50),
        pCellPhone varchar(50),
        pHomePhone varchar(50)
    )
    go
    alter table PhoneNum
    add constraint FK_PhoneNum foreign key (pTypeId) references PhoneType(ptId)
    go
    
    create view view_Phone
    as 
        select pId, pTypeId, pName, pCellPhone, pHomePhone,ptName from dbo.PhoneNum
        inner join dbo.PhoneType on pTypeId = ptId
    go
    
    
    insert into PhoneType values('朋友')
    insert into PhoneType values('同事')
    insert into PhoneType values('同学')
    insert into PhoneType values('家人')
    
    
    insert into PhoneNum values(1,'刘备','13000000000','7000000')
    insert into PhoneNum values(1,'关羽','13000000001','7000001')
    insert into PhoneNum values(1,'张飞','13000000002','7000002')
    insert into PhoneNum values(2,'曹操','13300000003','8000003')
    insert into PhoneNum values(2,'大乔','13300000004','8000004')
    insert into PhoneNum values(3,'孙权','13400000003','9000003')
    insert into PhoneNum values(3,'小乔','13400000004','9000004')

    界面搭建

    其中黑色框用到DataGridView。

    什么样的类型可以作为DataGridView的数数据源:

    使用 DataGridView 控件,可以显示和编辑来自多种不同类型的数据源的表格数据。

    将数据绑定到 DataGridView 控件非常简单和直观,在大多数情况下,只需设置 DataSource 属性即可。在绑定到包含多个列表或表的数据源时,只需将 DataMember 属性设置为指定要绑定的列表或表的字符串即可。

    DataGridView 控件支持标准 Windows 窗体数据绑定模型,因此该控件将绑定到下表所述的类的实例:

    任何实现 IList 接口的类,包括一维数组。

    任何实现 IListSource 接口的类,例如 DataTable 和 DataSet 类。

    任何实现 IBindingList 接口的类,例如 BindingList(T) 类。

    任何实现 IBindingListView 接口的类,例如 BindingSource 类。

    DataGridView 控件支持对这些接口所返回对象的公共属性的数据绑定,如果在返回的对象上实现 ICustomTypeDescriptor 接口,则还支持对该接口所返回的属性集合的数据绑定。

    通常绑定到 BindingSource 组件,并将 BindingSource 组件绑定到其他数据源或使用业务对象填充该组件。BindingSource 组件为首选数据源,因为该组件可以绑定到各种数据源,并可以自动解决许多数据绑定问题。有关更多信息,请参见 BindingSource组件

    DataGridView 控件还可以在“取消绑定”模式下使用,无需任何基础数据存储区。有关使用未绑定的 DataGridView 控件的代码示例,请参见演练:创建未绑定的 Windows 窗体 DataGridView控件

    DataGridView 控件具有极高的可配置性和可扩展性,它提供有大量的属性、方法和事件,可以用来对该控件的外观和行为进行自定义。当需要在 Windows 窗体应用程序中显示表格数据时,请首先考虑使用 DataGridView 控件,然后再考虑使用其他控件(例如 DataGrid)。若要以小型网格显示只读值,或者若要使用户能够编辑具有数百万条记录的表,DataGridView 控件将为您提供可以方便地进行编程以及有效地利用内存的解决方案。

    主程序:

    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Data.SqlClient;
    using System.Windows.Forms;
    
    namespace PhoneTest
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                dgv.AutoGenerateColumns = false;
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                LoadData();
                LoadCbb();
            }
    
            void LoadCbb()
            {
                DataTable dt = SqlHelper.ExecuteDataTable("select * from PhoneType");
                // 在数据被绑定之前,要加入一个 不限
                DataRow dr = dt.NewRow();
                dr[0] = -1; //在数据库里面没有负数,但是在.Net里面有。
                dr[1] = "不限";
                // 切记,要把生成的行,插入数据表中。
                // 方法的第二参数说明,要插入下标为0得那一行的前面
                dt.Rows.InsertAt(dr,0);
                cbba.DisplayMember = "ptName";
                cbba.ValueMember = "ptId";
                cbba.DataSource = dt;
    
                DataTable dta = dt.Copy();
                cbbb.DisplayMember = "ptName";
                cbbb.ValueMember = "ptId";
                cbbb.DataSource = dta;
            }
    
            void LoadData()
            {
                // PhoneType与PhoneNum之间的关联语句,永远返回结果集。
                DataTable dt = SqlHelper.ExecuteDataTable("select * from PhoneNum as pn Left Join PhoneType as pt on pn.pTypeId = pt.ptId");
                dgv.DataSource = dt;
            }
    
            int tid;
            private void dgv_CellClick(object sender, DataGridViewCellEventArgs e)
            {
                // 取得当前点击行的第一个列的值,里面是编号
                DataGridViewRow drow = dgv.SelectedRows[0];
                tid = Convert.ToInt32(drow.Cells[0].Value);
    
                // 根据id,去数据库查询数据,把查询回来的时候赋值给txtBox
                // 因为程序是本地电脑上的,用户可以随意修改数据。
                // webform 很好修改
    
                SqlParameter sp = new SqlParameter("@id", tid);
                DataRow dr = SqlHelper.ExecuteDataTable("select * from PhoneNum where pId = @id", sp).Rows[0];
                tbName2.Text = dr[2].ToString();
                tbNum2.Text = dr[3].ToString();
                tbNum3.Text = dr[4].ToString();
                // WinFrom特别好的地方,可以直接关联,据说WebForm比较难实现。
                cbbb.SelectedValue = Convert.ToInt32(dr[1]);
    
            }
    
            private void btSave_Click(object sender, EventArgs e)
            {
                if (tid < 1) { return; }
                //取得当前我们要编辑的id
                int res = SqlHelper.ExecuteNonQuery("update PhoneNum set pTypeId=@pTypeId,pName=@pName,pCellPhone=@pCellPhone,pHomePhone=@pHomePhone where pId=@pid",
                    new SqlParameter("@pTypeId", SqlDbType.Int) { Value = cbbb.SelectedValue },
                    new SqlParameter("@pName", SqlDbType.NVarChar) { Value = tbName2.Text },
                    new SqlParameter("@pCellPhone", SqlDbType.NVarChar) { Value = tbNum2.Text },
                    new SqlParameter("@pHomePhone", SqlDbType.NVarChar) { Value = tbNum3.Text },
                    new SqlParameter("@pid", tid)
                    );
                if (res == 1)
                {
                    MessageBox.Show("修改成功");
                    LoadData();
                }
                else
                {
                    MessageBox.Show("联系管理员");
                }
            }
    
            private void btDelete_Click(object sender, EventArgs e)
            {
                if (tid < 1) { return; }
                int res = SqlHelper.ExecuteNonQuery("delete from PhoneNum where pId = @pid",
                    new SqlParameter("@pid", tid));
                if (res == 1)
                {
                    MessageBox.Show("删除成功!!");
                    LoadData();
                }
                else
                {
                    MessageBox.Show("联系管理员");
                }
            }
            //遗弃的方法,可以好好借鉴。
            private void btRearch_Click_1(object sender, EventArgs e)
            {
                // 要根据用户所输入的查找条件,动态的决定查询数据库的条件,就是Sql语句。
                string sql = "select * from PhoneNum ";
                List<string> list = new List<string>();
                if (Convert.ToInt32(cbba.SelectedValue) != -1)
                {
                    //如果用户选择过分组,添加pTypeId的筛选
                    string sqla = "pTypeId = " + cbba.SelectedValue;
                    list.Add(sqla);
                }
                if (!string.IsNullOrEmpty(tbName.Text.Trim()))
                {
                    // 如果用户填写了名字,那么要添加对pName的筛选
                    string sqlb = "pName = '" + tbName.Text.Trim()+"'";
                    list.Add(sqlb);
                }
                if (!string.IsNullOrEmpty(tbNum.Text.Trim()))
                {
                    // 如果用户填写了手机,就要添加pCellPhone的筛选
                    string sqlc = "pCellPhone = '" + tbNum.Text.Trim() + "'";
                    list.Add(sqlc);
                }
                if (list.Count > 0)
                {
                    sql += "where"+ string.Join(" and ", list.ToArray());
                }
                MessageBox.Show(sql);
            }
            //新方法
            private void btRearch_Click(object sender, EventArgs e)
            {
                // 要根据用户所输入的查找条件,动态的决定查询数据库的条件,就是Sql语句。
                string sql = "select * from PhoneNum as pn Left Join PhoneType as pt on pn.pTypeId = pt.ptId ";
                List<string> list = new List<string>();
                List<SqlParameter> listp = new List<SqlParameter>();
    
                if (Convert.ToInt32(cbba.SelectedValue) != -1)
                {
                    //如果用户选择过分组,添加pTypeId的筛选
                    string sqla = "pTypeId = @ptid";
                    list.Add(sqla);
                    listp.Add(new SqlParameter("@ptid", cbba.SelectedValue));
                }
                if (!string.IsNullOrEmpty(tbName.Text.Trim()))
                {
                    // 如果用户填写了名字,那么要添加对pName的筛选
                    string sqlb = "pName like @pName";
                    list.Add(sqlb);
                    listp.Add(new SqlParameter("@pName","%"+tbName.Text.Trim()+"%"));
                }
                if (!string.IsNullOrEmpty(tbNum.Text.Trim()))
                {
                    // 如果用户填写了手机,就要添加pCellPhone的筛选
                    string sqlc = "pCellPhone like @pCellPhone";
                    list.Add(sqlc);
                    listp.Add(new SqlParameter("@pCellPhone","%"+tbNum.Text.Trim()+"%"));
                }
                if (list.Count > 0)
                {
                    sql += " where " + string.Join(" and ", list.ToArray());
                }
                dgv.DataSource = SqlHelper.ExecuteDataTable(sql, listp.ToArray());
            }
    
           
    
        }
    }

    SqlHelper

    using System.Data;
    using System.Data.SqlClient;
    
    namespace PhoneTest
    {
        class SqlHelper
        {
            /// <summary>
            ///  获得初始
            /// </summary>
            static string constr = System.Configuration.ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
           // static string constr = "server=PC201609230944\SQL2005;database=HeiMaBlog;user=sa;pwd=123456";
            /// <summary>
            /// 增加一张表
            /// </summary>
            /// <param name="sql"></param>
            /// <param name="parameters"></param>
            /// <returns></returns>
            public static DataTable ExecuteDataTable(string sql, params SqlParameter[] parameters)
            {
                DataSet ds = new DataSet();
                SqlDataAdapter adapter = new SqlDataAdapter(sql,constr);
                adapter.SelectCommand.Parameters.AddRange(parameters);
    
                try
                {
                    adapter.Fill(ds);
                    return ds.Tables[0];
                }
                catch
                {
                    return null;
                }
            }
    
            /// <summary>
            /// 针对数据进行增删改
            /// </summary>
            /// <param name="sql"></param>
            /// <param name="parameters"></param>
            /// <returns></returns>
            public static int ExecuteNonQuery(string sql, params SqlParameter[] parameters)
            {
                using (SqlConnection conn = new SqlConnection(constr))
                {
                    using (SqlCommand cmd = new SqlCommand(sql, conn))
                    {
                        cmd.Parameters.AddRange(parameters);
                        conn.Open();
                        return cmd.ExecuteNonQuery();
                    }
                }
            }
    
    
        }
    }

    App.Config

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <connectionStrings>
        <add name="constr" connectionString="server=PC201609230944SQL2005;database=HeiMaBlog;user=sa;pwd=123456" />
      </connectionStrings>
    </configuration>

    别看短短几行代码,其实里面内容很多,利用Winform连接数据库,还是比较方便的。

  • 相关阅读:
    zoj3690 Choosing number
    zoj 3724 Delivery 离线处理+线段树
    hdu4422 The Little Girl who Picks Mushrooms
    hdu3555 Bomb 简单数位dp
    HDU2089 不要62 简单数位dp
    解析JSON的四种方式
    iOS中几种传值的方式
    iOS代码里面出现乱码的和模拟器没有添加模拟器的解决方法:
    UIAlterview的使用方法
    ios集成支付宝的功能
  • 原文地址:https://www.cnblogs.com/lisong-home/p/7764929.html
Copyright © 2011-2022 走看看