相关信息:
数据库:mysql、MySQLworkbench
IDE:VS
数据库内容:一张表(mk_sqltest),里面有四个列:
功能:增删查改
结构:两个cs文件,一个为具有输入和取出功能的sql_help辅助功能类,一个为主进程页面
详细要点:
1、相对于sql serve,mysql在使用时,ADO.NET五大对象:Connection、Command、DataReader、DataSet、DataAdapter以及一个参数SqlParameter都要有变化,最具体的就是加上“My”的前缀。另外sql server中SqlParameter用到的参数是[@a],而在mysql是[?a],即@->?。
2、在用c#操作mysql时,要先下载一个MySQL Connector/Net,类似的,在用java来控制时要用到MySQL Connector/J,下载后将MySQL Connector/Net打开运行,在当前项目里的解决方案资源管理器中,右键新建一个引用,引用对象为你方才安装的地址(默认一般为:C:\Program Files (x86)\MySQL\Connector NET 8.0\Assemblies\v4.5.2)的MySql.Data.dll文件。然后再using中添加一句using MySql.Data.MySqlClient;
3、通过服务器资源管理器建立的连接字符串,会缺少password,需要手动在字符串中添加。
另外找到了一个对连接字符串很有研究的网页,没有细看,贴出来,也许日后有用
4、当数据库中涉及到了具有自动增长(AI)的属性时,或者某个列不想让用户输入时,或者想要某个没有设置非空的列空着时:
insert into userInfo values(1,'aaa','1212');//第一个参数为自动增长参数
当数据表中有自增长主键时,当用SQL插入语句中插入语句带有ID列值记录的时候;
#方法①:
insert into userInfo values(null,'ddf','8979');
insert into userInfo values(0,'ddf','8979');
#方法②:
insert into userInfo(name,password) values('ddf','8979');
同理,如果你建立了某个方法,方法里使用了SqlParameter,有多个参数,但你现在调用这个方法不需要这么多参数,你可以直接把不需要的参数位传入null(数字似乎是0?)
5、console.readkey()的值问题
这个问题其实和本篇没啥关系,正巧用到,也记一记。
c#中readkey,输入a,得到的是A,输入8得到的是D8。
实际上,readkey得到的是键盘代码。键盘代码是一个枚举,比如说,D8代表数字区的8,A表示字母区的A(a)。
使用unity开发获得键盘输入也是这个道理。
6、退出控制台命令……
Environment.Exit(0);
//0代表正常退出,非0代表某种错误的退出
7、控制台,返回上级菜单……
简单的goto命令即可……
在同一个方法内,
aaaa:
xxxxx
xxxxx
xxxxx
goto aaaa;
8、转义字符……
这里仅仅记录@的简单用法,详细内容以及其他转义字符用法:点到这里
C#中转义字符分2中,一种是\,一种是@。
@符号在C#中有两个作用
作用1、在字符串的前面加@表示取消字符串中的转义
例如 string path=@"d:\root\subdir";
作用2、如果用户定义的对象名和系统关键字冲突,可以在变量前面加入@
例如 string @Class="this is a test";
转义字符 字符名称
\' 单引号
\" 双引号
\\ 反斜杠
\0 空字符
\a 警报符
\b 退格
\f 换页
\n 换行
\r 回车
\t 水平制表
\v 垂直制表
9、还是关于传参数和SqlParameter有关的:
string str="这里是sql语句,涉及到的参数为【?name】的形式,无引号"
MySqlParameter[] para =
{
new MySqlParameter("?name", MySqlDbType.VarChar),
new MySqlParameter("?sex", MySqlDbType.VarChar),
new MySqlParameter("?grade", MySqlDbType.Int16)
};
para[0].Value = name;
para[1].Value = sex;
para[2].Value = grade;
cmd.Parameters.Add(para[0]);
cmd.Parameters.Add(para[1]);
cmd.Parameters.Add(para[2]);
10、几个很好的博客,包括DataReader和DataSet的用法等。
这些文章未来自己会慢慢做个总结
ADO.NET操作MySQL数据库
总结:
1.DataReader对象读取数据库中数据只能一条条读取,并且是只读的,不可以修改;DataSet与DataAdapter对象读取的数据可以读取且可以修改,DataSet中可以存放很多表。
2.DataReader读取数据前需要手动写代码连接数据库,即conn.open(),查询完毕后需要手动写代码关闭数据库连接;DataSet与DataAdapter对象读取数据前不需要手动写代码连接数据库,会自动识别,若数据库连接没开,则开启,如果没有关闭,则自动关闭。
c# 连接Mysql数据库
MySqlDataReader
mysql 使用DataReader 读数据
DataSet用法详细 转
一、特点介绍
1、处理脱机数据,在多层应用程序中很有用。
2、可以在任何时候查看DataSet中任意行的内容,允许修改查询结果的方法。
3、处理分级数据
4、缓存更改
5、XML的完整性:DataSet对象和XML文档几乎是可互换的。
极为详细的内容介绍
——————————————————————————————————————————————
sql_help辅助功能类:
using MySql.Data.MySqlClient;
using System.Data;
namespace sql_test01
{
class sql_help
{
//该方法主要功能:提供字符串和三个参数后进行数据库的写入操作
static string ConnectionString = @"persistsecurityinfo=True;server=127.0.0.1;user id=root;Password=tr2719031;database=no9";
MySqlConnection conn = new MySqlConnection(ConnectionString);
public void sql_offer(string str, string name, string sex, int grade)
{
conn.Open();
MySqlCommand cmd = new MySqlCommand();
//这句不用cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection = conn;
string cmd_add = str;
//方法一
MySqlParameter[] para =
{
new MySqlParameter("?name", MySqlDbType.VarChar),
new MySqlParameter("?sex", MySqlDbType.VarChar),
new MySqlParameter("?grade", MySqlDbType.Int16)
};
para[0].Value = name;
para[1].Value = sex;
para[2].Value = grade;
cmd.Parameters.Add(para[0]);
cmd.Parameters.Add(para[1]);
cmd.Parameters.Add(para[2]);
//方法二
//cmd.Parameters.AddWithValue("?name",name);
//cmd.Parameters.AddWithValue("?sex",sex);
//cmd.Parameters.AddWithValue("?grade", grade);
cmd.CommandText = cmd_add;
//构建一个适配器 对象
MySqlDataAdapter da = new MySqlDataAdapter(cmd);
//构建内存中的数据集对象
DataSet ds = new DataSet();
//da.Fill(ds);
MySqlDataReader sdr = cmd.ExecuteReader();
cmd.Parameters.Clear();
sdr.Close();
conn.Close();
}
//该方法主要功能:提供字符串后进行数据库读取操作
public string sql_back(string str)
{
conn.Open();
MySqlCommand cmd = new MySqlCommand();
//这句不用cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection = conn;
string cmd_add = str;
cmd.CommandText = cmd_add;
//构建一个适配器 对象
MySqlDataAdapter da = new MySqlDataAdapter(cmd);
//构建内存中的数据集对象
DataSet ds = new DataSet();
//da.Fill(ds);
MySqlDataReader sdr = cmd.ExecuteReader();
string back = null;
while (sdr.Read())
{
back += "序号:"
+ sdr[0].ToString() + "\t"
+ "姓名:"
+ sdr[1].ToString() + "\t"
+ "性别:"
+ sdr[2].ToString() + "\t"
+ "年级:"
+ sdr[3].ToString() + "\t"
+ "\n"
;
}
cmd.Parameters.Clear();
sdr.Close();
conn.Close();
return back;
}
}
}
主进程:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//本练习主要为对数据库的增删改查
//实验对象是mysql
namespace sql_test01
{
class Program
{
//数据库表的信息为:序号、姓名、性别、年级
static void sql_add()
{Console.WriteLine("这里是增加功能");
Console.WriteLine("请输入姓名(name:string)、性别(sex:string)、年级(grade:int)");
String name, sex;
int grade;
name = Console.ReadLine();
sex = Console.ReadLine();
grade = Convert.ToInt16(Console.ReadLine());
sql_help sql_Help = new sql_help();
string str = "insert into mk_sqltest values(null,?name,?sex,?grade)";
sql_Help.sql_offer(str, name, sex, grade);
Console.WriteLine("操作成功!返回主菜单……");
Console.WriteLine("如果想要退出,请按数字 1 !");
string Key = Console.ReadKey().Key.ToString();
if (Key == "D1")
{
Environment.Exit(0);
}
Console.ReadLine();
}
static void sql_reduce()
{
Console.WriteLine("这里是删除功能");
Console.WriteLine("以下为当前数据库所有数据:");
string str = "select * from mk_sqltest";
sql_help sql_Help = new sql_help();
string back = sql_Help.sql_back(str);
Console.WriteLine(back);
Console.WriteLine("请输入您要删除的记录 序号:");
int n = Convert.ToInt32(Console.ReadLine());
str = "delete from mk_sqltest where id='" + n + "'";
sql_Help.sql_offer(str, null, null, 0);
Console.WriteLine("操作成功!返回主菜单……");
Console.WriteLine("如果想要退出,请按数字 1 !");
string Key = Console.ReadKey().Key.ToString();
if (Key == "D1")
{
Environment.Exit(0);
}
Console.ReadLine();
}
static void sql_modify()
{
Console.WriteLine("这里是修改功能");
Console.WriteLine("以下为当前数据库所有数据:");
string str = "select * from mk_sqltest";
sql_help sql_Help = new sql_help();
string back = sql_Help.sql_back(str);
Console.WriteLine(back);
Console.WriteLine("请输入您要修改的记录 序号:");
int n = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("请输入您要修改的记录的信息:姓名(name:string)、性别(sex:string)、年级(grade:int)");
String name, sex;
int grade;
name = Console.ReadLine();
sex = Console.ReadLine();
grade = Convert.ToInt16(Console.ReadLine());
str = "UPDATE mk_sqltest SET name = ?name , sex=?sex , grade=?grade WHERE id = '" + n + "'";
//sql_Help.sql_offer(str, n, name, sex, grade);
sql_Help.sql_offer(str, name, sex, grade);
Console.WriteLine("操作成功!返回主菜单……");
Console.WriteLine("如果想要退出,请按数字 1 !");
string Key = Console.ReadKey().Key.ToString();
if (Key == "D1")
{
Environment.Exit(0);
}
Console.ReadLine();
}
static void sql_query()
{
Console.WriteLine("这里是查询功能");
Console.WriteLine("请分别输入查询的列名(id/name/sex/grade)和值");
string column = Console.ReadLine();
string value = Console.ReadLine();
string str = "select * from mk_sqltest where " + column + "='" + value + "'";
sql_help sql_Help = new sql_help();
string back = sql_Help.sql_back(str);
Console.WriteLine(back);
if (back == null)
{
Console.WriteLine("查询失败!请检查您的输入数据!功能重启!" + "\n");
sql_query();
}
else
{
Console.WriteLine("操作成功!返回主菜单……");
Console.WriteLine("如果想要退出,请按数字 1 !");
string Key = Console.ReadKey().Key.ToString();
if (Key == "D1")
{
Environment.Exit(0);
}
}
Console.ReadLine();
}
static void Main(string[] args)
{
start:
Console.WriteLine("数据库测试:请输入数字选择您想要使用的功能:");
Console.WriteLine("1、在数据库中增加条目");
Console.WriteLine("2、在数据库中删除条目");
Console.WriteLine("3、在数据库中修改条目");
Console.WriteLine("4、在数据库中查询条目");
int message = Convert.ToInt16(Console.ReadLine());
switch (message)
{
case 1:
sql_add();
goto start;
break;
case 2:
sql_reduce();
goto start;
break;
case 3:
sql_modify();
goto start;
break;
case 4:
sql_query();
goto start;
break;
default:
break;
}
}
}
}