sql基础:http://www.w3school.com.cn/sql/index.asp
一、DataTable & DataSet
1.DataTable:表示内存中的一个数据表
2.DataSet:表示内存中的一个数据缓存,可以看作为DataTable的集合(字典)
// Put the next line into the Declarations section. private System.Data.DataSet dataSet; private void MakeDataTables() { // Run all of the functions. MakeParentTable(); MakeChildTable(); MakeDataRelation(); BindToDataGrid(); } private void MakeParentTable() { // Create a new DataTable. System.Data.DataTable table = new DataTable("ParentTable"); // Declare variables for DataColumn and DataRow objects. DataColumn column; DataRow row; // Create new DataColumn, set DataType, // ColumnName and add to DataTable. column = new DataColumn(); column.DataType = System.Type.GetType("System.Int32"); column.ColumnName = "id"; column.ReadOnly = true; column.Unique = true; // Add the Column to the DataColumnCollection. table.Columns.Add(column); // Create second column. column = new DataColumn(); column.DataType = System.Type.GetType("System.String"); column.ColumnName = "ParentItem"; column.AutoIncrement = false; column.Caption = "ParentItem"; column.ReadOnly = false; column.Unique = false; // Add the column to the table. table.Columns.Add(column); // Make the ID column the primary key column. DataColumn[] PrimaryKeyColumns = new DataColumn[1]; PrimaryKeyColumns[0] = table.Columns["id"]; table.PrimaryKey = PrimaryKeyColumns; // Instantiate the DataSet variable. dataSet = new DataSet(); // Add the new DataTable to the DataSet. dataSet.Tables.Add(table); // Create three new DataRow objects and add // them to the DataTable for (int i = 0; i<= 2; i++) { row = table.NewRow(); row["id"] = i; row["ParentItem"] = "ParentItem " + i; table.Rows.Add(row); } } private void MakeChildTable() { // Create a new DataTable. DataTable table = new DataTable("childTable"); DataColumn column; DataRow row; // Create first column and add to the DataTable. column = new DataColumn(); column.DataType= System.Type.GetType("System.Int32"); column.ColumnName = "ChildID"; column.AutoIncrement = true; column.Caption = "ID"; column.ReadOnly = true; column.Unique = true; // Add the column to the DataColumnCollection. table.Columns.Add(column); // Create second column. column = new DataColumn(); column.DataType= System.Type.GetType("System.String"); column.ColumnName = "ChildItem"; column.AutoIncrement = false; column.Caption = "ChildItem"; column.ReadOnly = false; column.Unique = false; table.Columns.Add(column); // Create third column. column = new DataColumn(); column.DataType= System.Type.GetType("System.Int32"); column.ColumnName = "ParentID"; column.AutoIncrement = false; column.Caption = "ParentID"; column.ReadOnly = false; column.Unique = false; table.Columns.Add(column); dataSet.Tables.Add(table); // Create three sets of DataRow objects, // five rows each, and add to DataTable. for(int i = 0; i <= 4; i ++) { row = table.NewRow(); row["childID"] = i; row["ChildItem"] = "Item " + i; row["ParentID"] = 0 ; table.Rows.Add(row); } for(int i = 0; i <= 4; i ++) { row = table.NewRow(); row["childID"] = i + 5; row["ChildItem"] = "Item " + i; row["ParentID"] = 1 ; table.Rows.Add(row); } for(int i = 0; i <= 4; i ++) { row = table.NewRow(); row["childID"] = i + 10; row["ChildItem"] = "Item " + i; row["ParentID"] = 2 ; table.Rows.Add(row); } } private void MakeDataRelation() { // DataRelation requires two DataColumn // (parent and child) and a name. DataColumn parentColumn = dataSet.Tables["ParentTable"].Columns["id"]; DataColumn childColumn = dataSet.Tables["ChildTable"].Columns["ParentID"]; DataRelation relation = new DataRelation("parent2Child", parentColumn, childColumn); dataSet.Tables["ChildTable"].ParentRelations.Add(relation); } private void BindToDataGrid() { // Instruct the DataGrid to bind to the DataSet, with the // ParentTable as the topmost DataTable. dataGrid1.SetDataBinding(dataSet,"ParentTable"); }
更深入的:https://msdn.microsoft.com/zh-cn/library/system.data.datatable(v=vs.110).aspx#
二、访问数据库的两种方式:
1.客户端每次访问数据库时,都会发送请求
2.将信息存储到DataSet中,对DataSet进行访问,断开与数据库的连接时发送请求。该方法可以避免频繁操作数据库,但是可能会出现数据库不同步的问题
三、c#连接mysql
1.下载MySql.Data.dll,然后在项目中添加该引用,并且使用MySql.Data.MySqlClient这个命名空间
2.
using MySql.Data.MySqlClient; using System; using System.Data; using System.Text; public class MySqlUtility { private static MySqlConnection mySqlConnection; private static DataSet dataSet; private static StringBuilder stringBuilder; /// <summary> /// 对于host,如果是本地的话,则写localhost /// 如果是局域网,则写本机的局域网IP /// </summary> /// <param name="host"></param> /// <param name="port"></param> /// <param name="database"></param> /// <param name="id"></param> /// <param name="password"></param> public static void Open(string host = "localhost", string port = "3306", string database = "test", string id = "hong", string password = "hong") { try { string s = string.Format("Server = {0};port = {1};Database = {2};User ID = {3};Password = {4};", host, port, database, id, password); mySqlConnection = new MySqlConnection(s); mySqlConnection.Open(); dataSet = new DataSet(); } catch(Exception e) { throw new Exception("服务器连接失败,请重新检查是否打开MySql服务。" + e.Message.ToString()); } } public static void Close() { if (mySqlConnection != null) { mySqlConnection.Close(); mySqlConnection = null; dataSet = null; stringBuilder = null; } } private static void ExecuteNotReturnDataSet(string statement) { //Debug.Log(statement); MySqlCommand mySqlCommand = new MySqlCommand(statement, mySqlConnection); mySqlCommand.ExecuteNonQuery(); } private static DataSet ExecuteReturnDataSet(string statement) { //Debug.Log(statement); MySqlDataAdapter mySqlDataAdapter = new MySqlDataAdapter(statement, mySqlConnection); mySqlDataAdapter.Fill(dataSet); return dataSet; } /// <summary> /// 插入一行中的全部数据,对于值,统一转化为字符串进行处理 /// INSERT INTO 表名称 VALUES (值1, 值2,....) /// </summary> /// <param name="tableName"></param> /// <param name="values"></param> public static void Insert(string tableName, string[] values) { stringBuilder = new StringBuilder("insert into " + tableName + " values (" + "'" + values[0] + "'"); for (int i = 1; i < values.Length; i++) { stringBuilder.Append("," + "'" + values[i] + "'"); } stringBuilder.Append(")"); ExecuteNotReturnDataSet(stringBuilder.ToString()); } /// <summary> /// 插入一行中的部分数据 /// INSERT INTO 表名称 (列1, 列2,...) VALUES (值1, 值2,....) /// </summary> /// <param name="tableName"></param> /// <param name="columnNames"></param> /// <param name="values"></param> public static void Insert(string tableName, string[] columnNames, string[] values) { stringBuilder = new StringBuilder("insert into " + tableName + " (" + columnNames[0]); for (int i = 1; i < columnNames.Length; i++) { stringBuilder.Append("," + columnNames[i]); } stringBuilder.Append(") values (" + "'" + values[0] +"'"); for (int i = 1; i < values.Length; i++) { stringBuilder.Append("," + "'" + values[i] + "'"); } stringBuilder.Append(")"); ExecuteNotReturnDataSet(stringBuilder.ToString()); } /// <summary> /// SELECT * FROM 表名称 /// </summary> /// <param name="tableName"></param> /// <returns></returns> public static DataSet Select(string tableName) { stringBuilder = new StringBuilder("select * from " + tableName); return ExecuteReturnDataSet(stringBuilder.ToString()); } /// <summary> /// SELECT 列名称 FROM 表名称 /// </summary> /// <param name="tableName"></param> /// <param name="columnNames"></param> /// <returns></returns> public static DataSet Select(string tableName, string[] columnNames) { stringBuilder = new StringBuilder("select " + columnNames[0]); for (int i = 1; i < columnNames.Length; i++) { stringBuilder.Append("," + columnNames[i]); } stringBuilder.Append(" from " + tableName); return ExecuteReturnDataSet(stringBuilder.ToString()); } /// <summary> /// SELECT 列名称 FROM 表名称 WHERE 列 运算符 值 /// </summary> /// <param name="tableName"></param> /// <param name="columnNames"></param> /// <param name="cols"></param> /// <param name="operations"></param> /// <param name="values"></param> /// <returns></returns> public static DataSet Select(string tableName, string[] columnNames, string[] cols, string[] operations, string[] values) { stringBuilder = new StringBuilder("select " + columnNames[0]); for (int i = 1; i < columnNames.Length; i++) { stringBuilder.Append("," + columnNames[i]); } stringBuilder.Append(" from " + tableName + " where " + cols[0] + operations[0] + "'" + values[0] + "'"); for (int i = 1; i < cols.Length; i++) { stringBuilder.Append(" and " + cols[i] + operations[i] + "'" + values[i] + "'"); } return ExecuteReturnDataSet(stringBuilder.ToString()); } /// <summary> /// UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值 /// </summary> /// <param name="tableName"></param> /// <param name="columnNames"></param> /// <param name="newValues"></param> /// <param name="cols"></param> /// <param name="oldValues"></param> public static void Update(string tableName, string[] columnNames, string[] newValues, string[] cols, string[] oldValues) { stringBuilder = new StringBuilder("update " + tableName + " set " + columnNames[0] + "='" + newValues[0] +"'"); for (int i = 1; i < columnNames.Length; i++) { stringBuilder.Append("," + columnNames[i] + "='" + newValues[i] + "'"); } stringBuilder.Append(" where " + cols[0] + " ='" + oldValues[0] + "'"); for (int i = 1; i < cols.Length; i++) { stringBuilder.Append(" and " + cols[i] + "='" + oldValues[i] + "'"); } ExecuteNotReturnDataSet(stringBuilder.ToString()); } /// <summary> /// DELETE FROM 表名称 WHERE 列名称 = 值 /// </summary> /// <param name="tableName"></param> /// <param name="columnNames"></param> /// <param name="values"></param> public static void Delete(string tableName, string[] columnNames, string[] values) { stringBuilder = new StringBuilder("delete from " + tableName + " where " + columnNames[0] + "='" + values[0] + "'"); for (int i = 1; i < columnNames.Length; i++) { stringBuilder.Append(" or " + columnNames[i] + "='" + values[i] + "'"); } ExecuteNotReturnDataSet(stringBuilder.ToString()); } }
四、unity连接mysql
1.在Assets下建一个文件夹,命名为Plugins,然后放入这些dll:http://pan.baidu.com/s/1i56gDfB
2.复制上面的脚本
3.
using UnityEngine; using System.Collections; using System.Data; //若出现ReflectionTypeLoadException错误,需要将Player Settings中的 //Api Compatibility Level改为.Net2.0 public class NewBehaviourScript : MonoBehaviour { void Start () { MySqlUtility.Open(); DataSet ds = MySqlUtility.Select("human", new string[] { "*" }, new string[] { "age" }, new string[] { "=" }, new string[] { "222" }); PrintLog(ds); MySqlUtility.Close(); } public void PrintLog(DataSet ds) { if (ds == null) { Debug.Log("DebugLog-------------DataSet is null"); return; }; DataTable dt = ds.Tables[0]; if (dt == null) { Debug.Log("DebugLog-------------DataTable is null"); } foreach (DataRow row in dt.Rows) { foreach (DataColumn column in dt.Columns) { Debug.Log(row[column]); } } } }