使用版本,Unity2017.4.10 + VS2017 + SqlServer2012
=====================================ADO.Net方式访问SqlServer=====================================
因为Unity所支持的.Net库版本问题,我们无法再Unity里面使用Linq直接访问数据库,所以只能使用这种比较复杂的方式来访问数据库。
首先,说一下可能会出现的问题
1:我们想要使用ADO访问数据库,首先查看一下自己的版本,
然后,去到 C:\Program Files\Unity\Editor\Data\Mono\lib\mono\2.0 这个文件夹中将System.Data 拖入自己的Plugins里面,记住,别拖VS的,因为版本不支持,命名空间会出现找不到的情况
2:访问相关,因为我们使用的并不是VS本身的类库,所以一些VS里面可以使用的名称,在Unity里面会出现协议不支持的错误,经过测试 (local) . / 和主机名是会出现这种错误的,所以我们只能使用服务器地址,而如果是在本地测试,则直接使用 127.0.0.1即可
3:数据库相关:在你使用127.0.0.1这个地址访问数据库之前,记得先打开数据库,测试一下这个能否登录,如果登录失败,则
如果还是失败,但是使用自己的主机是可以登录的,那就先百度一下远程登录设置,在
================================================================================================
首先,设置一下数据库
当你设置完成后,记得使用127.0.0.1 用sa账号登录测试一下
之后,首先创建一个表,结构如下,nChar可以理解为是解析为Encoding.Unicode的字符串
==============================================代码=============================================
// SqlServer增删改查比较简单,此处就直接贴代码
using UnityEngine;
using System.Data.SqlClient;
class DataBase:MonoBehaviour
{
// 连接字符串 第一个是你的服务器地址 第二个使我们刚才创建的数据库 三 四 就是我们刚才设置的 SA
private string connSer = "Data Source=127.0.0.1;Initial Catalog=你创建的数据库;User Id=账号;Password=密码";
private static Connection Conn
{
Get
{
SqlConnection conn = new SqlConnection(connSer); // 使用连接字符串创建一个连接
conn.Open(); // 打开连接
return conn;
}
}
public static Test Select(string n)//查找数据 并返回
{
DATA data = null;
using (Conn)
{
try
{
//表示一个Sql 这里指向Conn的存储过程
SqlCommand select = new SqlCommand("select * from Test where name='" + n + "'", Conn);
SqlDataReader sr = select.ExecuteReader(); // 使用上面的语句查询数据库
while (sr.Read()) // 读取数据
data = new DATA(sr["name"], sr["pwd"], sr["info"]); //类似于字典的操作
Debug.Log(data.name);
}
catch (SqlException ex)
{
Debug.LogError(ex.Message);
}
}
return data;
}
}
class DATA // 我们在数据库中创建的表结构
{
public object name, pwd, info;
public DATA(object name, object pwd, object info)
{
this.name = name;
this.pwd = pwd;
this.info = info;
}
}
public static List SELECT() //上面查找数据的重载,表示查找全部数据
{
List data = new List();
using (Conn)
{
try
{
SqlCommand select = new SqlCommand("select * from Test where name!=-1", Conn);
SqlDataReader sr = select.ExecuteReader();
while (sr.Read())
data.Add(new DATA(sr["name"], sr["pwd"], sr["info"]));
}
catch (SqlException ex)
{
Debug.LogError(ex.Message);
}
}
return data;
}
2:Insert->插入数据: 注意,因为Name是主键,所以我们不可以插入一条已经存在的Name,解决方法就是在新建一张表,新增一个Id类型为Int的列为主键,并且在标识规范中选中让他自增加,然后把我们的相关数据Copy进新表中即可
插入代码的书写为 Insert into 表名(表中的字段)values(与字段对应的数据);
public static bool Insert(string name,string pwd,string info)}{
using (Conn)
{
if(Select(name).name != null) //如果已经存在 就直接返回false
return false;
SqlCommand insert = new SqlCommand(string.Fromat("insert into Test('name','pwd','info')values('{0}','{1}','{2}')",name,pwd,info),Conn);
insert.ExecuteNonQuery();
if(Select(name).name != null) // 我们插入后存在 返回true
return true;
}
return false;
}
3:UPDATE(更新)-------------
写法:Update 表名 Set 值 where 条件
// 例
using (Conn)
{
// 注意 我们需要先判断一下 这条数据是否存在
if(!string.IsNullOrEmpty(select("1").name))
return false;
SqlCommand update = new SqlCommand("UPDATE Test SET 'pwd'=hello,'info'='world' WHERE name=1", Conn); // 把name==1的数据 pwd设置为hello info字段设置文world
update.ExecuteNonQuery();
}
4:DELETE(删除)-----------
写法:Delete from 表名 where 条件
// 例 ----
public static bool DELETE(string name)
{
// 这里直接写name也可以 而这样写的原因是因为我们的name字段为nchar(10) 不足十位的会在后面补上空格 不信的话你可以打开insert几条数据 然后进入数据库查看
SqlCommand delete = new SqlCommand(string.Format(
"DELETE from Test where name='" +
SELECT(name).name + "'"
), Conn);
delete.ExecuteNonQuery();
return true;
}
=============================================C#Linq方式操作=======================================
unity因为版本的问题,所以并不支持Linq访问,但是不可否认Linq的数据操作是真的方便
(注:Linq可以用来访问字典,列表等很多数据,使用下面的方法)
注意:在看这里的时候,请确保你安装了Linq并且对Lambda(匿名表达式)有一定了解,
Linq的连接数据库方式和ADO.Net不同,他是通过添加组件进行操作,在Windows应用和控制台等可以直接引用VS类库的地方使用非常方便,代码量也比较精简。
----
-
你的命名和我的或许会有所不同,
static DataBaseDataContext db = new DataBaseDataContext(); // 实例化Linq 不需要using释放
当我们需要获取到数据时,就可以直接
public Test Select(string name)
{
// 使用Linq查找数据 并返回第一条 因为我们name不会重复,所以他其实也就只有一条数据
return (from d in db.Test
where d.name == name
select d).First();
}
///获取多条数据可以
public List Select()
{
return (from d in db.Test
where d.name != "-1"
select d).ToList();
}
而如果我们需要判断是否存在,而不需要获得他的数据时
static bool SelectAny(string name)
{
return db.Test.Any(a => a.name == name);
//也可以是用Where 筛选
return db.Test.Where(a=>a.name == name).Count() == 0;
}
删除
public int Delete(string name)
{
if(!SelectAny(name))
return -1; //数据不存在
db.Test.DeleteOnSubmit(Select(name)); // 这是我们上面写的方法,获得一条数据
db.SubmitChange(); //保存我们进行的修改
return SelectAny(name)?1:0; // 0 标识删除成功 1表示删除失败
}
插入--
static int Insert(string name, string pwd, string info)
{
if (SelectAny(name)) // 因为我们的主键是name所以需要判断一下
return -1;
Test t = new Test // 创建一条数据 但是还没有加入到数据库中
{
name = name,
pwd = pwd,
info = info,
};
db.Test.InsertOnSubmit(t); //插入数据
db.SubmitChanges(); //保存修改
if (SelectAny(name)) //如果我们插入成功
return 1;
return 0;
}
更新
static bool Update()
{
if(!SelectAny("1"))
return false;
Test t = Select("1"); // 和删除类似 先找到原有数据 在基础上进行修改,主键无法修改
t.pwd = "30";
t.info = "60";
db.SubmitChanges(); // 保存我们的修改
return true; // 这里可以在加一个判断 以确保数据的正确性
}