<< Назад

Нехитрые Советы для программиста C#

1. Довольно часто нужно вернуть в коде истину, если число положительное, и ложь, если число отрицательное. Тогда, вместо того, чтобы писать что-то вроде этого:

public static bool TruOrFls(int i)

if  (i>0)

  {

       return true;

   }

else

  {

      return false;

   }

}

... можно написать такой простой код:

 public static bool TruOrFls(int i)

    {

         return (i > 0);

    }

 

 

2. Для определения, является ли целое число чётным или нечётным, можно использовать сл. метод:

public static bool IsNechet(int i)

{

    int result;

    Math.DivRem(i, 2, out result);

    return (result==1);

}

3. Простой класс для Шаблона "Одиночка" (Singleton) для создания форм:

namespace  MySpace

{

public static class SingletonForm

{

   private static Dictionary<Type, Form> forms = new Dictionary<Type,Form>();

   public static Form ShowInstance(Type t)

{

   if (!forms.ContainsKey(t)) {

  Form f = (Form)Activator.CreateInstance(t);

  f.Disposed += new EventHandler(f_Disposed);

  forms.Add(t, f);

}

    forms[t].Show();

    forms[t].Activate();

    return forms[t];

}

   static void f_Disposed(object sender, EventArgs e)

      {

          forms.Remove(sender.GetType());

       }

   }

}

 

Пример использования:

 

   public void btnsprTIP_Click(System.Object sender, System.EventArgs e)

     {

         SingletonForm.ShowInstance(typeof(frmMyForm));

     }

 

4. Для "отлавливания" неверно введённого символа в сетке(DataGridView) можно использовать событие DataError:

 

public void MyDtg_DataError(object sender, DataGridViewDataErrorEventArgs anError)

{

    int ColIndx = (int)anError.ColumnIndex;

    string ColHT = MyDtg.Columns[ColIndx].HeaderText;

    Utils.Mess(" " + ColHT + " !");

    MyDtg.CurrentCell.ErrorText = " " + ColHT;

}

 

5. Помещайте формы, классы, отчёты и т д. проекта в соответствующие подкаталоги с именами, например, FRM, CLS, RPT и т.д. Такая систематизация существенно облегчит вашу жизнь при работе с большими проектами. Мешанина из классов, форм, отчётов и пр. в одном подкаталоге вряд ли пойдёт на пользу качеству вашего проекта.

 

6. Если нужно постоянно обращаться к какому-то объекту ( или что-то возвращать из метода без передачи параметра внутрь его), то такую функцию удобно осуществлять с помощью аксессора get. Например, сл. код возвращает текущую строку в DataGrid View:

 

     public DataGridViewRow GetCurrentRowOb

       {

          get {return this.MyDtg.CurrentRow;}

       }

К такому методу можно обращаться просто как к переменной.

7. Вы можете назначить свою обработку какого-либо события в конструкторе сл. образом:

  public frmMain()

      {

         InitializeComponent();

 

        /*Альтернативная  обработка события */

        this.txtHr.KeyPress += new KeyPressEventHandler(this.ObrabKey);

 

      }

В приведённом примере назначаем метод обработки ObrabKey событию KeyPress

8. Технология LINQ может существенно сократить количество ваших клацаний по клавиатуре. Например сл. код возвращает  отсортированный массива:

 

public static string[] GetStr

{

// ...

get

 {

      string[] ar = new string  {"one", "two", "three", ...   "nine");

 };

    return ar;

}

/*Сортируем массив ...*/

public static IEnumerable<string> SortedList

{

   get

      {

         IEnumerable<string> sort = GetStr.OrderBy(a => a.j);

         return sort;

      }

}

9. Несложные классы (особенно если используется их большое количество экземпляров) лучше оформлять в виде структур - ключевое слово struct. Структура, в отличии от класса, является значимым типом. Экономия ресурсов, в этом случае, может оказаться весьма существенной.

10. Довольно часто приходиться итерировать объекты, которые не поддерживают интерфейс IEnumarable. Чтобы избежать это ограничение, существует специальная конструкция - yeild. Ниже приведён пример, как можно проитерировать коллекцию упр. элементы на  главной форме:

class Num : IEnumerable

