c#实现打开数据库并进行查询,修改等操作

作者(x41614024)

c#连接数据库需要引用一些东西,首先我们引用:using System.Data.OleDb。

其次我们需要拖动一些控件,包括button,combobox,datagridview等。。。这里就不一一说明了。效果图如下

 

1.能不能自己选择打开某个数据库呢?而不是在代码里面就已经确定我要打开某个数据库了?

首先要写的是下面的这个代码,这个代码是写在form里买的全局变量,因为如果写在某个button的响应事件,就成为了局部变量,以后不能去引用,很麻烦。

string dbname = "";//数据库的名称,带后缀
        string db_con = "";//建立connection是需要提供的版本信息,数据库名称
        string sql = "";//从数据库中查询表格的SQL语句
        OleDbConnection conn = new OleDbConnection();//建立一个数据库连接的类
        DataSet dat = new DataSet();//建立一个内存数据库,用来保存你连接的数据库
        OleDbDataAdapter ad;//建立一个各种类,用来进行数据库和内存的操作关联必须,笔者也不是很理解这些类的作用
        OleDbCommand comd;
        OleDbDataReader read;
        OleDbCommandBuilder bu;
        DataTable students;  

这个代码是写在一个button控件里面的click响应函数里面的,实现连接数据库,并且将其表现在datagridview控件中

 OpenFileDialog of = new OpenFileDialog();
            of.ShowDialog();
            dbname = of.SafeFileName;//open file and get the name of file       
            db_con = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + dbname;//fill the datasource with file name
            conn.ConnectionString = db_con;
            conn.Open();
            sql = "SELECT * FROM student";
            ad = new OleDbDataAdapter(sql, conn);
            bu = new OleDbCommandBuilder(ad);
            ad.Fill(dat,"neicun_table");
            students = dat.Tables[0];
            ad.Update(dat, "neicun_table");
            dataGridView1.DataSource = students;

 

2.如何建立一个combobox,使其实现自动获取数据库的各个字段名称并且显示呢?这样就可以根据条件来筛选出自己想要的数据了?

其实很简单只需要下面的几行代码(此代码也是写在button1控件里面的)就可以获取你数据库的所有字段名称,并且显示到combobox中

 for (int i = 0; i < this.dataGridView1.Columns.Count; i++)
              {
                  comboBox1.Items.Add(this.dataGridView1.Columns[i].HeaderText);
              }

 

3.还想实现另外一个combobox,当选中combobox1中某个字段时,该combobox自动显示出该字段下面的所有值,用来作为筛选条件。代码写在combobox1中的seleceindexchange事件中,意思是选中的下标状态改变时,执行此事件

这里用到的时datareader类,该类可以读取数据库,调用其中的获取指定列字段名的方法,获得你选择的字段。不过后来笔者发现,有更简单的办法

ad = new OleDbDataAdapter(sql, conn);
            ad.Fill(dat, "neicun_table");
            comd = new OleDbCommand();
            comd.CommandText = sql;
            comd.Connection = conn;
            read = comd.ExecuteReader();
            string col_title = read.GetName(comboBox1.SelectedIndex);
        comboBox2.DataSource = dat;
      comboBox2.DisplayMember = "neicun_table." + col_title;

  

只需要一行代码,就可以实现,如果采用这种办法,则不需要定义全局变量 OleDbCommand comd;OleDbDataReader read;

comboBox2.DataSource = dat;
comboBox2.DisplayMember = "neicun_table." + comboBox1.SelectedItem;

 但是这里有个小小的问题,如果该字段是性别,那么就会出现一些不是很好的情况,你会发现有男女重复的展示,笔者这里没有对此优化,如果大家有好的办法,可以交流一下。

 

 4.那么就到了最后一步了,当我确定了筛选条件之后,如何改变datagridview的值呢,实现同步的更新?

笔者的思路是,在点击查询按钮时,通过获取combobox1的与combobox2的selectitem值,分别获得要查询的字段以及对应的值,通过sql语句进行查询特定的数据,然后更新到datagridview中。

但是发现运行时,查询的结果为空,经过调试发现是combobox2的selectitem的值有错误。

并不能获取所选择的值,于是猜测应该是这段代码的问题(写在combox1_selectindexchange函数响应代码段),这里为combobox2绑定了数据源,同时设置了displaymember为选择的字段的所有值。

但是displaymember不等于item,所以用selectitem不能得到想要的结果,因此需要修改代码

comboBox2.DataSource = dat;
            comboBox2.DisplayMember = "neicun_table." + comboBox1.SelectedItem;

 

int j = comboBox1.SelectedIndex;
            comboBox2.Items.Clear();
            for (int i = 0; i < this.dataGridView1.Rows.Count-1; i++)
            {
                comboBox2.Items.Add(this.dataGridView1.Rows[i].Cells[j].Value);
            }

  

