距离完成项目已经快两个月了,惊觉自学的数据库内容已经忘了差不多,这才赶紧写这才想起来要写写操作了,方便以后温习!
首先,学习一门语言先要知道它是什么,有什么用,简单介绍介绍MySQL
MySQL是一个关系型数据库管理系统,是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。
MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。其特点是体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型和大型网站的开发都选择 MySQL 作为网站数据库。
总而言之,可以理解为使用MySQL可以写出一个简陋版的Excel,但是这个“Excel”的可编程性更强,而且能够和同一个局域网内的用户交流,编辑、修改、保存同一个数据库表格。
下载也比较简单,进入下载网址,选择自己想要的版本,下载图片中红色框选的Installer
下载好之后看这个哔哩哔哩中的学习、下载教程,很快就能学会的,里面的老师讲的还挺详细的。
虽然MySQL下载好了,但是你很快就会发现MySQL的编译器非常原始,参考python的IDEA。DataGrip的用途类似Pycharm,也是一个编译器,使用起来很方便,有些地方甚至能自己生成代码,同样在这个学习、下载教程。
所以说Jetbrains公司YYDS!
1.要先下载并且安装好MySQL,才能和DataGrip连接。年少无知的时候MySQL都没装好就用DataGrip,这个顺序是不对的。
2.根据指示创建用户root与密码,确定serve主机localhost。创建无误之后与MySQL驱动通信,测试时遇到无法连接的问题。需要提前下载安装好MySQL Community,发生错误是因为没有安装社区,安装后还需要再URL后加上时区,否则也会报错。输入的URL为:
jdbc:mysql://localhost:3306?serverTimezone=UTC
使用C#和MySQL联合编写一个数据库,其功能包括增删查改等,以下将一一展示代码。原本想将所有资料开源,但是数据库集成到一个大的project里面了(含其他同学劳动成果),不好分割出来,所以大家一个个看、一个个学吧。
界面设计如下,只是一个简易数据库,大佬轻喷!
DataGrip中的表格设计包含两个表,一个是diary记录芯片数据,另一个是testy记录操作日志。两个表格的id相互关联,testy中的id是自增模式,而diary中的id序号是读取testy中的id生成的(一样的)。所以可以知道某一次的操作的对应芯片数据,方便查询。
在工具箱→NuGet包管理器→管理解决方案的NuGet程序包下载以下安装包。
先对public class中加入以下代码:
private MySqlConnectionStringBuilder builder = new MySqlConnectionStringBuilder();
private MySqlConnection connection;
我这里的设置是点击按钮,完成连接,所以要自己先创建一个事件,事件中的代码如下:
private void Connetc_database_Click(object sender, EventArgs e)
{
builder.UserID = "root";//root chip
builder.Password = "请输入你的密码";//
builder.Server = "localhost";// localhost
builder.Database = "请输入你要进入的数据库名称";
builder.AllowUserVariables = true;
connection = new MySqlConnection(builder.ConnectionString);
try
{
//打开数据库连接
connection.Open();
MessageBox.Show("数据库已经连接了!");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
增加的功能是手动增加操作员、设备状态、操作时间、芯片数量等。并且在按下按钮“一键写入”才完成。
⭐代码中的数据库信息要和你在DataGrip中创建的一致才行,不然会报错!
由于每个人要输入记录的东西都不一样,这里只展现核心代码,会用就不成问题。
private void One_click_input_basic_info_Click(object sender, EventArgs e)
{
//将时间转化为string格式,方便保存;
time.Text = DateTime.Now.ToString("yyyy-MM-dd HH:MM:ss");
//以下是写入的核心关键,当时就是因为不知道特定语法卡了很久;记得一定要与DataGrip表格中字段对应!
string sql = String.Format("insert into testy (operator,machineid,status,chip_number,rate,time)values('{0}','{1}','{2}','{3}','{4}','{5}');", operater.Text, machineid.Text, status.Text, chipnum.Text,rate.Text,time.Text);
MySqlDataAdapter mda = new MySqlDataAdapter(sql, connection);
DataSet ds = new DataSet();
mda.Fill(ds, "student");
dataGridView1.DataSource = ds.Tables["help"];
connection.Close();
}
还有一个显示表格的操作,很简单的,先需要创建dataGridView,然后加入以下代码,把testy这个表格在dataGridView中显示出来
private void Show_table1_Click_1(object sender, EventArgs e)
{
string sql = "select * from testy";
//string sql = "select max(id) from testy";
MySqlDataAdapter mda = new MySqlDataAdapter(sql, connection);
DataSet ds = new DataSet();
mda.Fill(ds, "worldlocationx");
//显示数据
dataGridView2.DataSource = ds.Tables["worldlocationx"];
connection.Close();
}
最终展示效果:
一定要先阅读代码,以下代码化为己用只需要改一些参数就行啦!
下面删除的是选定dataGridView1的某一行(这里同步删除多行也行),删除的是表格diary内的数据。
private void delete_location_info_Click(object sender, EventArgs e)
{
//定义计数值
int count = 0;
try
{
//连接数据库,我这里连接数据库的方法是自己写的,方法因人而异
connection.Open();
//connectMySQL();
//for循环,dataGridView1.SelectedRows.Count为鼠标选中行的数目,一次for循环删除一行数据
for (int i = 0; i < dataGridView1.SelectedRows.Count; i++)
{
//获得i行的编号
int xpos = Convert.ToInt32(dataGridView1.SelectedRows[i].Cells[2].Value);
//编写数据库删除代码,这里还用到了动态变量,用于改变每次id值
string dataToDo3 = $"delete from diary where xpos = {xpos}";
//创建MySqlCommand类用于SQL语句的执行
MySqlCommand cmd = new MySqlCommand(dataToDo3, connection);
//定义x接收返回值SQL语句返回值,为0则为执行失败
int x = cmd.ExecuteNonQuery();
//执行判断
if (x == 0)
{
MessageBox.Show("删除失败");
}
//若成功则计数值+1
count = count + 1;
}
//若计数值等于选中行的数目,代表成功完成所有行的删除
if (count == dataGridView1.SelectedRows.Count)
{
MessageBox.Show("删除成功");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
finally
{
connection.Close();
}
}
改的功能是设置成能够直接在dataGridView中更改,所以需要创建一个事件dataGridView_CellBeginEdit
在事件中的代码如下:
private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
int id = Convert.ToInt32(dataGridView1.Rows[e.RowIndex].Cells[0].Value.ToString());
int chipid = Convert.ToInt32(dataGridView1.Rows[e.RowIndex].Cells[1].Value.ToString());
int xpos = Convert.ToInt32(dataGridView1.Rows[e.RowIndex].Cells[2].Value.ToString());
int ypos = Convert.ToInt32(dataGridView1.Rows[e.RowIndex].Cells[3].Value.ToString());
string sql = String.Format("insert into diary (id,chipid,xpos,ypos)values('{0}','{1}','{2}','{3}');", id,chipid,xpos,ypos);
MySqlDataAdapter mda = new MySqlDataAdapter(sql, connection);
DataSet ds = new DataSet();
mda.Fill(ds, "student");
dataGridView1.DataSource = ds.Tables["help"];
connection.Close();
}
查询功能是使用comboBox按键,查询表的特殊字段。在public Form中加入comboBox的声明代码:
public Form3()
{
InitializeComponent();
comboBox1.Items.AddRange(new string[] { "id", "chip_number", "rate", "time", "operator", "status", "machineID" });
comboBox2.Items.AddRange(new string[] { "id", "chipid", "xpos", "ypos" });
}
在查询按钮事件中写入代码:
private void search_record_Click(object sender, EventArgs e)
{
string sql = String.Format("select * from testy where {0} ='{1}';", comboBox1.Text, textBox5.Text);
Console.WriteLine(sql);
MySqlDataAdapter mda = new MySqlDataAdapter(sql, connection);
DataSet ds = new DataSet();
mda.Fill(ds, "worldlocationx");
//显示数据
dataGridView2.DataSource = ds.Tables["worldlocationx"];
connection.Close();
}
需要在NuGet中下载一个GemBox.Spreadsheet方案包,然后正确引用using GemBox.Spreadsheet;输入以下代码即可导出显示在dataGridView2中的表格。
private void export_basic_info(object sender, EventArgs e)
{
SpreadsheetInfo.SetLicense("FREE-LIMITED-KEY");
ExcelFile excelFile = new ExcelFile();
ExcelWorksheet sheet = excelFile.Worksheets.Add("Test");
int columns = dataGridView2.Columns.Count;
int rows = dataGridView2.Rows.Count;
for (int j = 0; j < columns; j++)
{
sheet.Cells[0, j].Value = dataGridView2.Columns[j].HeaderText;
}
for (int i = 1; i < rows; i++)
{
for (int j = 0; j < columns; j++)
{
sheet.Cells[i, j].Value = dataGridView2[j, i - 1].Value.ToString().Trim();
}
}
excelFile.SaveXls("你想保存到的位置");
MessageBox.Show("生成成功");
}
很多时候是多个管理者共同管理一个database,所以需要“联网”设置,大家直接参考这个方法就好了,也不难!