目录
1、将准备好的题目存储在数据库中:
可以使用爬虫,可以使用手动,这里先做个示例手动加几个。
(C#连接数据库方法在我之前的文章里:(4条消息) 使用Navicat连接MySQL的操作方法_代码骑士的博客-CSDN博客)
2、连接与查询
先准备好插件:
前三个:
后一个:
链接:https://pan.baidu.com/s/12_GISfD-kYUpQEwXDIL5cw
提取码:caad
(1)、建立连接与查询全部表数据代码:
using MySql.Data.MySqlClient;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using UnityEngine;
using UnityEngine.UI;
public class SQLTEST : MonoBehaviour
{
void Start()
{
SQL_TEST();
}
public void SQL_TEST()
{
//建立连接语句
string constr = "server=服务器IP地址;port=服务器端口;User Id=用户名;password=密码;Database=数据库名;charset=utf8";
//建立连接
MySqlConnection mycon = new MySqlConnection(constr);
//打开连接
mycon.Open();
//查询数据
string selstr = "select * from 表名";
MySqlCommand cmd = new MySqlCommand(selstr, mycon);//参数1:查询语句,参数2:创建的连接
MySqlDataReader reader = cmd.ExecuteReader();//读取游标
string _num;
string _quesiton;
string _A;
string _B;
string _C;
string _D;
string _answer;
List<string> s = new List<string>();
while(reader.Read())
{
_num = reader[0].ToString();//题号
_quesiton = reader[1].ToString();//题目
_A = reader[2].ToString();//A
_B = reader[3].ToString();//B
_C = reader[4].ToString();//C
_D = reader[5].ToString();//D
_answer = reader[6].ToString();//答案
s.Add(_num);
s.Add(_quesiton);
s.Add(_A);
s.Add(_B);
s.Add(_C);
s.Add(_D);
s.Add(_answer);
}
string texts="";
mycon.Close();
for (int i = 1; i < s.Count; i++)
{
texts += s[i - 1];
texts += '\n';
}
Debug.Log(texts);
}
}
输出样例:
(2)获取当前题目总数代码:
public void Que_Count()
{
//建立连接语句
string constr = "server=服务器公网网址;port=端口;User Id=用户名;password=密码;Database=数据库;charset=utf8";
//建立连接
MySqlConnection mycon = new MySqlConnection(constr);
//打开连接
mycon.Open();
//查看当前的题目数量
string selstr_1 = "select count(1) from quetest";
//提交查询语句
MySqlCommand cmd = new MySqlCommand(selstr_1, mycon);
//设置游标
MySqlDataReader reader = cmd.ExecuteReader();
//读取数据
string q_count ="";
while(reader.Read())
{
q_count = reader[0].ToString();
}
//关闭连接
mycon.Close();
Debug.Log("当前的题目总数为:"+q_count);
}
输出结果:
(3)插入新题目代码
public void INSERT_TEST()
{
//输出总数
Que_Count();
//建立连接语句
string constr = "server=服务器公网网址;port=端口;User Id=用户名;password=密码;Database=数据库;charset=utf8";
//建立连接
MySqlConnection mycon = new MySqlConnection(constr);
//打开连接
mycon.Open();
Debug.Log("请输入新添的题号、题目、ACBD选项及答案:");
/*
Text q_num;
Text q_que;
Text q_A;
Text q_B;
Text q_C;
Text q_D;
Text q_ans;
*/
//string _num = q_num.text;
//string _que = q_que.text;
//string _A = q_A.text;
//string _B = q_B.text;
//string _C = q_C.text;
//string _D = q_D.text;
//string _ans = q_ans.text;
//测试用例,正常使用上面的从场景中获取输入
string num = "6";
string que = "1+1?";
string A = "1";
string B = "2";
string C = "3";
string D = "4";
string ans = "2";
//Debug.Log("题号:"+num+"题目:"+que+"ACBD选项:"+A+B+C+D+"答案:"+ans);
string insertstr = "insert into quetest set number='"+ num + "',question='"+ que + "',A='"+ A + "',B='"+ B + "',C='"+ C + "',D='"+ D + "',Answer='"+ ans + "';";
//提交查询语句
MySqlCommand cmd = new MySqlCommand(insertstr, mycon);
MySqlDataReader reader = cmd.ExecuteReader();
while (reader.Read()) ;
//关闭连接
mycon.Close();
//输出总数
Que_Count();
}
结果:
插入前:
插入后:
(4) 删除指定题目代码
这里需要注意一点,删除操作是按题目编号删除的,因为是自己设置的题号没有让数据库自动编号,所以当删除的题不是最后一题时,原来的题号需要新的题来补充,如果发生题目序号乱序状态可以通过的表管理界面,右键排序(升序)即可恢复正常顺序。修改题目的方法也可以通过先删除和增加的方式实现或者用代码实现。
public void DELETE_TEST()
{
//输出总数
Que_Count();
//建立连接语句
string constr = "server=服务器公网网址;port=端口;User Id=用户名;password=密码;Database=数据库;charset=utf8";
//建立连接
MySqlConnection mycon = new MySqlConnection(constr);
//打开连接
mycon.Open();
Debug.Log("请输入要删除的题号:");
//Text num;
string num;
//测试用例
num = "2";//删除题目2
string deletestr = "delete from quetest where number='" + num + "'";
MySqlCommand cmd = new MySqlCommand(deletestr, mycon);//申请
MySqlDataReader reader = cmd.ExecuteReader();//提交
while (reader.Read()) ;//执行
//关闭连接
mycon.Close();
//输出总数
Que_Count();
}
输出结果:
删除前:
删除后:
(5)修改指定题目代码
public void UPDATE_TEST()
{
//UPDATE quetest set number = 7 WHERE number=1;
//建立连接语句
string constr = "server=服务器公网网址;port=端口;User Id=用户名;password=密码;Database=数据库;charset=utf8";
//建立连接
MySqlConnection mycon = new MySqlConnection(constr);
//打开连接
mycon.Open();
Debug.Log("请输入要删除的题号:");
//Text num;
string old_num;
string new_num;
//测试用例
old_num = "7";
new_num = "2";//修改题号7为题号2
string updatestr = "update quetest set number = '"+new_num+"' WHERE number='"+old_num+"'";
MySqlCommand cmd = new MySqlCommand(updatestr, mycon);//申请
MySqlDataReader reader = cmd.ExecuteReader();//提交
while (reader.Read()) ;//执行
//关闭连接
mycon.Close();
}
修改前:
修改后:
可以看到原本在最下面的7改为2后跳到了上面去,是因为设置了编号按升序排序。
(6)判断
判断输入的题目的答案是否正确。
public void JUDGE_TEST()
{
//以第4题为例
//4 中国共产党成立的具体时间是( )。
//A.1921年6月1号 B.1921年7月1号 C.1921年7月21号 D.1921年7月23号
//答案:1921年7月23号(选D)
//获取你的答案
string num_ = "4";//获取题号
string ans_ = "1921年7月1号";//B
string constr = "server=服务器公网网址;port=端口;User Id=用户名;password=密码;Database=数据库;charset=utf8";
//建立连接
MySqlConnection mycon = new MySqlConnection(constr);
//打开连接
mycon.Open();
//查看当前的题目数量
string selstr = "select * from quetest where number = '"+num_+"'";
//提交查询语句
MySqlCommand cmd = new MySqlCommand(selstr, mycon);
//设置游标
MySqlDataReader reader = cmd.ExecuteReader();
//读取数据
bool flag = false;
string qans = "";
while (reader.Read())
{
qans = reader[6].ToString();//获取题目答案
if(qans == ans_)
{
flag = true;
}
}
//关闭连接
mycon.Close();
if(flag)
{
Debug.Log("恭喜你,回答正确!");
}
else
{
Debug.Log("答案错误!正确答案是:"+qans);
}
}
结果:
答案不符:
答案正确:
(7)排名
最后我们再添加一个常用功能,新建一张表:得分表,将每次答完题后的分数进行存储,再按成绩大小进行排名最后实现排行榜,代码就放在这了,实现就是搭建场景的问题,由于时间原因我就先不在这里完整展示了。
public void RANK_TEST()
{
string constr = "server=服务器公网网址;port=端口;User Id=用户名;password=密码;Database=数据库;charset=utf8";
MySqlConnection mycon = new MySqlConnection(constr);
mycon.Open();
//读取数据
string selstr = "select * from 表";
MySqlCommand cmd = new MySqlCommand(selstr, mycon);
MySqlDataReader reader = cmd.ExecuteReader();
string temp1;
string temp2;
List<user> s = new List<user>();
while (reader.Read())
{
temp1 = reader[0].ToString();//用户名
temp2 = reader[2].ToString();//得分
s.Add(new user(temp1, int.Parse(temp2)));
}
s.Sort((x, y) => { return -x.score.CompareTo(y.score); });//升序排序
texts = " ";
for (int i = 0; i < s.Count; i++)
{
texts += ((i + 1).ToString() + "\t用户名: " + s[i].username + "\t" + " 总得分: " + s[i].score + " 分").ToString();
texts += '\n';
texts += '\n';
}
userName_And_userScore.text = texts;
mycon.Close();
}
public class user
{
public string username;
public int score;
public user(string username, int score)
{
this.username = username;
this.score = score;
}
}