{

frmMain MyF = GlobalVar.MainForm;

public System.Collections.IEnumerator GetEnumerator()

{

 

   yield return MyF.Panel1;

   yield return MyF.Panel2;

   yield return MyF.Panel3;

   yield return MyF.panel6;

   yield return MyF.GroupBox1;

   yield return MyF.groupBox2;

   yield return MyF.GroupBox3;

   yield return MyF.TableLayoutPanel1;

  yield return MyF.pictureBox1;

 

}

Вот теперь можно пробежаться в цикле -применение в вызывающей стороне:

foreach (Control cob in new Num())

 {

      cob.Anchor = AnchorStyles.Right;

  }

 

11. Использование конструкции using ( ...) { ... } гарантирует применение метода .Dispose() - освобождение объекта , например:

using (SqlCommand cmd = new SqlCommand(strSQL, GlobalVar.conn))

{

  // Здесь что-то делаем с объектом cmd ...

}

 // Это нужно делать, если не использовать using (...) {   }

// cmd.Dispose();

 

12. При работе с базами данных обязательно напишите класс с методами создания соединения с БД и его тестированием, что-то вроде этого:

 

static class clsConn

{

 

// Создание соединения ...

public static void CreateConn(string strmydir)

{

try

{

   GlobalVar.conn = new SqlConnection(ConnectStringBuild);

   GlobalVar.conn.Open();

}

catch (Exception)

{

     Utils.Mess(" Ошибка!");

}

}

 

// Тестирование соединения ...

public static bool TestConn

{

get

{

    try

       {

           using (SqlConnection testconn = new SqlConnection(ConnectStringBuild))

       {

              testconn.Open();

              return (testconn.State == ConnectionState.Open);

        }

 }

// ...

catch (SqlException)

{

  return false;

}

catch (InvalidOperationException)

{

  return false;

}

}

}

 

// Создание строки подключения к БД ...

public static string ConnectStringBuild

{

get

  {

       string s = "Data Source=" + My.Settings.Default.ServerName + @"\" + My.Settings.Default.SQLServerName + ";";

       return @s += "Initial Catalog=" + My.Settings.Default.BaseName + ";Integrated Security=True";

   }

}

 

 

 

13. Включите обработку ошибок в стартовый модуль вашей программы. Выше него ошибка "не поднимется"( выше только Господь Бог :-).  Что-то вроде этого:

 

sealed class mdlMain

{

[STAThread]

public static void Main(string[] args)

{

try

{

Application.EnableVisualStyles();

Application.SetCompatibleTextRenderingDefault(false);

GlobalVar.MainForm = new frmMain();

Application.Run(GlobalVar.MainForm);

}

catch (ArgumentNullException ane)

{

MessageBox.Show(ane.Message, " Main-ArgumentNullException");

}

catch (FormatException fex)

{

MessageBox.Show(fex.Message, " Main-FormatException");

}

catch (NullReferenceException nre)

{

MessageBox.Show(nre.Message, " Main-NullReferenceException");

}

catch (InvalidCastException ice)

{

MessageBox.Show(ice.Message, " Main-InvalidCastException");

}

catch (Exception ex)

{

MessageBox.Show(ex.Message , " o Main");

}

}

}

 

14. Если в программе постоянно приходиться обрабатывать неизменяемый массив строк, то инициализацию такого массива очень удобно оформить с помощью аксессора get (см. Совет 6), что-то вроде этого:

 

private static string[] GetStringArr

{

get

 {

     string[] ars = new string[] {

     "one " ,

     "two ",

     "three ",

      ...

      "nine "

 };

  return ars;

}

}

 

Тогда подсчитать, например, количество элементов в массиве очень просто:

   int RecCount1 = GetStringArr.Count();

Или, обращение к j-му элементу массива:

   string s = GetStringArr[j-1];

15. Довольно часто в коде нужно контролировать - является ли значение пустым, и вернуть, ну допустим, значение нуль для типа float. Осуществить такую проверку можно с помощью такого нехитрого метода:

   public static float CheckIt(object par)

