2

このforeachループは、テスト中に5行のデータのみを返す場合は正常に機能しますが、書き込みがどれほど不十分であるかをよく知っています。stringbuilderを使用してこれをより効率的に再書き込みするより良い方法はありますか?

               SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["connstring"].ConnectionString);
    SqlCommand comm = new SqlCommand("SELECT Title, StartDate FROM tblEvents JOIN eo_UserEventWatch ON eo_UserEventWatch.EventID=tblEvents.ID WHERE eo_UserEventWatch.UserID = @GUID ;", conn);
    comm.Parameters.AddWithValue("GUID", userID);
    conn.Open();
    SqlDataAdapter da = new SqlDataAdapter(comm);
    DataTable dt = new DataTable();
    da.Fill(dt);
    string result ="{ \"event\" :[";
    foreach (DataRow dr in dt.Rows)
    {
        result += "{\"title\" : \"" + dr[0].ToString() + "\" , \"start\" : \"" + dr[1].ToString() +"\"} ,";
    }
    result = result.TrimEnd(',');
    result += "] }";
    return result;
4

3 に答える 3

5

はい、使用する方が効率的StringBuilderです:

StringBuilder builder = new StringBuilder("{ \"event\" :[");
foreach (DataRow row in dt.Rows)
{
    // Alternatively, use AppendFormat
    builder.Append("{\"title\" :\"");
           .Append(row[0])
           .Append("\", \"start\" : \"")
           .Append(row[1])
           .Append("\"} ,");
}
if (builder[builder.Length - 1] == ',')
{
    builder.Length -= 1;
}
builder.Append("] }");
string result = builder.ToString();

ただし、それでも良いコードではありません。恐ろしいリテラルJSONがすべてあるからです。Json.NETまたは別のJSONライブラリを使用することをお勧めします。その時点でおそらくLINQを使用できます。

var result = new { event = dt.AsEnumerable()
                             .Select(r => new { 
                                 title = r.Field<string>(0),
                                 start = r.Field<DateTime>(1))
                             .ToArray() };
// Or whatever, depending on the library you use
var json = JsonSerializer.ToJson(result);

他のことは別として、開始値の形式や、タイトルに引用符が含まれているかどうかなどを気にする必要はありません。

(編集:前述のように、 usingSQL接続などのステートメントは絶対に必要です。それは質問の要点の外にあるため、ここでは言及しませんでした。)

于 2012-06-23T18:41:16.290 に答える
1

StringBuilderの使用方法は次のとおりです

StringBuilder sb = new StringBuilder();
sb.Append("{ \"event\" :[");

foreach(DataRow dr in dt.Rows)
{
    sb.Append("{\"title\" : \"");
    sb.Append(dr[0].ToString());
    sb.Append("\" , \"start\" : \"");
    sb.Append(dr[1].ToString());
    sb.Append("\"} ,");
}

sb.Remove(sb.ToString().Length - 1, 1);
sb.Append("] }");

return sb.ToString();

これをより良い方法で完全に行うには、JavaScriptSerializer(単なるサンプル)のようなものを使用します。

var stuff= (from DataRow dr in dt.AsEnumerable()
            select new {
                 DataItem1 = (string)dr[0];
                 DataItem2 = (string)dr[1];
            });

JavaScriptSerializer serializer = new JavaScriptSerializer();
return serializer.Serialize(stuff);
于 2012-06-23T18:45:39.660 に答える
0

string.format は StringBuilder を内部的に使用します。

String.Format は StringBuilder と同じくらい効率的ですか

public static string GetResult()
        {
            int userId = 0;
            string connectionString = ConfigurationManager.ConnectionStrings["connstring"].ConnectionString;
            string statement = "SELECT Title, StartDate FROM tblEvents JOIN eo_UserEventWatch ON eo_UserEventWatch.EventID=tblEvents.ID WHERE eo_UserEventWatch.UserID = @GUID";

            using (var con = new SqlConnection(connectionString))          
            using (var cmd = new SqlCommand(statement, con))
            {
                con.Open();
                cmd.Parameters.AddWithValue("GUID", userId);
                using (var dataAdapter = new SqlDataAdapter(cmd))
                {
                    DataTable dt = new DataTable();
                    dataAdapter.Fill(dt);
                    string result = "{ \"event\" :[";
                    foreach (DataRow dr in dt.Rows)
                    {
                        result += string.Format(@"{\title\ : \{0}\ , \start\ : \{1}\} ,", dr[0].ToString(), dr[1].ToString());
                    }
                    result = result.TrimEnd(',');
                    result += "] }";
                    return result;
                }
            }          
        }
于 2012-06-23T18:57:39.047 に答える