1

データテーブルの各行にSqlqueryを追加する必要があります.36列あり、各列のデータ型に基づいてsqlqueryを追加する必要があります。誰かがそれを行うための効果的な方法を提案できますか?使用するためのコーディングの悪い方法ですか?追加の間にテキストを追加する「+」演算子?

Following is my code.

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

ありがとう、Vix

4

3 に答える 3

5

すでにを使用している場合は、StringBuilder通常の文字列連結を同時に使用することは有害です。StringBuilderクラスの効用の半分を否定しています。しないでください。StringBuilder.Appendメソッドexclusiveを使用して、これらの+ステートメントを削除します。

createTagRow(...).ToString()また、これらの呼び出しはすべて無駄だと思います。そこにある何かがそれらの要素を文字列にシリアル化する作業を行っているので、効果的に2回作業を行い、文字列を作成してから追加します。StringBuilderあなたがそれらの呼び出しに自分自身を渡すことが可能であるならばcreateTagRow、それはまたはるかに少ないでしょう...怖い。

実際、2回目の調査では、このコードはSQLクエリを作成しているようです。 そのクエリを今すぐパラメータ化します。言い訳しない。string.Formatそうすれば、対連結について心配する必要さえありませんStringBuilder。DBライブラリがすべてを処理します。

于 2010-02-22T06:52:25.147 に答える
0

String.Formatを使用してクエリの各行を作成し、そのプレースホルダー構文を使用して行オブジェクトからクエリ テキストにデータを補間すると、おそらくコードが読みやすくなります。

于 2010-02-22T06:51:15.333 に答える
0

すでに述べたように、次の 2 つの可能性を考慮する必要があります。

  1. Aaronaught:そのクエリをパラメータ化する
  2. ステートメント文字列を完全に制御する必要がある場合は、.FormatWith 拡張子を調べ、さまざまなブロックをクラスにリファクタリングして、必要な部分を元に戻す必要があります。

ちょっとした例:

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());
        }
    }
}
于 2010-02-22T07:53:36.077 に答える