【发布时间】:2012-04-17 11:47:55
【问题描述】:
我要运行这个查询:
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 函数来确保该特定条目是否尚未添加。
我的问题是如何在非参数化查询中传递对象(在我的情况下是字节数组)?如果不可能,我的问题是有没有其他方法可以让我的查询更快?
【问题讨论】:
-
您可以同时构建查询和使用参数
-
@Reniuz 真是个好主意。不是我没有想过,而是如何实现?我可以看到一些示例代码?
-
我在答案代码示例中添加了。
标签: c# mysql binary .net-2.0 parameterized-query