前言
因为工作由C++转为了C#,在此记录一下C#如何链接数据库,后期会考虑数据库的事务问题与线程问题,当前仅仅是一个简单的实现,能用就行。
一、准备工作
1.首先肯定是安装VS和MySql
2.获取Mysql.data.dll
可以从C:\Program Files (x86)\MySQL\MySQL Installer for Windows目录下找到该文件。如果没有,可以直接下载:下载地址然后解压至某个文件都行
3.添加引用
找到解决方案资源管理器,右击引用->添加引用
找到Mysql.data.dll
文件,勾选上就可以了
此时引用栏就会多出MySql.data的信息
至此准备前的工作就结束了
二、C#使用Sql
1.导入命名空间 using MySql.Data.MySqlClient;
2.配置参数:
Server
= 服务器IP地址;Database
= 数据库名称;UserID
= 数据库用户名;Password
= 数据库密码;Port
= 端口号
3.数据库的连接字符串
常规连接方法:
string connetStr = "server=127.0.0.1;port=3306;user=root;password=数据库密码; database=test;";
MySqlConnection conn = new MySqlConnection(connetStr);
但是上面容易写错,可以借用SqlConnectionStringBuilder
SQLConnectionStringBuilder 是一个用于构建 SQL Server 连接字符串的类。通过使用该类,可以更容易地构建和管理 SQL Server 连接字符串。
具体使用如下:
MySqlConnectionStringBuilder builder = new MySqlConnectionStringBuilder();
builder.UserID = "root";
builder.Password = "e9t6q4";
builder.Server = "127.0.0.1";
builder.Port = 13306;
builder.Database = "prc_d";
MySqlConnection m_sqlConnect = new MySqlConnection(builder.ConnectionString);
数据库连接字符串的参数
4.判断数据库是否连接成功
try
{
m_sqlConnect.Open();
Console.WriteLine("数据库连接成功");//打印信息
}
catch (MySqlException ex)
{
Console.WriteLine(ex.Message);//打印错误信息
}
5.数据库读写操作
参数 | 说明 |
---|---|
Server,host, data source, datasource, address, addr, network address | 服务器IP地址 |
Database,initial catalog | 数据库名 |
Port | socket 端口,默认 3306 |
ConnectionProtocol,protocol | 连接协议,默认 Sockets |
PipeName,pipe | 连接管道,默认 MYSQL |
UseCompression,compress | 连接是否压缩,默认 false |
AllowBatch | 是否允许一次执行多条SQL语句,默认 true |
Logging | 是否启用日志,默认 false |
SharedMemoryName | 内存共享的名称,默认 MYSQL |
UseOldSyntax,old syntax, oldsyntax | 是否兼容旧版的语法,默认 false |
ConnectionTimeout,connection timeout | 连接超时等待时间,默认15s |
DefaultCommandTimeout,command timeout | MySqlCommand 超时时间,默认 30s |
UserID, uid, username, user name, user | 数据库登录帐号 |
Password,pwd | 登录密码 |
PersistSecurityInfo | 是否保持敏感信息,默认 false |
Encrypt | Encrypt |
CertificatePassword | 证书的密码 |
CertificateStoreLocation | 证书的存储位置 |
CertificateThumbprint | 证书指纹 |
AllowZeroDateTime | 日期时间能否为零,默认 false |
ConvertZeroDateTime | 为零的日期时间是否转化为 DateTime.MinValue,默认 false |
UseUsageAdvisor, usage advisor | 是否启用助手,会影响数据库性能,默认 false |
ProcedureCacheSize,procedure cache, procedurecache | 同一时间能缓存几条存储过程,0为禁止,默认 25 |
UsePerformanceMonitor,userperfmon, perfmon | 是否启用性能监视,默认 false |
IgnorePrepare | 是否忽略 Prepare() 调用,默认 true |
UseProcedureBodies,procedure bodies | 是否检查存储过程体、参数的有效性,默认 true |
AutoEnlist | 是否自动使用活动的连接,默认 true |
RespectBinaryFlags | 是否响应列上元数据的二进制标志,默认 true |
TreatTinyAsBoolean | 是否将 TINYINT(1) 列视为布尔型,默认 true |
AllowUserVariables | 是否允许 SQL 中出现用户变量,默认 false |
InteractiveSession,interactive | 会话是否允许交互,默认 false |
FunctionsReturnString | 所有服务器函数是否按返回字符串处理,默认 false |
UseAffectedRows | 是否用受影响的行数替代查找到的行数来返回数据,默认 false |
OldGuids | 是否将 binary(16) 列作为 Guids,默认 false |
Keepalive | 保持 TCP 连接的秒数,默认0,不保持。 |
ConnectionLifeTime | 连接被销毁前在连接池中保持的最少时间(秒)。默认 0 |
Pooling | 是否使用线程池,默认 true |
MinimumPoolSize, min pool size | 线程池中允许的最少线程数,默认 0 |
MaximumPoolSize,max pool size | 线程池中允许的最多线程数,默认 100 |
ConnectionReset | 连接过期后是否自动复位,默认 false |
CharacterSet, charset | 向服务器请求连接所使用的字符集,默认:无 |
TreatBlobsAsUTF8 | binary blobs 是否按 utf8 对待,默认 false |
BlobAsUTF8IncludePattern | 列的匹配模式,一旦匹配将按 utf8 处理,默认:无 |
SslMode | 是否启用 SSL 连接模式,默认:MySqlSslMode.None |
6.数据库读写操作
ExcuteReader:执行多行查询,返回DataReader对象
ExcuteScalar:执行单行查询,返回查询结果的首行数据
代码演示
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MySql.Data.MySqlClient;
using System.Data;
namespace text
{
class DBManager
{
//SQL Server 连接字符串的类,可以更容易地构建和管理 SQL Server 连接字符串。
MySqlConnectionStringBuilder builder = new MySqlConnectionStringBuilder();
//MySQL 数据库连接的 .NET 客户端库中的类
private MySqlConnection m_sqlConnect;
//数据库操作的单例
private static readonly DBManager m_instance = new DBManager();
public static DBManager Instance
{
get
{
return m_instance;
}
}
private DBManager()
{
//配置连接数据库所需要的数据
builder.UserID = "root";
builder.Password = "e9t6q4";
builder.Server = "127.0.0.1";
builder.Port = 13306;
builder.Database = "prc_d";
//连接数据库
m_sqlConnect = new MySqlConnection(builder.ConnectionString);
Connect();
}
~DBManager()
{
Close();
}
//数据库是否连接判断
private bool Connect()
{
try
{
m_sqlConnect.Open();
Console.WriteLine("数据库连接成功");//打印信息
}
catch (MySqlException ex)
{
Console.WriteLine(ex.Message);//打印错误信息
return false;
}
return true;
}
//关闭数据库
private bool Close()
{
if (m_sqlConnect.State == ConnectionState.Closed)
{
Console.WriteLine("没有正在链接的数据库");//打印信息
return false;
}
try
{
m_sqlConnect.Close();
Console.WriteLine("数据库关闭成功");//打印信息
return true;
}
catch (MySqlException ex)
{
Console.WriteLine(ex.Message);//打印错误信息
}
return false;
}
//因为读写不太一样,所以分开来写
//读取数据,参数为sql操作语句
public MySqlDataReader DBRead(string sqlStr)
{
//从 MySQL 数据库中读取查询结果的类
MySqlDataReader reader = null;
try
{
if (m_sqlConnect.State != ConnectionState.Open)
{
Console.WriteLine("数据库未链接");
//尝试重新链接
Connect();
}
MySqlCommand command = new MySqlCommand(sqlStr, m_sqlConnect);
reader = command.ExecuteReader();
}
catch (MySqlException ex)
{
Console.WriteLine(ex.Message);//打印错误信息
}
return reader;
//-----------------------写在return之后,不单独去拉一个模块去写了-------------------------
// MySqlDataReader reader的用法
while (reader.Read())
{
//判断字段是否为null,为null数据转换会失败
if (!reader.IsDBNull(1))
{
// 输出第一列字段值
Console.WriteLine(reader.GetInt32(0));
// Console.WriteLine(reader.GetInt32("id"));
}
}
}
//更改数据库
public int DBWrite(string sqlStr)
{
if (m_sqlConnect.State != ConnectionState.Open)
{
Console.WriteLine("数据库未链接");
return -1;
}
try
{
MySqlCommand command = new MySqlCommand(sqlStr, m_sqlConnect);
return command.ExecuteNonQuery();//如果不等于0则表示更改成功,返回的结果是所更改的数据数
}
catch (MySqlException ex)
{
Console.WriteLine(ex.Message);//打印错误信息
return -1;
}
}
}
}