5

dapper を使用して MySql クエリにパラメーターをアタッチする際に問題が発生しました。今、これは厄介な問題かもしれませんが、私はこれに2時間以上頭を悩ませましたが、まだ機能していません.

私の問題は、真ん中にある SelectWithParametersTest() 関数にあります。これが私が持っているものです...

編集:詳細はわかりました。実際のMysqlサーバーは適合をスローし、「エラー[07001] [MySQL] [ODBC 3.51 Driver] [mysqld-5.1.61-0ubuntu0.11.10.1-log] SQLBindParameterがすべてのパラメーターに使用されていません」と言います。

実際の例外は、リーダーを実行している行の QueryInternal <T>(...) でキャッチされます。(using(var reader = cmd.ExecuteReader())

コマンドを調べると、パラメータは関連付けられていませんが、(関数に渡された) param オブジェクトには anon オブジェクトが含まれています。

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; }
}
4

1 に答える 1

0

Yokin、C# コードで long の代わりに UInt32 を使用しようとしましたか?

于 2012-08-07T21:55:46.677 に答える