0

DataAdapter からデータ テーブルにデータを入力しようとしていますが、データベースは、クエリに対してパラメーターが指定されていないことを報告し続けます...

これが私のコードです:

    #region "Properties"
    public string sql { get; protected set; }
    public CommandType cType { get; protected set; }
    public List<MySqlParameter> args { get; protected set; }
    public string rValue { get; protected set; }

    private MySqlConnection conn;

    private string server = "127.0.0.1";
    private string database = "stman";
    private string user = "root";
    private string password = "root";
    #endregion

    #region "Constructor Logic"
        public Database(string CommandText, CommandType CommandType, List<MySqlParameter> Parameters, string ReturnParameter = "")
        {
            buildConnection();

            sql = CommandText;
            cType = CommandType;
            args = Parameters;
            rValue = ReturnParameter;
        }

        public Database(string CommandText, CommandType CommandType)
        {
            buildConnection();

            sql = CommandText;
            cType = CommandType;
        }

        private void buildConnection()
        {
            StringBuilder sb = new StringBuilder();
            sb.Append(String.Format("data source={0}; initial catalog={1}; user id={2}; password={3};", server, database, user, password));

            conn = new MySqlConnection(sb.ToString());
        }
    #endregion

    public DataTable GetDataTable()
    {
        DataTable dt = new DataTable();
        MySqlDataAdapter da = new MySqlDataAdapter();

        using (MySqlCommand cmd = new MySqlCommand(sql, conn))
        {
            if (args.Count > 0)
            {
                cmd.Parameters.AddRange(args.ToArray());
            }

            da.SelectCommand = cmd;
            da.Fill(dt);
        }

        if (dt.Rows.Count > 0)
        {
            return dt;
        }
        else
        {
            return null;
        }
    }

このGetDataTable関数はList<MySqlParameter>、クエリに必要なパラメーターを読み取ります。このリストは、呼び出し元のコードで定義されます。

がヒットした時点でda.Fill(dt);、MySqlCommand には問題のクエリの正しいパラメーターがあり、スタック トレース (以下を参照) から判断すると、mysql からデータを取得する試みが成功したように見えます。実際には、このエラーを送り返している mysql:

PROCEDURE stman.Users_SelectByEmailAndPassword の引数の数が正しくありません。 期待値 2、取得値 0

スタック トレースは次のとおりです。

[MySqlException (0x80004005): PROCEDURE stman.Users_SelectByEmailAndPassword の引数の数が正しくありません。予想される 2、0 を取得] MySql.Data.MySqlClient.MySqlStream.ReadPacket() +383 MySql.Data.MySqlClient.NativeDriver.GetResult(Int32&ectedRow、Int64&insertId) +116 MySql.Data.MySqlClient.Driver.GetResult(Int32 statementId、 Int32& relatedRows, Int64& insertId) +54 MySql.Data.MySqlClient.Driver.NextResult(Int32 statementId, Boolean force) +145 MySql.Data.MySqlClient.MySqlDataReader.NextResult() +1258 MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior +2364 MySql.Data.MySqlClient.MySqlCommand.ExecuteDbDataReader(CommandBehavior 動作) +41 System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior 動作) +10 System.Data.Common.

私は何年もの間、このように DataTables を埋めてきましたが、このエラーに遭遇したのはこれが初めてです。なぜそれが起こっているのか、それを修正する方法はわかりません。

パラメータがどこに行くのかを理解するのを手伝ってくれる人はいますか?

編集
レナンのコメントに応えて:

パラメータ名は同じです。クエリ テキスト (この場合はストアド プロシージャの名前) は、このクラスがインスタンス化されるとき
にプロパティに渡されます。 そして最後に、私の IDE の配色は単純に VS2012 ダーク テーマです。sql

4

1 に答える 1

0

わかりました、これは私がコードで行ったことの問題ではなく、私がしなかったことの問題です。

コードに実際のエラーはありませんが、MySqlCommand の CommandType が指定されていません。

この行を追加することでこれを修正しました (オブジェクトが使用する CommandType を指定します):

cmd.CommandType = cType;

完全なコードは次のとおりです。

#region "Properties"
public string sql { get; protected set; }
public CommandType cType { get; protected set; }
public List<MySqlParameter> args { get; protected set; }
public string rValue { get; protected set; }

private MySqlConnection conn;

private string server = "127.0.0.1";
private string database = "stman";
private string user = "root";
private string password = "root";
#endregion

#region "Constructor Logic"
    public Database(string CommandText, CommandType CommandType, List<MySqlParameter> Parameters, string ReturnParameter = "")
    {
        buildConnection();

        sql = CommandText;
        cType = CommandType;
        args = Parameters;
        rValue = ReturnParameter;
    }

    public Database(string CommandText, CommandType CommandType)
    {
        buildConnection();

        sql = CommandText;
        cType = CommandType;
    }

    private void buildConnection()
    {
        StringBuilder sb = new StringBuilder();
        sb.Append(String.Format("data source={0}; initial catalog={1}; user id={2}; password={3};", server, database, user, password));

        conn = new MySqlConnection(sb.ToString());
    }
#endregion

public DataTable GetDataTable()
{
    DataTable dt = new DataTable();
    MySqlDataAdapter da = new MySqlDataAdapter();

    using (MySqlCommand cmd = new MySqlCommand(sql, conn))
    {
        if (args.Count > 0)
        {
            cmd.Parameters.AddRange(args.ToArray());
        }

        cmd.CommandType = cType;

        da.SelectCommand = cmd;
        da.Fill(dt);
    }

    if (dt.Rows.Count > 0)
    {
        return dt;
    }
    else
    {
        return null;
    }
}
于 2013-06-13T14:57:03.987 に答える