using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using System.Collections.Generic;
using System.Threading;
using System.Linq;
using System.IO;
using System.Data.SqlClient;
using System;

public class UnityTexture_SqlServer : MonoBehaviour
{
    public GameObject cube;
    public InputField inputField;

    static string str_SQL_Server = "server=Yct201902261943\\SQL_SERVER_2012;database=Unity;uid=sa;pwd=123";

    SqlConnection con = new SqlConnection(str_SQL_Server);

    private void Start()
    {
        if (cube == null)
        {
            cube = GameObject.Find("cube");
        }
        if (inputField == null)
        {
            inputField = GameObject.Find("inputField").GetComponent<InputField>();
        }
    }
    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Q))
        {
            SqlOpen();
            SQL_Texture();
            SqlClose();
            Debug.Log("Insert SQL Texture");
        }
        if (Input.GetKeyDown(KeyCode.W))
        {
            SqlOpen();
            Delete_TextureInfos(inputField.text);
            SqlClose();
            Debug.Log("Delete SQL Texture"); 
        }
        if (Input.GetKeyDown(KeyCode.E))
        {  
            Texture texture = cube.GetComponent<MeshRenderer>().material.mainTexture;
            Texture2D t2d = TextureToTexture2D(texture);
            byte[] bytesArr = t2d.EncodeToJPG();
            string Mesh_Texture = Convert.ToBase64String(bytesArr);
            SqlOpen();
            Update_TextureInfos(inputField.text, Mesh_Texture);
            SqlClose();
            Debug.Log("Update SQL Texture");

        }
        if (Input.GetKeyDown(KeyCode.R))
        {
            string Mesh_Texture = "";
            SqlOpen();
            
            string error = Select_TextureInfos(inputField.text, out Mesh_Texture);
            if (string.IsNullOrEmpty(error))
            {
                byte[] byte_Texture = System.Convert.FromBase64String(Mesh_Texture);

                Texture2D texture = new Texture2D(1, 1, TextureFormat.ARGB4444, false);
                var Is_Success = texture.LoadImage(byte_Texture);
                texture.Apply();
                cube.GetComponent<MeshRenderer>().material.mainTexture = texture;
            }
            SqlClose();
            Debug.Log("Select SQL Texture");
        }
    }
    private void SQL_Texture()
    {
        string strPath = @"C:\Users\Administrator\Desktop\Texture";

        DirectoryInfo theFolder = new DirectoryInfo(strPath);

        FileInfo[] theFiles = theFolder.GetFiles();

        for (int i = 0; i < theFiles.Length; i++)
        {
            string Texture_Name = Path.GetFileNameWithoutExtension(theFiles[i].FullName);

            FileStream fs = new FileStream(theFiles[i].ToString(), FileMode.Open);

            byte[] byte_Texture = new byte[(int)fs.Length];

            fs.Read(byte_Texture, 0, (int)fs.Length);

            fs.Close();

            string Mesh_Texture = System.Convert.ToBase64String(byte_Texture);

            string str_error_meshInfos = Insert_TextureInfos(Texture_Name, Mesh_Texture);

            Thread.Sleep(100);

            if (str_error_meshInfos != null) { Debug.LogError(str_error_meshInfos); }
        }
    }

    private Texture2D TextureToTexture2D(Texture texture)
    {
        Texture2D texture2D = new Texture2D(texture.width, texture.height, TextureFormat.RGBA32, false);
        RenderTexture currentRT = RenderTexture.active;
        RenderTexture renderTexture = RenderTexture.GetTemporary(texture.width, texture.height, 32);
        Graphics.Blit(texture, renderTexture);

        RenderTexture.active = renderTexture;
        texture2D.ReadPixels(new Rect(0, 0, renderTexture.width, renderTexture.height), 0, 0);
        texture2D.Apply();

        RenderTexture.active = currentRT;
        RenderTexture.ReleaseTemporary(renderTexture);

        return texture2D;
    } 

    private void SqlOpen()
    {
        SqlClose();
        con.Open();
    }

    private string Insert_TextureInfos(string Texture_Name, string Mesh_Texture)
    {
        string str_return = null;
        try
        {
            string insert = "INSERT INTO[Unity].[dbo].[Table_Texture] ([Texture_Name],[Mesh_Texture]) values( '" + Texture_Name + "','" + Mesh_Texture + "')";
            SqlCommand com_insert = new SqlCommand(insert, con);
            com_insert.ExecuteNonQuery();
        }
        catch (Exception e)
        {
            str_return = e.ToString();
        }
        return str_return;
    }

    private string Delete_TextureInfos(string Texture_Name)
    {
        string str_return = null;
        try
        {
            string delete = "DELETE FROM [Unity].[dbo].[Table_Texture] WHERE [Texture_Name] = '" + Texture_Name + "'";
            SqlCommand com_insert = new SqlCommand(delete, con);
            com_insert.ExecuteNonQuery();
        }
        catch (Exception e)
        {
            str_return = e.ToString();
        }
        return str_return;
    }

    private string Update_TextureInfos(string Texture_Name, string Mesh_Texture)
    {
        string str_return = null;
        try
        {
            string update = "UPDATE [Unity].[dbo].[Table_Texture] SET [Mesh_Texture] = '" + Mesh_Texture + "' WHERE [Texture_Name] = '" + Texture_Name + "'";
            SqlCommand com_insert = new SqlCommand(update, con);
            com_insert.ExecuteNonQuery();
        }
        catch (Exception e)
        {
            str_return = e.ToString();
        }
        return str_return;
    }

    private string Select_TextureInfos(string Texture_Name, out string Mesh_Texture)
    {
        string str_return = "";
        Mesh_Texture = null;

        try
        {
            string select = "SELECT * FROM [Unity].[dbo].[Table_Texture] WHERE [Texture_Name] = '" + Texture_Name + "'";
            SqlCommand com_select = new SqlCommand(select, con);
            com_select.ExecuteNonQuery();

            SqlDataReader read = com_select.ExecuteReader();

            if (read.Read())
            {
                Mesh_Texture = read["Mesh_Texture"].ToString();
            }
            read.Close();
            com_select.Dispose();
        }
        catch (Exception e)
        {
            str_return = e.ToString();
            Mesh_Texture = null;
        }
        return str_return;
    } 

    private void SqlClose()
    {
        con.Close();
    }
}

如果在Unity调试测试都是可以的(本机数据库是SQL Server 2012 ),但是build后,运行生成的exe文件时却无法连接数据库。

请把I18N.CJK.dll,I18N.dll ,I18N.West.dll 这个三个DLL 加入到Assets文件夹下,然后build就可以了。

三个dll的位置:C:\Program Files \Unity\Editor\Data\Mono\lib\mono\unity(本机),或者 :链接:https://pan.baidu.com/s/1iiUWGSCR7mgnAwSXexvD7g   提取码:qq53 

 

posted on 2021-03-31 09:57  _萧朗  阅读(143)  评论(0编辑  收藏  举报