C# MySQL存储进程通过.Net每隔一次调用就工作一次
我工作的公司有一个即将推出的项目,将使用MySQL作为后端,并带有一个C#ASP.Net前端。我集成了一个测试应用程序和db,而且Ting在大多数情况下都工作得很好,除了当我尝试调用任何程序时,它会在第一次调用时工作,而不是下一次调用,然后再次调用,然后不会,毫无疑问,它只会每隔一次尝试就工作 使用workbench调用proc每次都有效,就像使用VS2010连接DB一样,只有应用程序代码失败。我一直非常明确地确保每次都打开和关闭(并处理)连接,但没有运气 下面是一个示例查询;这是我使用最多的程序:C# MySQL存储进程通过.Net每隔一次调用就工作一次,c#,mysql,C#,Mysql,我工作的公司有一个即将推出的项目,将使用MySQL作为后端,并带有一个C#ASP.Net前端。我集成了一个测试应用程序和db,而且Ting在大多数情况下都工作得很好,除了当我尝试调用任何程序时,它会在第一次调用时工作,而不是下一次调用,然后再次调用,然后不会,毫无疑问,它只会每隔一次尝试就工作 使用workbench调用proc每次都有效,就像使用VS2010连接DB一样,只有应用程序代码失败。我一直非常明确地确保每次都打开和关闭(并处理)连接,但没有运气 下面是一个示例查询;这是我使用最多的程
SELECT
U.id,
U.First_Name,
U.Last_Name,
U.Birth_Date,
U.Created,
U.Password
FROM
test.user U;
正如你所看到的,这是难以置信的简单。然而,这不仅仅是这个过程。我可以按任何顺序调用任何进程并得到相同的结果;on、off、on、off等。如果我在代码中调用查询而不使用proc,它可以正常工作,但是公司使用的模型是每次调用数据库(MSSQL)都使用proc,并且他们希望将相同的标准也应用到这个应用程序中
为了更全面,这里是连接字符串(当然是修改的值):
下面是数据库管理器的顶部:
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;
我正在运行带有“使用”块的连接、命令和数据适配器,以确保它们在执行后被正确处理,没有松散的结尾,甚至为了安全起见,我还尝试过在它们关闭后简单地声明它们的处理。没有什么能改变这种行为
以前有人见过这个吗?一切都在本地运行,以防万一
下面是打电话的代码,我可能自己解决了:
公共静态数据表SPExecuteTable(string commandText=“”,List paras=null)
{
DataTable dt=新的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;
}
我幸运地找到了一个解决方案:
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;
}
公共静态数据表SPExecuteTable(string commandText=“”,List paras=null)
{
数据集ds=新数据集();
DataTable dt=新的DataTable();
异常ex=null;
使用(MySqlCommand-com=MySQlComnd(commandText,段落))
{
尝试
{
com.Connection.Open();
使用(MySqlDataAdapter=new MySqlDataAdapter())
{
oda.SelectCommand=com;
补充官方发展援助(ds);
dt=ds.表[0];
}
}
捕获(例外e)
{
ex=e;
}
最后
{
com.Connection.Close();
Dispose();
}
}
如果(ex!=null)
掷骰子;
返回dt;
}
正如您所见,如果您填充一个数据集,然后抓取第一个表,它就会工作。我假设MySQL数据适配器只填充一个表存在一些潜在的问题,但数据集似乎没有这个问题。显示您的实际调用代码……您为我省下了很多麻烦……我不明白为什么每个人都这样做对数据库的er调用没有返回任何内容,或者给了我一个大错误,例如“过程或函数在数据库中不存在”。MySQL数据适配器在只填充表而不是填充数据集时会变得一团糟。在我的情况下,我使用的是自动生成的数据集代码,所以我不得不重载填充()方法来允许填充数据集而不是表。现在似乎可以通过工作来完成!
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;
}