2009-10-15 14 views
4

我有一组存储过程用于填充ASP.Net CheckBoxList。当从代码运行此过程为{CALL ProcedureName(params); }类型设置为存储过程,我似乎只得到了部分结果(即实际结果中的许多列都丢失了)。MySQL ODBC存储过程结果缺少列

如果我从查询中复制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

如果您的应用程序使用与Navicat相同的登录凭据? – 2009-10-15 19:59:01

+0

是的,他们使用相同的用户/密码运行 – mikeschuld 2009-10-15 20:03:33

+0

您是如何发现列丢失的?你用什么来存储SP发送的数据? – manji 2009-10-15 20:31:46

回答

0

这在某种程度上与连接被重用和一些@变量的不是运行之间重置存储过程。更改为正确关闭/处置的联合连接是解决我的问题的方法。

0

确保你列的所有具有唯一的名称。

+0

非唯一命名的列会抛出MySQL异常。没有这样的例外。更不用说,该过程强制使用唯一的列名作为代码的一部分,因为它们都是编号的(q1:blah,q2:blah等)。 – mikeschuld 2009-10-19 17:00:21

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)); 
     } 
    } 
} 
+0

ADO.Net驱动程序实际上使问题变得更糟。如果没有额外的using语句,它不会返回所有的列。 – mikeschuld 2011-02-22 22:12:37