2012-07-25 8 views
5

Ho avuto un problema usando dapper per collegare i parametri alle mie query MySql. Ora questo potrebbe essere un problema di natura noobistica, ma mi sono battuto per più di 2 ore e non funziona ancora.Utilizzo del dapper per collegare i parametri con MySql

Il mio problema è con la funzione SelectWithParametersTest() nel mezzo. Ecco cosa ho ...

MODIFICA: Ok maggiori dettagli. L'attuale server Mysql si adatta e dice: "ERRORE [07001] [MySQL] [Driver ODBC 3.51] [mysqld-5.1.61-0ubuntu0.11.10.1-log] SQLBindParameter non utilizzato per tutti i parametri".

L'effettiva eccezione viene rilevata in QueryInternal <T> (...) sulla riga in cui è in esecuzione il lettore. (Usando (lettore var = cmd.ExecuteReader())

Quando ho ispezionare il comando non ci sono parametri fissati ad esso, ma l'oggetto param (che è stato passato alla funzione) ha il mio oggetto anon in esso.

using System; 
using System.Data; 
using System.Collections.Generic; 
using Dapper; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     using (var dapperExample = new DapperExample()) 
     { 
      //dapperExample.SelectTest(); 
      dapperExample.SelectWithParametersTest(); 
     } 
    } 
} 

class DapperExample : IDisposable 
{ 
    #region Fields 
    IDbConnection _databaseConnection; 
    #endregion 

    #region Constructor/Destructor 
    public DapperExample() 
    { 
     _databaseConnection = new System.Data.Odbc.OdbcConnection("DSN=MySqlServer;"); 
     _databaseConnection.Open(); 
    } 

    public void Dispose() 
    { 
     if (_databaseConnection != null) 
      _databaseConnection.Dispose(); 
    } 
    #endregion 

    #region Public Methods (Tests) 
    public void SelectTest() 
    { 
     // This function correctly grabs and prints data. 
     string normalSQL = @"SELECT County as CountyNo, CompanyName, Address1, Address2 
          FROM testdb.business 
          WHERE CountyNo = 50 LIMIT 3"; 

     var result = _databaseConnection.Query<ModelCitizen>(normalSQL); 
     this.PrintCitizens(result); 
    } 

    public void SelectWithParametersTest() 
    { 
     // This function throws OdbcException: "ERROR [07001] [MySQL][ODBC 3.51 Driver][mysqld-5.1.61-0ubuntu0.11.10.1-log]SQLBindParameter not used for all parameters" 
     string parameterizedSQL = @"SELECT County as CountyNo, CompanyName, Address1, Address2 
            FROM testdb.business 
            WHERE CountyNo = ?B"; 
     var result = _databaseConnection.Query<ModelCitizen>(parameterizedSQL, new { B = 50 }); 
     this.PrintCitizens(result); 
    } 
    #endregion 

    #region Private Methods 
    private void PrintCitizens(IEnumerable<ModelCitizen> citizenCollection) 
    { 
     foreach (var mc in citizenCollection) 
     { 
      Console.WriteLine("--------"); 
      Console.WriteLine(mc.BankNo.ToString() + " - " + mc.CompNo.ToString()); 
      Console.WriteLine(mc.CompanyName); 
      Console.WriteLine(mc.Address1); 
      Console.WriteLine(mc.Address2); 
     } 
     Console.ReadKey(); 
    } 
    #endregion 
} 

public class ModelCitizen 
{ 
    public long CountyNo { get; set; } 
    public string CompanyName { get; set; } 
    public string Address1 { get; set; } 
    public string Address2 { get; set; } 
} 
+0

io non sono in un PC in questo momento, ma: che cosa effettivamente accade con quella –

+0

il mio male:? il server attuale Mysql gira bene e dice: "ERRORE [07001] [MySQL] [Driver ODBC 3.51] [mysqld-5.1.61-0ubuntu0.11.10.1-log] SQLBindParameter non utilizzato per tutti i parametri." L'eccezione effettiva viene rilevata in QueryInternal (...) sulla riga in cui è in esecuzione il lettore. (usando (var reader = cmd.ExecuteReader()) Quando controllo il comando non ci sono parametri ad esso associati, ma l'oggetto param è lì. Inoltre grazie per la risposta veloce Marc. – Yojin

+0

Dovrò controllare, ma * sembra * come MySql odia i parametri con nome - vedi anche http://stackoverflow.com/questions/1457597/mysql-rejecting-parameter.Se questo è accurato, allora legare quelli potrebbe essere un enorme dolore –

risposta

0

Yokin, hai provato utilizzando un UInt32 invece che lungo nel codice C#

+0

Questo dovrebbe essere un commento, non una risposta –

+0

Come commento, non vedo un pulsante (eccetto su questo commento) – udog

+0

La casella di testo non viene visualizzata perché ci sono troppi commenti, ma sotto i commenti, c'è un pulsante che dice "aggiungi/mostra altri 3 commenti". Cliccaci sopra, verrà visualizzata la casella di testo –

Problemi correlati