ADO.NET_包括DataReader和dataSet的使用

本文分享了作者在ADO.NET编程中的实践经验,重点介绍了DataReader和DataSet的使用,包括如何通过SqlCommand添加SQL语句参数,以及在Winform应用中动态填充ComboBox、ListBox和fpSpread组件的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天总结了一下ADO.NET编程中DataReader和dataSet两个比较重要的对象的使用,完成了combobox,listbox,以及fpSpread动态添加数据的测试,对使用sqlCommand来添加SQL语句参数也有了一定的认识,希望分朋友们分享一下经验,当然也有不足,工作不忙的时候再好好修改~

1.首先MS SQL Server 2012 Management在本机创建的数据库test,另外两个表,部门表和员工表

2.winform编写,form1添加4个控件:button2,listBox1,comboBox1,fpSpread_yuangong然后进行编程

<没用定义新的类,有兴趣的朋友可以定义DBconnection这样的类,DB连接,字段等属性封装进去>最不能容忍的是公司限网连截图都不能上传,有时间再编辑

代码如下:

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 System.Collections;
using System.Data.SqlClient;
using FarPoint.Win.Spread;

namespace WindowsFormsApp_DB
{
    public partial class Form1 : Form
    {

        public static string dbconnstring = "server=Q1502LP0003\\SQLEXPRESS;database=test;uid=ammy;pwd=ammy714926;";
        //SqlConnection dbc = new SqlConnection("server=Q1502LP0003\\SQLEXPRESS;database=test;uid=ammy;pwd=ammy714926;");

        public SqlDbType sqlDbType { get; set; }

        public Form1()
        {
            InitializeComponent();
        }


        private void button2_Click(object sender, EventArgs e)
        {
            listBox1.Items.Clear();//每次清空
            SqlConnection dbc = new SqlConnection(dbconnstring);
            string sQuery = "";
            sQuery = "SELECT ";
            sQuery = sQuery + "* ";
            sQuery = sQuery + "FROM test.dbo.部门表 WITH(NOLOCK)";
            SqlCommand dbm = new SqlCommand(sQuery, dbc);
            dbc.Open();//连接到数据源
            SqlDataReader dbReader = dbm.ExecuteReader(CommandBehavior.CloseConnection);
            while(dbReader.Read())
            {
                //必须和DB表列名一致,或者用索引
                listBox1.Items.Add("部门编号是:"+dbReader["部门编号"].ToString().Trim());
                listBox1.Items.Add("部门名称是:" + dbReader["部门名称"].ToString().Trim());
                listBox1.Items.Add("部门职责是:" + dbReader["部门职责"].ToString().Trim());
                listBox1.Items.Add("-----------------------------");


            }
            dbReader.Close();
            dbc.Dispose();
            dbc.Close();//关闭数据源连接,因为SqlDataReader始终占有SqlConnection,需要在用完关闭
            dbc = null;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            initial(fpSpread_yuangong);
            setcombox(comboBox1);
            //属性设计器里:this.comboBox1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
        }

        private void initial(FpSpread spread)
        {
            spread.Sheets[0].ColumnCount = 4;
            spread.Sheets[0].ColumnHeader.Rows[0].Height = 30;
            spread.Sheets[0].ColumnHeader.Cells[0, 0].Text = "员工编号";
            spread.Sheets[0].ColumnHeader.Cells[0, 1].Text = "员工姓名";
            spread.Sheets[0].ColumnHeader.Cells[0, 2].Text = "联系电话";
            spread.Sheets[0].ColumnHeader.Cells[0, 3].Text = "email";
            spread.Sheets[0].Columns[0].Width = 60;
            spread.Sheets[0].Columns[1].Width = 80;
            spread.Sheets[0].Columns[2].Width = 80;
            spread.Sheets[0].Columns[3].Width = 160;
            
        }