       {

            return (Convert.ToSingle(Convert.IsDBNull(par) ? 0 : par));

        }

 

16. Если нужно знать, в каком столбце сетки DataGridView пользователь завершил редактирование ячейки, то можно использовать событие _CellEndEdit:

 

public void MyDtg_CellEndEdit(object sender, DataGridViewCellEventArgs e)

{

// Узнаём имя столбца ...

string ColName = MyDtg.Columns[e.ColumnIndex].Name;

try

{

switch (ColName)

{

case("Col1"):

/* Здесь что-то делаем ... */

break;

case("Col2"):

// ...

break;

case("Col3"):

}

}

 

17. Чтобы 'пробежаться'  по всем контролам в панели, и отловить, ну скажем, метки (Label) можно использовать такой код:

 

   foreach (Control cob in this.panel1.Controls)

       {

            if (cob is Label)

               {

                    /* Здесь что-то делаем с контролом типа Label */

               }

        }

 

18. К строковой переменной можно смело "приклеивать" целочисленные переменные. Среда CLR поймёт такое преобразование без метода ToString(). Это особенно бывает удобно при формировании SQL-запросов в виде строк, что-то вроде этого:

 

       int i=0;

     string sSQL="Update Itogi  SET Area=@area where kod=" + (i + 1);

 

19. 'Склеивать' строки лучше специально созданным для этого методом Concat для переменных типа  string:

 

   string s1 = "one";

   string s2 = "two";

   string s3 = "three";

   // Можно делать так:

   string sAll = s1+s2+s3;

   // ... но грамотнее так:

   string sAll = string.Concat(s1,s2,s3);

 

20.  Программисты как-то недооценивают удобство метода Format для строк  при формировании SQL-запросов . Например, вместо того, чтобы писать что-то вроде этого:

 

   // Можно делать так:

   string strUpdate = "Update Customers SET Balance=@Balance Where CustID=" +ID +" and SocialID=" + SocID;

 

   ... лучше написать такой код:

   // Грамотнее так:

         string strUpdate =  "Update Customers SET Balance=@Balance Where CustID=";

         string strSQLUpdate = string.Format("{0}{1} and SocialID={2}",  strUpdate, ID, SocID);

 

21. Иногда  бывает нужно  узнать индекс элемента в массиве, ну например, в цикле  foreach. Сделать это можно сл. образом:

 

// Есть массив строк ...

private static string[] GetStr

{

 get

   {

        string[] ars = new string[] {

            "one " ,

            "two ",

            "three ",

             ...

             "nine "

    };

        return ars;

   }

}

 

//В вызывающей стороне:

 

// Конечно, можно использовать счётчик ...

 int counter = -1;

   foreach (string s in GetStr)

        {

           ++counter;

           ...

        }

 

// ... но изящнее так :

 private static void Sub()

{

    foreach (string s in GetStr)

        {

           //Узнаём индекс элемента  s  в массиве ...

           int i = Array.IndexOf(GetStr, s);

           ...

        }

 }

 

22. Везде, где можно, предпочтительнее использовать типизированные коллекции, вместо классических массивов. Основные преимущества такого подхода заключаются в двух фактах: во-первых, коллекции позволяют не заботиться о контроле за выходом индекса за установленный размер (пресловутое Index Out of Range), а во-вторых, в них можно хранить (в отличии от нетипизированных списков) элементы одного типа. Итак, вместо использования скажем:

 

     string[] ars = new string[6]; 

 

... предпочтительнее использовать типизированный список List<string>:

 

     List<string> ars = new List<string>();

 

Небольшая ремарка. Вообще, на мой взгляд, в связи с появлением начиная , по-моему, с  .NET Framework 2.0 типизированных коллекций, классические массивы можно считать коллекциями устаревшего типа по причинам, указанным выше

 

23. Если в метод надо передавать много-много всяких входных параметров, то вместо такого "баяна" предпочтительнее передавать структуру.

 

   Например, вместо использования некоего метода XYZ

 

    static void XYZ(int a,  int b,  int c,  string d,  string e)

 

... можно сначала определить структуру:

 

struct ABC

{

    public int a,b,c;

    public string d,e;

 

 public ABC (int _a, int _b, int _c, string _d, string _e)

  {

       a=_a; b=_b; c=_c; d=_d; e=_e;

   }

}

 

  ... а затем передавать её в метод :

 

   static void XYZ(ABC mystru)

 

Вызов такого метода станет гораздо более изящным:

 

  /* Определяем экземпляр структуры ABC */

  ABC MyStru = new ABC (1,2,3,"one", "two");

 

  /*Вызываем метод XYZ */

   XYZ(MyStru);

 

24. Довольно часто программисты пользуются методом Parse для конвертации строковых величин в другие типы, что-то вроде этого:

 

        int j= int.Parse (MyVal.ToString());

 

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

 

       int j;

 

      /* Вернёт значение j=0, даже если метод TryParse потерпит неудачу */

      bool bVal = int.TryParse(MyVal.ToString(), out j);

 

25. Самый подходящий элемент для отображения содержания базы данных - это конечно же DataGridView,  упрощенно говоря, сетка данных. Но после завершения редактирования данных пользователем в такой сетке встаёт задача - как передать изменения в базу данных? Одно из решений такой задачки состоит в переписывании (в цикле естественно) значений ячеек сетки DataGridViewCell в значения объекта DataRow , привязанного к сетке объекта DataTable набора данных DataSet . Тут, правда, надо хорошо разбираться в идеологии объектной модели доступа к данным ADO. NET. Затем значения DataRow конкретного столбца переписываем SQL-конструкцией Update непосредственно в базу данных. Все циклы здесь можно прогонять конструкцией foreach

 

26. Иногда возникает сл. ситуация. На форме есть куча  однотипных элементов WinForms, одно и тоже событие которых обрабатывается одинаково. Как пример, есть несколько элементов TextBox, для которых событие, ну скажем, KeyPress обрабатывается одним и тем же методом.

Тогда, вместо такого забойного кода .... :

 

// Textbox1 ...

 public void txtbox1_KeyPress(object sender, KeyPressEventArgs e)

{

     ObrabKeyPress(sender, e);

}

 

// Textbox2 ...

 public void txtbox2_KeyPress(object sender, KeyPressEventArgs e)

{

     ObrabKeyPress(sender, e);

}

...

// TextboxN ...

 public void txtboxN_KeyPress(object sender, KeyPressEventArgs e)

{

     ObrabKeyPress(sender, e);

}

 

... можно сначала определить массив TextBox'ов :

 

 private TextBox[] RetTBox

{

    get

        {

            TextBox[] tba = new TextBox []{ txtBox1, txtBox2, ... , txtBoxN };

            return tba;

        }

 }

 

... а затем, скажем в конструкторе формы, прокрутить такой цикл :

 

 /* Добавляем свой обработчик контроля нажатия клавиш  */

foreach (TextBox tb in RetTBox)

          tb.KeyPress += new KeyPressEventHandler(ObrabKeyPress);

 

27.  У объекта ADO.Net Reader есть один весьма полезный метод - HasRows. Он возвращает значение true, если в запросе есть данные.

Проконтролировать наличие 'пустого' Reader'а в это случае становиться довольно легко:

 

 using (SqlCommand SelCustoms = new SqlCommand(sSel, conn2))

   {

         rReadCustomer = SelCustoms.ExecuteReader();

 

        //Нет записей  о заказчиках! Прекращаем читать ..

  if (!rReadCustomer.HasRows) return 0.0f;

 

// Пробежимся по всем записям Заказчиков ...

while (rReadCustomer.Read())

{

int tip = rReadCustomer.GetInt32(0);

// ... Здесь что-то читаем Reader'ом

}

04.08.2013

28. Хорошей альтернативой созданию параметров в простых SQL-запросах (объект Parameters) может стать использование строки запроса методом string.Format (см. Совет 20 ), что-то вроде этого:

string sSQL = string.Format("Select * From Customers where CustomerID={0}", CustID);

SqlCommand cmd = new SqlCommand(sSQL, conn2)

cmd. ExecuteScalar();

   Объём кода при этом значительно сокращается - необходимость описывать параметр, его тип и значение просто отпадает.

   04.08.2013

 

29. Приступая к созданию своего первого более-менее сложного проекта, не забудьте создать класс для размещения в нём всевозможных мелких вспомогательных утилит. Фактически, наличие такого класса (как правило с именем Utils), стало стандартом для проектирования  информационных систем на С#. Получиться что-то вроде аналог ящика для инструментов, из которого вы сможете время от времени доставать нужное (по контексту ситуации) приспособление.

   04.12.2013

 

30. Создание глобальных переменных, видимых из любой части программы, является одним из стандартных положений для разработчика любого уровня. Чаще всего, такая необходимость связана с использованием каких-то глобальных настроек программы. Одним из решений этой задачи является использование настроек  - пространство имён My.Setting . Тогда достаточно будет написать, ну скажем в классе Utils (см. Совет 29), простой метод для 'выдёргивания' значения этой настройки, что-то вроде этого (в приведённом ниже примере, если уж рассматривать совсем конкретный случай, просто взят год, принятый по умолчанию):

 

 public static int GetGodSetting

  {

      get {

                 return (int.Parse)(My.Settings.Default.god);

             }

  }

 

В любом месте программы для загрузки года, принятого в настройках  по умолчанию, можно использовать такое простое обращение:

 

    int God = Utils.GetGodSetting;

 

   04.12.2013

 

31. При использовании сложных классических WinForms, старайтесь не перегружать код формы. Например, если на форме есть много кнопок, нажатие которых надо обрабатывать, вместо такого кода (особенно если он забойный) ... :

 

 public void Btn1_Click(System.Object sender, System.EventArgs e)

   {

        // Здесь что-то обрабатываем при нажатии  на кнопку Btn1

    }

 

 public void Btn2_Click(System.Object sender, System.EventArgs e)

  {

      // Здесь что-то обрабатываем при нажатии  на кнопку Btn2

   }

 ...

 public void BtnN_Click(System.Object sender, System.EventArgs e)

  {

      // Здесь что-то обрабатываем при нажатии  на кнопку BtnN

   }

 

... можно создать класс ну скажем  clsClickBtn, в который вынести  все методы обработки при нажатии на кнопку, а в конструкторе формы разместить сл. код :

 

  Btn1.Click += new EventHandler(clsClickBtn.Btn1_Click);

  Btn2.Click += new EventHandler(clsClickBtn.Btn2_Click);

  ...

  BtnN.Click += new EventHandler(clsClickBtn.BtnN_Click);

 

Код формы в этом случае может сильно 'похудеть'.

04.12.2013, г. Юрьевец

 

32. Ещё один подход к обозначенной в п. 31 проблеме может быть следующий.

Сначала создаём структуру ну допустим для обработки нажатий на гиперссылку LinkLabel:

struct struLL

    {

         public LinkLabel l;

         public LinkLabelLinkClickedEventHandler h;

 

public struLL( LinkLabel _l, LinkLabelLinkClickedEventHandler _h)

   {

        this.l = _l;

        this.h = _h;

   }

}

Далее создаём список из обозначенной выше структуры, что-то вроде такого:

    private List<struLL> GetLLList

        {

            get

                {

                    List<struLL> opList = new List<struLL>();

                    opList.Add(new struLL(lL_A, clsLLblClick.MethodA));

                    opList.Add(new struLL(lL_B, clsLLblClick.MethodB));

                    /* .... */

                   opList.Add(new struLL(lL_Z, clsLLblClick.MethodZ));

                  

                   return opList;

           }

       }

 

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

foreach (struLL ll in GetLLList)

                 ll.l.LinkClicked += ll.h;

31.12.2013

 

33. Каким образом можно проитерировать управляющие элементы (контролы в просторечии) на форме? Один из подходов описан в Совете 26. Но существует ещё одно решение, пожалуй даже более изящное и простое. Заключается оно в том, что нужные контролы просто помещаем на форме в какой-либо контейнер, типа Panel. В этом случае в конструктор формы помещаем такой простой код (как пример для Кнопок - объект Button) для обработки нажатий :

 

 // Цикл по кнопкам в панели 1...

foreach (Button btn in panel1.Controls)

         btn.Click +=new EventHandler(btnClik);

 

28.03.2014

 

34.   При работе со справочниками часто требуется вернуть значение кода (ключа) по значению описания ключа.  Конечно, можно для решения такой задачки создать структуру с двумя полями. Но гораздо проще воспользоваться одной из уже существующих коллекций - например словарем Dictionary. Тогда указанный подход можно продемонстрировать на сл. примере.

 

Создаем следующий метод :

 

 public static int ReturnKodTown(string s)

{

 

  Dictionary<int, string> DicTowns = new Dictionary<int, string>();

  DicTowns.Add(1, "Москва");

  DicTowns.Add(2, "Санкт-Петербург");

  DicTowns.Add(3, "Казань");

  DicTowns.Add(4, "Новосибирск");

  DicTowns.Add(5, "Краснодар");

 

 return DicTowns.First(a => a.Value == s).Key;

}

 

 Теперь узнать код города  для нашего примера очень легко:

 

  string gorod = "Новосибирск";

  int kod = ReturnKodTown (gorod);

 

   09.08.2014

 

35.  При использовании параметризованных SQL-запросов предпочтительнее пользоваться более  современным методом .AddWithValue вместо .Add. Указывать тип поля при таком подходе не обязательнонужно только указать параметр и его значение:

 

 var myCMD = new SqlCommand(strInsSvod, GlobalVar.conn)

 var pars = myCMD.Parameters;

 pars.Clear();

 

  // Используем метод AddWithValue

  pars.AddWithValue("@myPar", myVal);

 

28.09.2014

 

36.  В развитии темы использования более рациональных подходов создания параметризованных запросов (Совет 35). У коллекции параметров Parameters объекта Command есть ещё один полезный метод, позволяющий загрузить  пaраметры в запрос массивом. Называется он . AddRange :

 

     // Готовим массив параметров ...

      private static SqlParameters[] GetMyPars

          {

              get

                 {

                     SqlParameter[] sqlPar = new SqlParameter[] {   new SqlParameter("@par1", myVal1)),

                                                                                               new SqlParameter("@par2", myVal2)),

                                                                                               ...

                                                                                               new SqlParameter("@parN", myValN))

                                                                                          }

                     return sqlPar;

                }

 

// Использование метода .AddRange

