-3
 public DataTable dt_date(resbal obj)
{
    connection();

    string details = @"SELECT donor_contacts.name AS NAME, m_reserve_userdetails.res_no AS 'RESERVATION NO',
    m_room_user.build AS 'BUILDING',m_room.roomno AS 'ROOM NO',DATE_FORMAT(intime,'%r') AS 'CHECK-IN TIME',
    CASE WHEN m_room_user.rent =0 THEN 'Free'  ELSE 'Pass' END AS 'Passtype' FROM  m_reserve_userdetails,donor_contacts,m_room_user,m_room
    WHERE m_reserve_userdetails.id = donor_contacts.id 
    AND  m_room_user.donor_id = m_reserve_userdetails.user_id    
    AND m_reserve_userdetails.status=1 
    AND indate ='" + obj.date + "'";


    OdbcCommand cmd = new OdbcCommand(details, con);
    OdbcDataAdapter oda = new OdbcDataAdapter(cmd);
    DataTable dt = new DataTable();
    oda.Fill(dt);
    return dt;
}

或者

公共数据表 dt_date(resbal obj) { connection();

StringBuilder datails = new StringBuilder();
datails.Append("SELECT donor_contacts.name AS NAME, ");
datails.Append("m_reserve_userdetails.res_no AS 'RESERVATION NO',");
datails.Append("m_room_user.build AS 'BUILDING',");
datails.Append("m_room.roomno AS 'ROOM NO',");
datails.Append("DATE_FORMAT(intime,'%r') AS 'CHECK-IN TIME',");
datails.Append("CASE WHEN m_room_user.rent =0 THEN 'Free'  ");
datails.Append("ELSE 'Pass' END AS 'Passtype' FROM  m_reserve_userdetails,");
datails.Append("donor_contacts,m_room_user,m_room");
datails.Append("WHERE m_reserve_userdetails.id = donor_contacts.id");
datails.Append("AND  m_room_user.donor_id = m_reserve_userdetails.user_id");
datails.Append("AND m_reserve_userdetails.status=1");
datails.Append("AND indate ='" + obj.date + "'");

OdbcCommand cmd = new OdbcCommand(datails.ToString(), con);
OdbcDataAdapter oda = new OdbcDataAdapter(cmd);
DataTable dt = new DataTable();
oda.Fill(dt);
return dt;

}

我想知道,即使只有 8 个或 10 个附加项, stringBuilder 是否比 string 效果更好?正如我在上面添加的那样,我尝试对此进行查询。但我发现没有显着差异。此查询需要时间。我知道,很可能它需要查询优化。但是现在,我需要知道使用 stringBuilder 是否有任何进步,而只有 8 到 10 个附加项。提前致谢。

4

5 回答 5

2

当要连接的字符串数量在编译时固定时,普通连接总是表现得更好。此外,在您的第一个示例中,要连接的字符串要少得多。

我不知道有任何支持StringBuilder这里的论点。很清楚的案例。

请注意,第一个代码片段中的第一个字符串文字只是一个多行文字。无论如何,这里没有串联。此外,编译器优化"a" + "b""ab".

于 2013-10-04T10:35:16.623 回答
2

两者都不。您应该使用参数化查询。这是保护自己免受 SQL 注入攻击的最佳做法。

如果您仍想将值连接成字符串,则没有理由使用StringBuilder. 如果没有 ,连接已知数量的字符串会更好StringBuilder,因为文字字符串实际上将由编译器连接,而不是在运行时连接。

我注意到您甚至没有使用StringBuilder将值放入字符串中,而是首先将值连接到字符串中,然后将其发送到StringBuilder. 如果您使用 将StringBuilder值放入字符串中,则该值将单独在Append调用中。

于 2013-10-04T10:43:44.250 回答
2

在我看来,这种情况下没有性能问题。

String不可变的,StringBuilder可变的。如果要大量的字符串拼接,StringBuilder当然更好。

但我在这里只看到 12 个连接,我认为它们不会影响巨大的性能差异。

看看 Jeff 的文章《微优化剧场的悲惨悲剧》

编辑:是的,我完全错过了非参数化查询。

您应该始终使用参数化查询而不是这种字符串连接。因为这些对SQL 注入攻击开放。

于 2013-10-04T10:38:31.017 回答
1

从性能的角度来看,这是:

private const string details = "SELECT ... AND indate = '{0}'";

string.Format(details, obj.date);

在您的情况下,绝对比StringBuilder字符串连接更好(但对于格式化您的字符串需要稍作修改,而且您需要显微镜才能看到差异)。

从常识的角度来看,SQL 查询的字符串连接是一种通向地狱的方式。使用参数化查询:

private const string details = "SELECT ... AND indate = @indate";
于 2013-10-04T10:39:13.370 回答
0

恐怕您的场景中的正确答案是“两者都不是”...您对 SQL 命令使用字符串连接,这每次都是一件坏事。您应该做的是使用过程或带参数的查询。在这两种方法中,您都不需要连接。

如果我忽略了您将它用于 SQL 的事实,那么我使用的经验法则是:如果您将字符串连接多次,例如在一个循环中,请使用 StringBuilder。在其他情况下,使用简单的串联。

于 2013-10-04T10:45:42.813 回答