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:
スタック トレースは次のとおりです。
[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