        using (var cmd = new SqlCommand(s, GlobalVar.conn))

{

   var pc = cmd.Parameters;

    pc.Clear();

    pc.AddRange(GetMyPars);

    cmd.ExecuteNonQuery();

}

28.09.2014

 

37.   При инициализации коллекций типа List<...> вместо  такого кода:

List<string> MyList = new List<string>();

MyList. Add("один") ;

MyList.Add("два");

MyList.Add("три");

...

MyList.Add("девять");

... можно использовать более короткую эквивалентную запись:

var MyList = new List<string>

  { "один", "два", "три", 

     ...

     "девять"

  }

07.01. 2015

 

38.   При работе с коллекциями иногда хотелось бы не только проитерировать их в одном операторе, но и совершить какую-то обработку. В качестве примера , предположим, что есть массив :

 

var myInt = new int[] { 1, 2, 3, 4, 5, 6, 7, 8 };

 

... и для значений массива меньше или равно 5, нужно умножить на 2, а для более  5  умножить на 3.

 

Здесь на помощь может придти делегат Func<T>  и блочный лямбда-оператор. Что-то вроде этого (понятное дело, блочный лямбда-оператор может быть много сложнее и состоять не из одной строки, как в случае нашего простенького примера):

 

 Func<int, int, int> myFunc = (z, y) => {

         return (z <=  y)  ?  2 * z :  3 * z;

    };

 

Теперь, чтобы получить массив обработанных значений gruppa , можно написать такой простой код  одной строчкой ( никакого foreach не нужно ! ) :

 

