我有一组存储过程用于填充ASP.Net CheckBoxList。从代码运行此过程为{CALL ProcedureName(params);在类型设置为存储过程的情况下,我似乎只得到了部分结果(即实际结果中的许多列都丢失了。)
如果我从查询中复制CommandText(使用断点来获取发送的确切文本)并直接在Navicat(或任何其他MySQL GUI)中运行它,我会得到所有预期的列。
以下代码无效:
using (OdbcCommand command = OdbcConnection.CreateCommand())
{
command.CommandType = CommandType.StoredProcedure;
command.CommandText = "{ " + string.Format(StoredProcedureCall, foundationId, fpids, "", "", "NULL", "2001/01/02", "2001/01/01", "*") +
" }";
using (OdbcDataReader reader = command.ExecuteReader())
{
for (int i = 0; i < reader.FieldCount; i++)
{
columns.Add(reader.GetName(i));
}
}
}
如果我将代码更改为以下代码,则会开始工作(仅使用另一个代码):
using (OdbcConnection)
using (OdbcCommand command = OdbcConnection.CreateCommand())
{
command.CommandType = CommandType.StoredProcedure;
command.CommandText = "{ " + string.Format(StoredProcedureCall, foundationId, fpids, "", "", "NULL", "2001/01/02", "2001/01/01", "*") +
" }";
using (OdbcDataReader reader = command.ExecuteReader())
{
for (int i = 0; i < reader.FieldCount; i++)
{
columns.Add(reader.GetName(i));
}
}
}
这里发生了什么?
这里的参考是OdbcConnection属性:
public static OdbcConnection OdbcConnection
{
get
{
// If we have no connection or our connection isn't open
if (null == odbcConnection || ConnectionState.Open != odbcConnection.State)
{
odbcConnection = new OdbcConnection(BaseAccess.DBConnectionString);
odbcConnection.Open();
}
return odbcConnection;
}
}
答案 0 :(得分:2)
这可能是Odbc MySql驱动程序中的错误。尝试使用ADO.NET driver。另外,我建议您不要在静态属性中手动处理连接。将此任务保留给ADO.NET,它将有效地处理连接池:
using (var conn = new MySqlConnection(DBConnectionString))
using (var cmd = conn.CreateCommand())
{
conn.Open();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "sp_name";
cmd.Parameters.Add(new SqlParameter("@foundationId", foundationId));
cmd.Parameters.Add(new SqlParameter("@fpids", fpids));
...
using (var reader = cmd.ExecuteReader())
{
for (int i = 0; i < reader.FieldCount; i++)
{
columns.Add(reader.GetName(i));
}
}
}
答案 1 :(得分:0)
确保您的列都具有唯一的名称。
答案 2 :(得分:0)
这在某种程度上与重用的连接有关,存储过程中的某些@变量在运行之间没有重置。更改为正确关闭/处理的池连接是解决我的问题的原因。