Unity关于SqlServer的操作

    使用版本,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<DATA> SELECT() //上面查找数据的重载,表示查找全部数据
{
    List<DATA> data = new List<DATA>();
    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<Test> Select()
{
     return (from d in db.Test
             where d.name != "-1"
             select d).ToList<Test>();
}

而如果我们需要判断是否存在,而不需要获得他的数据时

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;          // 这里可以在加一个判断 以确保数据的正确性
}

 

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页