2010-02-22 5 views
1

Мне нужно добавить Sqlquery для каждой строки в datatable. У меня 36 столбцов и на основе типа данных для каждого столбца мне нужно добавить sqlquery. Возможно, кто-нибудь предложит мне эффективный способ сделать это. это плохой способ кодирования, чтобы использовать оператор «+» для добавления текста между добавлением?Эффективное использование StringBuilder

Following is my code. 

query ="INSERT INTO MASTERPI (tag,instrumenttag)"); 
query += "VALUES ('" + createTagRow["tag"].ToString() + "','" + createTagRow["instrumenttag"].ToString() + "'"); 

Спасибо, Vix

+2

Мои глаза ... эти очки ничего не делать! – Aaronaught

+0

о человеке. Как вы это делаете ?? тестирование ограничений StringBuilder! –

ответ

0

Ваш код, вероятно, будет более удобным для чтения, если вы использовали String.Format для построения каждой строки запроса, используя его синтаксис заполнителя интерполировать данные из объекта строки в текст запроса.

+0

Производительность, это не намного лучше, чем конкатенация. Вы все еще создаете кучу лишних экземпляров 'string' вместо эффективного использования' StringBuilder'. – Aaronaught

+0

Я бы предположил, что вы также создаете метод расширения для обработки конкатенации строк, просто с точки зрения читаемости кода в сочетании с приведенным выше ответом. – Ahmad

+0

@Ahmad: Что делает метод расширения здесь? Хотел бы я скомпенсировать комментарии. – Aaronaught

5

Если вы уже используете StringBuilder, то вредно использовать регулярную конкатенацию строк одновременно. Вы отрицаете половину полезности класса StringBuilder. Не делай этого. Используйте метод StringBuilder.Append и исключите из них +.

Я также думаю, что все эти звонки являются расточительными. Что-то там выполняет сериализацию этих элементов в строку, поэтому вы эффективно выполняете работу дважды, создавая строку и добавляя ее. Если вы можете передать StringBuilder себе на звонки createTagRow, это также было бы намного меньше ... страшно.

На самом деле, при втором образе, кажется, что этот код создает SQL-запрос. Параметрируйте этот запрос ТЕПЕРЬ. Никаких оправданий. Таким образом вам даже не нужно будет беспокоиться о string.Format против StringBuilder против конкатенации, библиотека БД будет обрабатывать все это для вас.

+2

+1 для параметризации запроса - что-нибудь еще задает проблемы – Will

0

Как уже упоминалось, вы должны рассмотреть две возможности:

  1. Aaronaught: Parameterize that query
  2. Если вам нужен полный контроль над строкой заявления, вы должны смотреть в .FormatWith extension и реорганизовать свои различные блоки на классы, которые возвращают нужные части.

Небольшой пример:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text.RegularExpressions; 
using System.Web.UI; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var columns = new CommaSeparated(); 

      columns.Add("tag"); 
      columns.Add("instrumenttag"); 
      columns.Add("pointsource"); 
      columns.Add("pointtype"); 
      columns.Add("dataowner"); 
      columns.Add("dataaccess"); 
      columns.Add("location1"); 
      columns.Add("location2"); 
      columns.Add("location3"); 
      columns.Add("location4"); 
      columns.Add("location5"); 
      columns.Add("..."); 


      var values = new CommaSeparated(); 

      values.EncloseEachElementWith = "'"; 
      values.Add(createTagRow["tag"].ToString()); 
      values.Add(createTagRow["instrumenttag"].ToString()); 
      values.Add(createTagRow["pointsource"].ToString()); 
      values.Add(createTagRow["pointtype"].ToString()); 
      values.Add(createTagRow["dataowner"].ToString()); 
      values.Add(createTagRow["dataaccess"].ToString()); 
      values.Add(createTagRow["location1"].ToString()); 
      values.Add(createTagRow["location2"].ToString()); 
      values.Add(createTagRow["location3"].ToString()); 
      values.Add(createTagRow["location4"].ToString()); 
      values.Add(createTagRow["location5"].ToString()); 
      values.Add(createTagRow["..."].ToString()); 

      //INSERT INTO MASTERPI ({columns}) values ({values}) 
      var query = "INSERT INTO MASTERPI ({columns}) values ({values})".FormatWith(new { columns, values }); 

      Console.WriteLine(query); 
      Console.ReadKey(); 
     } 
    } 

    public class CommaSeparated : List<string> 
    { 
     public CommaSeparated() 
      : base() 
     { 
      EncloseEachElementWith = String.Empty; 
     } 

     public override string ToString() 
     { 
      var elements = this.Select(element => String.Format("{0}{1}{0}", EncloseEachElementWith, element)); 

      return String.Join(", ", elements.ToArray()); 
     } 

     public string EncloseEachElementWith { get; set; } 
    } 

    public static class StringExtensions 
    { 
     public static string FormatWith(this string format, object source) 
     { 
      return FormatWith(format, null, source); 
     } 

     public static string FormatWith(this string format, IFormatProvider provider, object source) 
     { 
      if (format == null) 
       throw new ArgumentNullException("format"); 

      Regex r = new Regex(@"(?<start>\{)+(?<property>[\w\.\[\]]+)(?<format>:[^}]+)?(?<end>\})+", 
       RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.IgnoreCase); 

      List<object> values = new List<object>(); 
      string rewrittenFormat = r.Replace(format, delegate(Match m) 
      { 
       Group startGroup = m.Groups["start"]; 
       Group propertyGroup = m.Groups["property"]; 
       Group formatGroup = m.Groups["format"]; 
       Group endGroup = m.Groups["end"]; 

       values.Add((propertyGroup.Value == "0") 
        ? source 
        : DataBinder.Eval(source, propertyGroup.Value)); 

       return new string('{', startGroup.Captures.Count) + (values.Count - 1) + formatGroup.Value 
        + new string('}', endGroup.Captures.Count); 
      }); 

      return string.Format(provider, rewrittenFormat, values.ToArray()); 
     } 
    } 
} 
+0

Я пытаюсь использовать строку + = вот так: query = "INSERT INTO MASTERPI (tag, tooltag)"); query + = "VALUES ('" + createTagRow ["tag"]. ToString() + "', '" + createTagRow ["tooltag"]. ToString() + "'"); Эффективно ли это? – vix

+0

На вопрос, эффективен ли он, его очень трудно прочитать. Таким образом, он неэффективен в отношении ремонтопригодности.Мой подход также не совсем совершенен, потому что оба списка должны быть в одном порядке. Этого можно достичь, используя какой-то Tuple , но это можно решить самим пользователем. Он должен только показать другой подход к решению этой проблемы. – Oliver

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