这种方法,通过循环获得datagridview1指定单元格的值,并且分别用combobox.items.add的方法向combobox2中添加数据,至此已经可以进行查询了。

 

但是发现又有问题。

因为每次查询之后,datagridview就会更新,这样的话再次获取datagridview的值就不是最初的完整的数据库的值了,所以查询就会出现问题,每次查询都会使下一次的查询范围变小。

此刻心态真的有点爆炸,但是还是要解决问题的对吧,那么这个问题如何解决呢?

5.解决该方法笔者有两个思路:

(1)在重置按钮上的click函数上可以令datagridview.datasource为内存中的数据库表格,因为内存中的数据库在操作过程中一直没有修改

 dataGridView1.DataSource = students;

(2)在combobox1和combobox的selectindexchange函数中,在函数的最前面写更新datagridview.datasource的函数,所以每次改变选择时,都会更新datagridview。

这种方法有一点交互上的怪异,就是在第一次查询出结果后,再下拉combobox1或者combobox2就会自动更新datagridview,给人感觉怪怪的。

dataGridView1.DataSource = students;//将这句代码插在combobox1与combobox2的selectindexchange函树体的最前面就ok

  

(3)修改combobox获取数据库字段名和数据的方法,不从datagridview中获取,从内存中的dataset中获取,这种方法由于要把前面的代码基本重写,所以就暂不考虑去更改了。不过有兴趣的可以尝试。

  

 

转载于:https://www.cnblogs.com/qin5429/p/10055908.html

  • 4
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,你需要在数据库中创建一个用户表来存储用户信息,例如用户名、密码和其他相关信息。然后,你需要编写一个登陆窗口和主窗口的代码。 在登陆窗口中,你需要编写代码来验证用户输入的用户名和密码是否正确。如果正确,你可以将用户的信息存储在一个变量中,并在主窗口中使用这些信息。 在主窗口中,你可以根据用户的信息从数据库中检索相关的数据,并在窗口中显示这些数据。以下是一个简单的示例代码: ``` // 登陆窗口代码 private void btnLogin_Click(object sender, EventArgs e) { string username = txtUsername.Text; string password = txtPassword.Text; // 连接数据库查询用户信息 string connectionString = "Data Source=YOUR_DATABASE_SERVER;Initial Catalog=YOUR_DATABASE_NAME;Integrated Security=True"; string query = "SELECT * FROM Users WHERE Username='" + username + "' AND Password='" + password + "'"; SqlConnection connection = new SqlConnection(connectionString); SqlCommand command = new SqlCommand(query, connection); connection.Open(); SqlDataReader reader = command.ExecuteReader(); // 如果用户存在,则保存用户信息并打开主窗口 if (reader.HasRows) { reader.Read(); int userId = reader.GetInt32(0); string userFullName = reader.GetString(1); // 保存用户信息到变量中 User currentUser = new User(userId, username, userFullName); // 打开主窗口,并传递用户信息 MainForm mainForm = new MainForm(currentUser); mainForm.Show(); this.Hide(); } else { MessageBox.Show("Invalid username or password"); } reader.Close(); connection.Close(); } // 主窗口代码 public partial class MainForm : Form { private User currentUser; public MainForm(User user) { InitializeComponent(); // 保存当前用户信息 currentUser = user; // 根据用户信息从数据库中检索相关数据 string connectionString = "Data Source=YOUR_DATABASE_SERVER;Initial Catalog=YOUR_DATABASE_NAME;Integrated Security=True"; string query = "SELECT * FROM UserData WHERE UserId=" + currentUser.Id; SqlConnection connection = new SqlConnection(connectionString); SqlCommand command = new SqlCommand(query, connection); connection.Open(); SqlDataReader reader = command.ExecuteReader(); // 在窗口中显示相关数据 if (reader.HasRows) { reader.Read(); string userData = reader.GetString(1); txtData.Text = userData; } reader.Close(); connection.Close(); } } // 用户类 public class User { public int Id { get; set; } public string Username { get; set; } public string FullName { get; set; } public User(int id, string username, string fullName) { Id = id; Username = username; FullName = fullName; } } ``` 在这个示例代码中,我们假设用户表中有两个列:Id、Username、Password和FullName。我们还假设UserData表中有两个列:UserId和Data。 在登陆窗口中,我们首先获取用户输入的用户名和密码,并使用这些信息查询用户表。如果用户存在,则我们将其信息存储在一个User对象中,并打开主窗口。否则,我们显示一个错误消息。 在主窗口中,我们首先在构造函数中保存当前用户信息。然后,我们使用这些信息从数据库中检索UserData表中的相关数据,并在窗口中显示它。 请注意,这只是一个简单的示例代码,你需要根据你的特定需求进行修改。还要注意安全性问题,例如使用参数化查询来防止SQL注入攻击。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值