2013-10-04 2 views
-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; 
} 

ИЛИпроизводительность StringBuilder в небольшом количестве добавления

общественного DataTable dt_date (resbal OBJ) { соединение();

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; 

}

Я хотел бы знать, как StringBuilder работает лучше, чем строка, даже если есть только 8 или 10 Добавление данных? Я попробовал запрос по этому вопросу, как я добавил выше. Но я не нашел замечательной разницы. Этот запрос требует времени. Скорее всего, он нуждается в оптимизации запросов, я знаю. Но теперь мне нужно знать, есть ли немного прогресса в использовании stringBuilder, хотя есть только от 8 до 10 приложений. Заранее спасибо.

+0

После этого вы создаете _database call_ direclty. Выполнение самого запроса будет _аклее_ медленнее любого рода конкатенации строк. Если вы хотите понять, как работает StringBuilder, см., Например, [Когда использовать StringBuilder?] (Http://stackoverflow.com/questions/1825781/when-to-use-stringbuilder). – CodeCaster

+0

Спасибо за все ответы и ваше терпение. Это помогает мне. Спасибо. – sijovw

ответ

1

С точки производительности, это:

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

string.Format(details, obj.date); 

, безусловно, лучше в вашем случае, чем StringBuilder или даже конкатенации строк (но для форматирования строки нужно немного модифицировать, а также вы будете нуждаться в микроскоп, чтобы увидеть разницу).

С точки зрения здравого смысла, конкатенации строк для SQL-запросов - это путь в ад. Использовать параметризованные запросы:

private const string details = "SELECT ... AND indate = @indate"; 
+0

Наконец-то кто-то заметил использование - SQL-запрос :) +1 – walther

+0

string.Format во много раз медленнее. Он также конкатенируется (как еще он может построить новую строку?), Но, кроме того, он должен разбирать строку формата. – usr

+0

@usr: может быть. Я слишком ленив, чтобы измерить микро-оптимизации. – Dennis

2

Когда количество строк для concat фиксировано во время компиляции, нормальное конкатенация всегда работает лучше. Кроме того, в вашем первом примере у вас гораздо меньше строк для concat.

Я не знаю ни одного аргумента, который был бы в пользу StringBuilder здесь. Очень ясный случай.

Обратите внимание, что первый строковый литерал в первом фрагменте кода представляет собой только один многострочный литерал. В любом случае, никакого конкатенации здесь нет. Кроме того, компилятор оптимизирует "a" + "b" в "ab".

+0

+1 Не знал, что если число строк в concat фиксировано, это лучше. Хотя, вероятно, еще и микро-оптимизация. У вас есть источник? Причина в том, что он быстрее? – Peter

+0

Действительно? Вы заметили использование этой конкретной конкатенации? – walther

+0

Нет инструкции IL для конкатенации строк. Это вызов библиотеки 'string.Concat'. Посмотрите на перегрузки. Компилятор всегда выбирает оптимальный. – usr

2

По моему мнению, в этом случае нет проблемы с производительностью.

String является неизменны, StringBuilder является изменяемые. Если вы хотите много строка конкатенации, StringBuilder, конечно, лучше.

Но я вижу здесь всего 12 конкатенаций, я не думаю, что они влияют на огромную разницу в производительности.

Взгляните на статью Джеффа под названием The Sad Tragedy of Micro-Optimization Theater

EDIT: Yeap, я полностью пропустил Abour без параметризованных запросов.

Вы должны всегда использовать parameterized queries вместо этого такого рода конкатенации строк. Потому что они открыты для SQL Injection атак.

2

Ни то, ни другое. Вы должны использовать параметризованный запрос. Это лучшая практика для защиты от атак SQL-инъекций.

Если вы все еще хотите объединить значение в строку, нет причин использовать StringBuilder. Конкатенация известного количества строк работает еще лучше без StringBuilder, поскольку литеральные строки фактически будут объединены компилятором, а не во время выполнения.

Я заметил, что вы даже не использовали StringBuilder, чтобы поместить значение в строку, но сначала соедините это значение с строкой, а затем отправьте ее на StringBuilder. Если вы будете использовать StringBuilder, чтобы поместить значение в строку, тогда значение будет в вызове Append.

0

Правильный ответ в вашем сценарии «ни один», я боюсь ... Вы используете конкатенацию строк для команды SQL, и это ОБЫЧНАЯ вещь каждый раз. Вместо этого вы должны использовать либо процедуры, либо запросы с параметрами. Ни в одном из этих подходов вам не понадобится конкатенация.

Если я игнорирую тот факт, что вы используете его для SQL, есть правило большого пальца, которое я использую: , если вы объединяете строки MULTIPLE раз, например. в цикле, используйте StringBuilder. В других случаях используйте простую конкатенацию.

Смежные вопросы