このクエリを実行する必要があります。
string query = @"SELECT *
FROM hint
WHERE addedSessionId IN (x, y, z, ............)";
if (_connSource.State != ConnectionState.Open)
_connSource.Open();
MySqlCommand cmd = new MySqlCommand(query, _connSource);
MySqlDataReader r = cmd.ExecuteReader();
List<Hint> lstHint = new List<Hint>();
while (r.Read())
{
Hint h = new Hint(Convert.ToInt32(r[0]), Convert.ToInt32(r[1]),
Convert.ToString(r[2]), Convert.ToInt32(r[3]),
Convert.ToInt32(r[4]));
h.addedSessionId = (Guid)r[5];
lstHint.Add(h);
}
r.Close(); //important
x, y, z etc
上記のコードで、クエリ自体に値を渡すにはどうすればよいですか? x, y, z etc
int または string ではなく、バイト配列です。私のコードでは、それらは .net Guid フィールドですが、バイト配列に変換してバイナリ値として db に保存しています。
以下に示すように、パラメーター化された方法でこれを行うことで、私が望むものを達成できます。
string query = @"SELECT *
FROM hint
WHERE addedSessionId = @newSessionId";
if (_connSource.State != ConnectionState.Open)
_connSource.Open();
List<Hint> lstHint = new List<Hint>();
foreach (List<Guid> myGuid in lstGuid)
{
MySqlCommand cmd = new MySqlCommand(query, _connSource);
cmd.Parameters.AddWithValue("newSessionId", myGuid.ToByteArray());
MySqlDataReader r = cmd.ExecuteReader();
while (r.Read())
{
int id = Convert.ToInt32(r[0]);
if (IsThisEntryAlreadyAdded(id, lstHint))
continue;
Hint h = new Hint(id, Convert.ToInt32(r[1]),
Convert.ToString(r[2]), Convert.ToInt32(r[3]),
Convert.ToInt32(r[4]));
h.addedSessionId = (Guid)r[5];
lstHint.Add(h);
}
r.Close(); //important
}
2番目のアプローチの問題は、比較的遅いことです。IsThisEntryAlreadyAdded
ここでは、データベースに対してクエリを何度も実行する必要があるだけでなく、この関数を実行してその特定のエントリがまだ追加されていないかどうかを毎回確認する必要があります。
私の質問は、パラメーター化されていないクエリでオブジェクト (私の場合はバイト配列) を渡す方法です。それが不可能な場合、私の質問は、クエリを高速化する代替手段はありますか?