2012-07-25 11 views
5

Ich habe ein Problem mit Dapper, um Parameter an meine MySQL-Abfragen anhängen. Nun ist das vielleicht ein Problem, aber ich habe meinen Kopf für den Großteil von 2 Stunden geschlagen und es funktioniert immer noch nicht.Verwenden von Dapper zum Anfügen von Parametern mit MySql

Mein Problem ist mit der Funktion SelectWithParametersTest() in der Mitte. Hier ist, was ich habe ...

EDIT: Ok mehr Details. Der tatsächliche Mysql-Server wirft passt und sagt: "Fehler [07001] [MySQL] [ODBC 3.51 Treiber] [mysqld-5.1.61-0ubuntu0.11.10.1-log] SQLBindParameter nicht für alle Parameter verwendet".

Die eigentliche Ausnahme wird bei QueryInternal <T> (...) in der Zeile abgefangen, in der das Lesegerät ausgeführt wird. (Unter Verwendung von (var reader = cmd.ExecuteReader())

Wenn ich inspizieren den Befehl gibt es keine Parameter, um es angebracht, aber das param-Objekt (das an die Funktion übergeben wurde) hat mein Anon Objekt in ihm.

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

ich bin nicht an einem PC im Moment, aber: was mit tatsächlich passiert, dass –

+0

Mein schlecht: der eigentliche Mysql-Server wrows passt und sagt: "ERROR [07001] [MySQL] [ODBC 3.51 Treiber] [mysqld-5.1.61-0ubuntu0.11.10.1-log] SQLBindParameter wird nicht für alle Parameter verwendet." Die aktuelle Ausnahme wird bei QueryInternal (...) in der Zeile abgefangen, in der das Lesegerät ausgeführt wird. (mit (var reader = cmd.ExecuteReader()) Wenn ich den Befehl inspiziere, sind keine Parameter angehängt, aber das param-Objekt ist da.Auch danke für die schnelle Antwort Marc. – Yojin

+0

muss ich noch überprüfen, aber es * sieht aus * wie MySql die benannten Parameter hasst - siehe auch http://stackoverflow.com/questions/1457597/mysql-rejecting-parameter Wenn das genau ist, dann könnte das Binden ein großer Schmerz sein –

Antwort

0

Yokin, haben Sie versucht, eine UInt32 statt langer Verwendung im C# -Code

+0

Das sollte ein Kommentar sein, keine Antwort –

+0

Wie kann ich kommentieren, ich sehe keinen Knopf (außer auf diesem Kommentar) – udog

+0

Das Textfeld wird nicht angezeigt, da zu viele Kommentare vorhanden sind, aber unter den Kommentaren befindet sich eine Schaltfläche mit dem Text "Weitere Kommentare hinzufügen/anzeigen". Klicken Sie darauf, um das Textfeld anzuzeigen –

Verwandte Themen