Этот вопрос вам могут задать на собеседовании в компании "Крок" и предложить примерно вот такой кусок кода:
using System;
using System.IO;
using System.Data.SqlClient;
namespace Test
{
class Program
{
public string Main(string strName)
{
SqlConnection cn = new SqlConnection("Data Source=.; Initial Catalog=SomeDb; User ID=sa; PWD=.;");
SqlCommand cmd = new SqlCommand("select somecolumn from sometable where somefield = "
+ strName);
SqlDataReader datareader = cmd.ExecuteReader();
datareader.Read();
return datareader.GetValue(0).ToString();
}
}
}
Здравствуйте, Hottabych1, Вы писали:
H>Этот вопрос вам могут задать на собеседовании в компании "Крок" и предложить примерно вот такой кусок кода:
H>
H>using System;
H>using System.IO;
H>using System.Data.SqlClient;
H>namespace Test
H>{
H> class Program
H> {
H> public string Main(string strName)
H> {
H> SqlConnection cn = new SqlConnection("Data Source=.; Initial Catalog=SomeDb; User ID=sa; PWD=.;");
H> SqlCommand cmd = new SqlCommand("select somecolumn from sometable where somefield = "
H> + strName);
H> SqlDataReader datareader = cmd.ExecuteReader();
H> datareader.Read();
H> return datareader.GetValue(0).ToString();
H> }
H> }
H>}
H>
Ну ладно, развлечемся немного...
— using не используется
— склейка запроса вместо использования параметров (строка, да еще от клиента, да еще незаэскейпленная, страшный сон вобщем....)
— использование позиционного обращения к результатам вместо поименованного
— не проверяется возвращенное значение на NULL
— нет вообще никакой обработки исключений
— сигнатура Main вообще-то другая
H> public string Main(string strName)
H> {
H> SqlConnection cn = new SqlConnection("Data Source=.; Initial Catalog=SomeDb; User ID=sa; PWD=.;");
H> SqlCommand cmd = new SqlCommand("select somecolumn from sometable where somefield = "
H> + strName);
H> SqlDataReader datareader = cmd.ExecuteReader();
H> datareader.Read();
H> return datareader.GetValue(0).ToString();
H> }
H>
— хардкод конекшен ытринга никуда не годится
— и я так и не уловил где используется етот самый конекшен, соответственно нет конекта нет соединения я уж не говорю что вообщето конект открывать и закрывать
— что-то непонятная функция майн
H>using System;
H>using System.IO;
H>using System.Data.SqlClient;
H>namespace Test
H>{
H> class Program
H> {
H> public string Main(string strName)
H> {
H> SqlConnection cn = new SqlConnection("Data Source=.; Initial Catalog=SomeDb; User ID=sa; PWD=.;");
H> SqlCommand cmd = new SqlCommand("select somecolumn from sometable where somefield = "
H> + strName);
H> SqlDataReader datareader = cmd.ExecuteReader();
H> datareader.Read();
H> return datareader.GetValue(0).ToString();
H> }
H> }
H>}
H>
Ну разве что для развлечения
1. Формально это, конечно, не ощибка, но функция Main, определенная таким вот образом, не является валидной точкой входа приложения. Да, в условиях задачи нигде не сказано, что она таковой подразумевается, но здравый смысл это подсказывает.
2. Захардкоденная строка соединения с БД — дурной тон.
3. SqlConnection надо открывать и закрывать. Для корректного закрытия просто напрашивается использование using.
4. Текст SqlCommand получается конкатенацией строки и нигде не проверяется. Тем самым открывается путь для SQL injection.
5. Созданный экземпляр SqlCommand никак не привязывается к экземпляру SqlConnection. Метод ExecuteReader бросит ошибку.
6. SqlCommand реализует IDisposable, поэтому желательно использовать using.
7. SqlDataReader реализует IDisposable, поэтому желательно использовать using (или закрывать ридер явно).
8. Нет проверки на то, что SqlDataReader вернул хоть один рекорд. Поэтому метод dataReader.GetValue(0) вполне может кинуть ошибку.
9. Нет вообще никакой обработки ошибок.