C# 如果查询未参数化,如何在查询中传递对象(字节数组)?

C# 如果查询未参数化,如何在查询中传递对象(字节数组)?,c#,mysql,binary,.net-2.0,parameterized-query,C#,Mysql,Binary,.net 2.0,Parameterized Query,我要运行此查询: string query = @"SELECT * FROM hint WHERE addedSessionId IN (x, y, z, ............)"; if (_connSource.State != ConnectionState.Open) _connSource.Open(); MySqlCommand cmd = new MySqlCommand(query,

我要运行此查询:

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
第二种方法的问题是,相对而言,速度非常慢。这里不仅需要对数据库运行多次查询,而且每次我都需要通过运行此
IsThisEntryReadyAdded
函数来确保是否已经添加了特定条目

我的问题是如何在非参数化查询中传递对象(在我的例子中是字节数组)?如果这是不可能的,我的问题是,有没有其他方法可以加快我的查询速度?

下面是示例(不只是测试伪代码),我认为可以这样做:

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
stringquery=@“从添加会话ID的提示中选择*”;
MySqlCommand cmd=新的MySqlCommand(查询,_connSource);
int i=0;
foreach(在lstGuid中列出myGuid)
{
query=string.Format(“{0}@param{1}”,query,i);
cmd.Parameters.AddWithValue(string.Format(“@param{0}”,i),myGuid.ToByteArray();
i++;
如果(i!=lstGuid.Count)query=string.Format(“{0}”,query);
}
query=string.Format(“{0})”,query);
cmd.CommandText=查询;
//这里有一个带有构造查询和参数的命令

@Reinuz的回答回答了我的问题,但在我的场景中,这是痛苦的。当(子句中的
有大量值时,我可能会超过允许的最大数据包大小,因此查询根本不会运行

这就是我的结论,对于大桌子来说,这要快得多:

string query=@“选择*
暗示
其中在(“+GetStringValuesFromGuidList()+”)中添加了会话ID;
void GetStringValuesFromGuidList()
{
字符串guids=null;
对于(int i=0;i
我将guid转换为它的字符串表示形式,然后将其传递给query,MySQL可以在那里执行等效的字符串搜索

对于数量有限的条目,参数化查询(Reinuz的答案)是最好的。对于非常大的值,请使用字符串搜索


编辑:此处应使用的
UTF8Encoding
取决于数据库的字符集是否为unicode等。我在大多数情况下成功使用了
。默认值
。此外,二进制的字符串表示形式将具有保留字符。因此,可以使用
”或
\

对其进行转义uct查询并同时使用参数time@Reniuz这是一个很好的主意。不是我没有考虑过,而是如何实现?一些我能看到的示例代码?我在回答代码示例中添加了。可能与Fantastic重复,这正是我的想法。但我没想到这
“@param”+I.ToString()
part也同样愚蠢。我没有太多心思,而是好奇地想知道在这种情况下的标准做法。在这种情况下,这是公认的做法吗?我看不出这里有什么错……也许你可以在这里改成myGuid.ToString来设置“不可预测”参数:)哈哈,好吧。谢谢因为在我的数据库中,Guid字段是Guid的二进制表示,而不是char表示,所以不能继续使用tostring。最后,无论如何,谢谢你。。。
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
string query = @"SELECT * 
                 FROM   hint 
                 WHERE  addedSessionId IN (" + GetStringValuesFromGuidList()  + ")";

void GetStringValuesFromGuidList()
{
    string guids = null;
    for (int i = 0; i < lstGuid.Count; i++)
    {
        guids += "'" + UTF8Encoding.Default.GetString(lstGuid[i].ToByteArray()).Replace("\\", "\\\\").Replace("'", "''") + "'";
        if (i < lstGuid.Count - 1)
            guids += ", ";
    }

    return guids;
}