MySQL存储过程通过.Net进行所有其他调用

时间:2011-07-28 14:45:38

标签: c# mysql

我工作的公司有一个即将推出的项目,它将使用MySQL作为C#ASP .Net前端的后端。我把一个测试应用程序和db组合在一起,并且tings似乎在大多数情况下工作得非常漂亮,除非我尝试调用任何proc,它将在第一次调用时工作,而不是在下一次调用,然后再次调用,然后不会,不会失败,它只会在其他尝试中起作用。

使用workbench每次都调用proc工作,就像使用VS2010连接数据库一样,只有应用程序代码失败。我一直非常明确地确保每次都打开和关闭(并处理)连接,但没有运气。

这是一个示例查询;这是我最常用的过程:

SELECT
        U.id,
        U.First_Name,
        U.Last_Name,
        U.Birth_Date,
        U.Created,
        U.Password
    FROM 
        test.user U;

正如您所看到的,它非常简单。然而,不只是那个过程。我可以按任何顺序调用任何触发器并获得相同的结果;如果我在不使用proc的代码中调用查询,它可以正常工作,但是公司使用的模型是每次调用数据库(MSSQL)时都会触发它们并且它们想要携带与此应用程序相同的标准。

为了彻底,这里是连接字符串(当然修改了值):

Server=127.0.0.1;Port=3306;Data Source=localhost;Database=testdb;User Id=test_user;Password=pword;

以下是数据库管理员的顶部:

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;

using MySql.Data;
using MySql.Data.MySqlClient;

我正在使用“使用”块来运行连接,命令和数据适配器,以确保它们在执行后正确处理,没有松散的末端,并且甚至尝试在它们关闭后专门声明它们的处理只是为了安全。没有什么能改变这种行为。

有没有人见过这个?如果重要的话,一切都在本地运行。

以下是拨打电话的代码,我可能已经自己解决了这个问题:

public static DataTable SPExecuteTable(string commandText =“”,List paras = null)     {         DataTable dt = new DataTable();         例外ex = null;

    using (MySqlConnection conn = new MySqlConnection(MySQL_Connection))
    {
        using (MySqlCommand com = MySQlComnd(commandText, paras))
        {
            try
            {
                conn.Open();
                com.Connection = conn;

                using (MySqlDataAdapter oda = new MySqlDataAdapter())
                {
                    oda.SelectCommand = com;
                    oda.Fill(dt);

                }
            }
            catch (Exception e)
            {
                ex = e;
            }
            finally
            {
                conn.Close();
            }
        }
    }

    if (ex != null)
        throw ex;

    return dt;
}

1 个答案:

答案 0 :(得分:1)

我有点愚蠢到解决方案:

    public static DataTable SPExecuteTable(string commandText = "", List<object> paras = null)
    {
        DataSet ds = new DataSet();
        DataTable dt = new DataTable();
        Exception ex = null;

            using (MySqlCommand com = MySQlComnd(commandText, paras))
            {
                try
                {
                    com.Connection.Open();

                    using (MySqlDataAdapter oda = new MySqlDataAdapter())
                    {
                        oda.SelectCommand = com;
                        oda.Fill(ds);
                        dt = ds.Tables[0];
                    }
                }
                catch (Exception e)
                {
                    ex = e;
                }
                finally
                {
                    com.Connection.Close();
                    com.Connection.Dispose();
                }
            }


        if (ex != null)
            throw ex;

        return dt;
    }

正如您所看到的,如果您填充DataSet然后只抓住第一个表,它就可以工作。我假设MySQL数据适配器只填充一个表存在一些潜在的问题,但DataSet似乎没有分享这个问题。