私はこのクエリを実行する必要があります。上記のコードでクエリがパラメータ化されていない場合、クエリでオブジェクト(バイト配列)を渡す方法は?
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
}
第二アプローチの問題は、そのひどく遅く比較的ということです。ここではクエリをデータベースに何度も実行する必要があるだけでなく、この特定のエントリがまだこのIsThisEntryAlreadyAdded
関数を実行して追加されていないかどうかを確認する必要があるたびに、クエリを実行する必要があります。
私の質問は、どのように(私の場合はバイト配列)非パラメータ化クエリで渡すか?その不可能な場合、私の質問は、私のクエリをより速くするための代替ですか?
string query = @"SELECT * FROM hint WHERE addedSessionId IN (";
MySqlCommand cmd = new MySqlCommand(query, _connSource);
int i = 0;
foreach (List<Guid> myGuid in lstGuid)
{
query = string.Format("{0}@param{1}", query, i);
cmd.Parameters.AddWithValue(string.Format("@param{0}", i), myGuid.ToByteArray());
i++;
if(i != lstGuid.Count) query = string.Format("{0},", query);
}
query = string.Format("{0})", query);
cmd.CommandText = query;
//Here you have command with constructed query and params
でエスケープすると、クエリを作成して同時にパラメータを使用することができます。 – Reniuz
@ Reeniuz thats素晴らしいアイデアです。それについては考えていませんが、実装する方法は?私が見ることができるいくつかのサンプルコードですか? – nawfal
回答コードサンプルに追加しました。 – Reniuz