BOLT.NET中的關於數據庫鏈接和使用的LUA與C#語言的交互設計

因爲實際上手過的界面引擎也就只有迅雷的BOLT,其主要的特點在於採用XML,LUA以及C++或者C# .NET等多語言混合編程的設計開發模式,通過XML可以十分方便快捷的進行窗體對象樹的創建,控件間的關係通過樹形圖的方式進行佈局和設計,並提供綁定響應事件的解決方案,可讀性和可維護性有保證;

此外,各個控件的響應方法主要通過LUA腳本代碼的編寫來進行實現,LUA小巧精悍,在編寫的時候可以快速上手減輕負擔。至於引擎環境的搭建目前比較成熟的主要有基於C++或者C# .net平臺的兩種。使用BOLT進行項目開發過程中最令人頭疼的是各個語言間的交互設計,在其中有很大的難題,而且只能由開發者自身去解決。我在使用BOLT進行數據信息管理系統的開發的時候,需要用到數據庫的鏈接,這其中需要涉及到一些數據的讀取和更新,然而已知的解決方案只有通過壓棧的方式一個一個的將數據傳入LUA端然後在進行界面的更新,這既阻礙了數據信息處理的連續性也大大增加了數據操作的難度,這讓我很費解。以上是一個實際使用過BOLT進行界面開發的一個小青年的愚見,如果有說錯的地方,還請見諒,如果能指教一番就更好了。

---------------------------------------更新---------------------------------------
關於數據庫數據傳輸和使用的方法已經在好久以前就發現了,只是很久沒上過知乎,才一直沒有進行更新。其實並不是沒有方法的,在監聽獲取數據的同時使用回調函數CallBack將數據傳輸到程序主體中,實現對UI的更新或者其他用途其實都是可行的。
比方說在.Net環境下的實例:

public void ConnectDataBase(){}//使用C#鏈接數據庫獲取數據記錄

public void ConnectDataBase()
        {
        DataSet dsall;
        String mysqlcon = "database=BookSale;Password=yancai1991;User ID=sa;server=(local)";//Data Source=MySQL;;charset=utf8";
        SqlConnection conn;
        conn = new SqlConnection(mysqlcon);
        SqlDataAdapter mdap;
            try
            {
 
                mdap = new SqlDataAdapter("select * from Admins", conn);
                dsall = new DataSet();
                mdap.Fill(dsall, "hard");
                
                DataTable dt = dsall.Tables[0];
                
                foreach(DataRow dr in dt.Rows)
                {
                    //遍歷列
                    for(int i=0;i<dt.Columns.Count;i++)
                    {
                        PushData(dr[i].ToString());
                    }
                }

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {

            }
       
        }


[LuaClassMethod]
private static int ConnectDataBase(IntPtr L)//將函數註冊到LUA環境中
{
var instance = GetInstance(L); //通過父類的GetInstance(L)方法獲取BOLT環境下通過工廠類創建的MyClass實例
instance.ConnectDataBase(); //調用MyClass的Add方法 //將計算結果Push到Lua棧,L.PushXXX是一系列擴展方法,方便將C#數據Push到Lua棧
return 1; //1表示往Lua棧裏Push了一個元素
}
[LuaClassMethod]
private static int AttachResultListener(IntPtr L)//監聽回調函數
{
var instance = GetInstance(L); //通過調用父類的GetInstance(L)方法獲取BOLT環境下通過工廠類創建的MyClass實例 
if (!L.IsLuaFunction(-1)) return 0; //判斷Lua棧的棧頂元素是否爲function

//
//調用L.ToAction<T>(Action<T> caller)擴展方法將Lua棧頂function轉爲C#的Action<T>委託
//其中caller用來具體將委託的參數Push到Lua棧,並通過L.Call(int arg,int ret)調用Lua的function
// arg表示Push到Lua棧的元素個數
// ret表示Lua function的返回值個數
//
var function = L.ToAction<string>(result =>
{
L.PushString(result); //將resultPush到Lua棧 
L.Call(1, 0); //調用Lua的方法,1表示參數個數爲1,0表示返回值個數爲0
});

instance.OnPushDataFinish += function; //將轉換後的委託添加到MyClass實例的OnAddFinish事件上
return 0; //此處並沒有往Lua棧裏Push元素,故返回0
}
////////////////////////////////////////////////////////////////////////////////////////////
LUA執行代碼:通過工廠實例獲取C#端註冊的函數,函數執行時回調函數響應輸出數據庫數據
local myClassFactory = XLGetObject("HelloBolt.NET.MyClass.Factory") 
local myClass = myClassFactory:CreateInstance()
myClass:AttachResultListener(function(result)
--process result 
XLMessageBox(result)
end)
myClass:ConnectDataBase()


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章