        private void setcombox(ComboBox comboBox)
        {
            SqlConnection dbc = new SqlConnection(dbconnstring);
            string sQuery1 = "";
            sQuery1 = "select * from test.dbo.部门表";
            //sQuery1 = "select top 2 * from test.dbo.部门表";由此可见加载到dataset的数据不是整张表,而是由select决定的数据集
            SqlCommand dbm1 = new SqlCommand(sQuery1,dbc);
            SqlDataAdapter adapter = new SqlDataAdapter();
            dbc.Open();
            adapter.SelectCommand = dbm1;
            DataSet ds = new DataSet();
            DataTable bumen = ds.Tables.Add("内存部门表");
            adapter.Fill(bumen);

            dbc.Dispose();
            dbc.Close();//关闭数据源连接
            dbc = null;

            DataRow dr = bumen.NewRow();
            dr["部门编号"] = "";
            dr["部门名称"] = "全体";
            bumen.Rows.InsertAt(dr, 0);


            comboBox.ValueMember = "部门编号";
            comboBox.DisplayMember = "部门名称";
            comboBox.DataSource = bumen;

        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            searchStuff();
        }

        private void searchStuff()
        {
            string paraziduan = comboBox1.SelectedValue.ToString();
            string sQuery2 = "";
            if (paraziduan == "")//这里不是paraziduan == "全体"!这是显示的数据!所以调试了好久才发现!
            {
                sQuery2 = "select * from test.dbo.员工通讯录表";
            }
            else
            {
                sQuery2 = sQuery2 + "select * from test.dbo.员工通讯录表 where 所属部门 = @dbpara";
                //sQuery2 = sQuery2 + "select * from test.dbo.员工通讯录表where 所属部门"+para+"";这样写的话总是错,这种格式不知道错在哪里
            }

            SqlConnection dbc = new SqlConnection(dbconnstring);
            if (dbc.State.Equals(ConnectionState.Closed))
            {
                dbc.Open();
            }

            //以下是利用SqlCommand传参数的方法,很好用!
            SqlCommand dbm2 = new SqlCommand(sQuery2,dbc);
            dbm2.CommandText = sQuery2;
            SqlParameter para = new SqlParameter("@dbpara", SqlDbType.VarChar, 16);//生成一个名字为@dbpara的参数,字段数据类型和长度要和DB表字段设置一致
            para.Value = paraziduan;//给参数赋值
            dbm2.Parameters.Add(para);


            SqlDataAdapter adapter2 = new SqlDataAdapter();
            adapter2.SelectCommand = dbm2;
            DataSet ds2 = new DataSet();
            DataTable yuangong = ds2.Tables.Add("员工按部门选择表");
            adapter2.Fill(yuangong);

            dbc.Dispose();
            dbc.Close();//关闭数据源连接
            dbc = null;


            fpSpread_yuangong.DataSource = yuangong;
            for (int i = 0; i < yuangong.Rows.Count; i++)
            {
                fpSpread_yuangong.Sheets[0].ColumnCount = 4;//如果注释这行,奇怪的是会把dataTable的所以字段无差别全部显示?
                fpSpread_yuangong.Sheets[0].Cells[i, 0].Text = yuangong.Rows[i]["员工编号"].ToString();
                fpSpread_yuangong.Sheets[0].Cells[i, 1].Text = yuangong.Rows[i]["姓名"].ToString();
                fpSpread_yuangong.Sheets[0].Cells[i, 2].Text = yuangong.Rows[i]["电话号码"].ToString();
                //搞不清电子邮件一列为什么显示不出来?
                fpSpread_yuangong.Sheets[0].Cells[i, 3].Text = yuangong.Rows[i]["电子邮件"].ToString().Trim();
            }


        }


    }
}

效果图:

是今天业余学习的小结。对于DataReader和dataSet的区别,网上一搜就是一大堆,关键还是要理解和运用!

加油!

 

转载于:https://www.cnblogs.com/ammy714926/p/4724123.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值