嵌入式MySQL服务器的C#封装?

3
我一直在认真考虑将嵌入式MYSQL服务器库添加到我的应用程序中。我的软件是游戏服务器和Web管理面板之间的一层,提供额外的功能。我们的许多客户都要求为他们的服务器提供MySQL数据库(因为这是他们的插件开发使用的),能够在我的软件内部运行它们而不是手动设置它们将是很棒的。
  • 我是否错过了这个库的.NET封装器?

  • 由我的应用程序运行的软件将需要能够连接到它,但显然该软件正在本地运行。这会起作用吗?

1个回答

3
我不知道有没有这个库的.NET封装,虽然我记得有一次谈到从版本5开始在.NET连接器中引入对这个库的支持。但现在我找不到任何相关信息。
网上有一些示例代码,你可以在它们的基础上扩展你的代码。我想最完整的一个应该是http://forums.mysql.com/read.php?38,67281,67917
using System;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.Configuration;

class EntryPoint
{
    [DllImport("libmySQL.dll")]
    static extern IntPtr mysql_init(IntPtr mysql);

    [DllImport("libmySQL.dll")]
    static extern IntPtr mysql_fetch_lengths(IntPtr result);

    [DllImport("libmySQL.dll")]
    static extern IntPtr mysql_store_result(IntPtr mysql);

    [DllImport("libmySQL.dll")]
    static extern IntPtr mysql_fetch_row(IntPtr result);

    [DllImport("libmySQL.dll")]
    static extern IntPtr mysql_real_connect(IntPtr mysql, string host, string user, string passwd, string db, uint port, string unix_socket, uint client_flag);

    [DllImport("libmySQL.dll")]
    static extern uint mysql_field_count(IntPtr mysql);

    [DllImport("libmySQL.dll")]
    static extern string mysql_error(IntPtr mysql);

    [DllImport("libmySQL.dll")]
    static extern int mysql_real_query(IntPtr mysql, string query, uint length);

    static Array MarshalArray(Type structureType, IntPtr arrayPtr, int length)
    {
        if (structureType == null)
            throw new ArgumentNullException("structureType");
        if (!structureType.IsValueType)
            throw new ArgumentException("Only struct types are supported.", "structureType");
        if (length < 0)
            throw new ArgumentOutOfRangeException("length", length, "length must be equal to or greater than zero.");
        if (arrayPtr == IntPtr.Zero)
            return null;
        int size = System.Runtime.InteropServices.Marshal.SizeOf(structureType);
        Array array = Array.CreateInstance(structureType, length);
        for (int i = 0; i < length; i++)
        {
            IntPtr offset = new IntPtr((long)arrayPtr + (size * i));
            object value = System.Runtime.InteropServices.Marshal.PtrToStructure(offset, structureType);
            array.SetValue(value, i);
        }
        return array;
    }


    static void mysql_real_query(IntPtr mysql, string query)
    {
        int result = (query != null) ? mysql_real_query(mysql, query, (uint)query.Length) : mysql_real_query(mysql, null, 0);
        if (result == 0)
            return;
        throw new ApplicationException(mysql_error(mysql));
    }

    static int Main(string[] args)
    {
        IntPtr ptr = mysql_init(IntPtr.Zero);
        Debug.Assert(ptr != IntPtr.Zero);

        IntPtr mysql = mysql_real_connect(ptr, ConfigurationSettings.AppSettings["server"], ConfigurationSettings.AppSettings["username"], ConfigurationSettings.AppSettings["password"], ConfigurationSettings.AppSettings["database"], 0, null, 0);
        Debug.Assert(ptr != IntPtr.Zero, mysql_error(ptr));

        string query = "SELECT * FROM proxy_servers";
        Console.WriteLine("Executing query: {0}", query);
        mysql_real_query(mysql, query);

        IntPtr result = mysql_store_result(mysql);
        Debug.Assert(result != IntPtr.Zero, mysql_error(mysql));

        uint fieldCount = mysql_field_count(mysql);
        Console.WriteLine("field count: {0}", fieldCount);

        for (IntPtr ptrRow = mysql_fetch_row(result); ptrRow != IntPtr.Zero; ptrRow = mysql_fetch_row(result))
        {
            IntPtr[] mysqlRow = (IntPtr[])MarshalArray(typeof(IntPtr), ptrRow, (int)fieldCount);
            IntPtr ptrLengths = mysql_fetch_lengths(result);
            uint[] lengths = (uint[])MarshalArray(typeof(uint), ptrLengths, (int)fieldCount);
            for (int i = 0; i < (int)fieldCount; i++)
            {
                string str = Marshal.PtrToStringAnsi(mysqlRow[i], (int)lengths[i]);
                Console.Write("{0}, ", str);
            }
            Console.WriteLine();
        }
        return 0;
    }
}

我并没有真正考虑过只是通过DLLImport导入函数,但那应该可以很好地工作。libmySQL.dll包含服务器和客户端函数吗? - user470760
是的,参见:http://dev.mysql.com/doc/refman/5.0/en/mysql-library-init.html >> 如果应用程序使用嵌入式服务器,则此调用将启动服务器并初始化服务器使用的任何子系统(mysys、InnoDB等)。 - Polity

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接