 var gruppa = myInt.Select(a => myFunc(a, 5)).ToArray();

             10.01. 2015 , г. Обнинск

 

 

40.   Назначить свой обработчик событий, скажем, для ввода данных в TextBox можно еще и с использование лямбда-оператора сл. образом (метод MyObrabKeyPress) :

 

 textBox1.KeyPress += (o, e) => MyObrabKeyPress( o, e);

 

Тогда, даже можно создать свой метод для обработки нажатий в нескольких контролах, что-то вроде такого:

 

 void ObrabTxtKeyPress()

{

    textBox1.KeyPress += (o, e) => MyObrabKeyPress( o, e);

    textBox2.KeyPress += (o, e) => MyObrabKeyPress( o, e);

    textBox3.KeyPress += (o, e) => MyObrabKeyPress( o, e);

  ...

  textBoxN.KeyPress += (o, e) => MyObrabKeyPress( o, e);

 

}

 

Затем, такой метод лучше всего поместить в конструктор формы, на которой расположены наши контролы (TextBox'ы для случая нашего примера) :

 

 public frmMain()

{

InitializeComponent();

...

ObrabTxtKeyPress();

 

}

 

09.11. 2015

 

41.    Тем, кто создает приложения для работы с базами данных, случается иметь дело с весьма 'забойными' SQL-запросами, которые могут занять десятки строчек кода. Но хранить такие запросы в тексте программы, несмотря на определенное удобство для разработчика (код запроса виден прямо в теле программы) не всегда изящно по причине необходимости 'сцепки' строчек в запросе. И здесь возможно два варианта решения задачи хранения 'тяжелых' запросов. Первый заключается в перемещении запроса непосредственно в базу данных в виде хранимой процедуры (Store Procedure). Второй путь связан  с перемещением скрипта в строковую переменную в Настройки (Setting, см. п.30)

 

09.11. 2015

 

42.     В продолжении темы п.41 .  В код программы на C#  'запилить'  длинный SQL-запрос можно используя символ литерала '@'. В этом случае отпадает необходимость в конкатенации строк.  Выглядит такая конструкция может приблизительно сл. образом :

 

     string  mySql  = @"Первая длинная строка запроса

                                   Вторая ну очень длинная строка запроса

                                   Третья длинная строка запроса

                                   ...

                                   Последняя строка ну очень длинного запроса";

 

29.05. 2016

 

 

©Simashkov.2010-2016

Назад