如何从Unity连接到数据库

我试图通过Unity连接到MS SQL数据库。 但是,当我尝试打开连接时,我收到IOException:连接丢失。

我从Unity \ Editor \ Data \ Mono \ lib \ mono \ 2.0导入了System.Data.dll。 我使用以下代码:

using UnityEngine; using System.Collections; using System.Data.Sql; using System.Data.SqlClient; public class SQL_Controller : MonoBehaviour { string conString = "Server=myaddress.com,port;" + "Database=databasename;" + "User ID=username;" + "Password=password;"; public string GetStringFromSQL() { LoadConfig(); string result = ""; SqlConnection connection = new SqlConnection(conString); connection.Open(); Debug.Log(connection.State); SqlCommand Command = connection.CreateCommand(); Command.CommandText = "select * from Artykuly2"; SqlDataReader ThisReader = Command.ExecuteReader(); while (ThisReader.Read()) { result = ThisReader.GetString(0); } ThisReader.Close(); connection.Close(); return result; } } 

这是我得到的错误:

 IOException: Connection lost Mono.Data.Tds.Protocol.TdsComm.GetPhysicalPacketHeader () Mono.Data.Tds.Protocol.TdsComm.GetPhysicalPacket () Mono.Data.Tds.Protocol.TdsComm.GetByte () Mono.Data.Tds.Protocol.Tds.ProcessSubPacket () Mono.Data.Tds.Protocol.Tds.NextResult () Mono.Data.Tds.Protocol.Tds.SkipToEnd () Rethrow as TdsInternalException: Server closed the connection. Mono.Data.Tds.Protocol.Tds.SkipToEnd () Mono.Data.Tds.Protocol.Tds70.Connect (Mono.Data.Tds.Protocol.TdsConnectionParameters connectionParameters) Mono.Data.Tds.Protocol.Tds80.Connect (Mono.Data.Tds.Protocol.TdsConnectionParameters connectionParameters) 

请用这种方法忽略任何安全风险,我需要这样做进行测试,安全性会在以后发生。 感谢您的时间。

请使用此方法忽略任何安全风险

不要这样做 。 安全性会在之前或之后出现并不重要。 您将重新编写整个代码,因为密码在您的应用程序中是硬编码的,可以轻松地进行反编译和检索。 现在以正确的方式进行连接,这样您就不必重新编写整个应用程序。

使用php,perl或您熟悉的任何语言在服务器上运行数据库命令,但这应该在服务器上完成。

从Unity,使用WWWUnityWebRequest类与该脚本进行通信,然后,您将能够从Unity向服务器发送和接收信息。 那里有很多例子 。 即便如此,您仍然需要实现自己的安全性,但这比现在的要好得多。

您还可以使用json接收多个数据。

以下是Unity wiki的完整示例。 它展示了如何使用服务器端的php和客户端的Unity + C#与Unity中的数据库进行交互。

服务器端

使用PDO添加分数

 An error has ocurred.
', $e->getMessage() ,'

'; } $realHash = md5($_GET['name'] . $_GET['score'] . $secretKey); if($realHash == $hash) { $sth = $dbh->prepare('INSERT INTO scores VALUES (null, :name, :score)'); try { $sth->execute($_GET); } catch(Exception $e) { echo '

An error has ocurred.

', $e->getMessage() ,'

'; } } ?>

使用PDO检索得分

 An error has occurred.
', $e->getMessage() ,'

'; } $sth = $dbh->query('SELECT * FROM scores ORDER BY score DESC LIMIT 5'); $sth->setFetchMode(PDO::FETCH_ASSOC); $result = $sth->fetchAll(); if(count($result) > 0) { foreach($result as $r) { echo $r['name'], "\t", $r['score'], "\n"; } } ?>

在服务器上启用跨域策略

此文件应命名为“crossdomain.xml”,并放在Web服务器的根目录中。 Unity要求您要通过WWW请求访问的网站具有跨域策略。

     

客户/团结方

Unity的客户端代码连接到服务器,与PDO交互并根据调用的函数添加或检索分数。 稍微修改此客户端代码以使用最新的Unity版本进行编译。

 private string secretKey = "mySecretKey"; // Edit this value and make sure it's the same as the one stored on the server public string addScoreURL = "http://localhost/unity_test/addscore.php?"; //be sure to add a ? to your url public string highscoreURL = "http://localhost/unity_test/display.php"; //Text to display the result on public Text statusText; void Start() { StartCoroutine(GetScores()); } // remember to use StartCoroutine when calling this function! IEnumerator PostScores(string name, int score) { //This connects to a server side php script that will add the name and score to a MySQL DB. // Supply it with a string representing the players name and the players score. string hash = Md5Sum(name + score + secretKey); string post_url = addScoreURL + "name=" + WWW.EscapeURL(name) + "&score=" + score + "&hash=" + hash; // Post the URL to the site and create a download object to get the result. WWW hs_post = new WWW(post_url); yield return hs_post; // Wait until the download is done if (hs_post.error != null) { print("There was an error posting the high score: " + hs_post.error); } } // Get the scores from the MySQL DB to display in a GUIText. // remember to use StartCoroutine when calling this function! IEnumerator GetScores() { statusText.text = "Loading Scores"; WWW hs_get = new WWW(highscoreURL); yield return hs_get; if (hs_get.error != null) { print("There was an error getting the high score: " + hs_get.error); } else { statusText.text = hs_get.text; // this is a GUIText that will display the scores in game. } } public string Md5Sum(string strToEncrypt) { System.Text.UTF8Encoding ue = new System.Text.UTF8Encoding(); byte[] bytes = ue.GetBytes(strToEncrypt); // encrypt bytes System.Security.Cryptography.MD5CryptoServiceProvider md5 = new System.Security.Cryptography.MD5CryptoServiceProvider(); byte[] hashBytes = md5.ComputeHash(bytes); // Convert the encrypted bytes back to a string (base 16) string hashString = ""; for (int i = 0; i < hashBytes.Length; i++) { hashString += System.Convert.ToString(hashBytes[i], 16).PadLeft(2, '0'); } return hashString.PadLeft(32, '0'); } 

这只是一个如何正确执行此操作的示例。 如果您需要实现会话function并关心安全性,请查看OAuth 2.0协议。 应该有现有的库来帮助开始使用OAuth协议。

另一种方法是在命令提示符下创建自己的专用服务器,以进行通信并将其连接到统一到Handel多人游戏和SQL通信。 通过这种方式,您可以坚持使用一种语言创建。 但是学习曲线相当陡峭。