如何从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接收多个数据。

下面是一个完整的例子这个统一维基。它显示了如何使用服务器端的php和客户端的Unity

+ C#与Unity中的数据库进行交互。

用PDO添加分数

<?php

// Configuration

$hostname = 'localhot';

$username = 'yourusername';

$password = 'yourpassword';

$database = 'yourdatabase';

$secretKey = "mySecretKey"; // Change this value to match the value stored in the client javascript below

try {

$dbh = new PDO('mysql:host='. $hostname .';dbname='. $database, $username, $password);

} catch(PDOException $e) {

echo '<h1>An error has ocurred.</h1><pre>', $e->getMessage() ,'</pre>';

}

$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 '<h1>An error has ocurred.</h1><pre>', $e->getMessage() ,'</pre>';

}

}

?>

使用PDO检索得分

<?php

// Configuration

$hostname = 'localhost';

$username = 'yourusername';

$password = 'yourpassword';

$database = 'yourdatabase';

try {

$dbh = new PDO('mysql:host='. $hostname .';dbname='. $database, $username, $password);

} catch(PDOException $e) {

echo '<h1>An error has occurred.</h1><pre>', $e->getMessage() ,'</pre>';

}

$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请求访问的网站具有跨域策略。

<?xml version="1.0"?>

<cross-domain-policy>

<allow-access-from domain="*"/>

</cross-domain-policy>


来自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');

}

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

OAuth 协议。

以上是 如何从Unity连接到数据库 的全部内容, 来源链接: utcz.com/qa/420511.html

回到顶部