1

スニペットを作成して現在のクラスを分析し、そのクラスのプロパティを取得してから、コマンド パラメータの各プロパティを行ごとに書き出す SQL 関数を作成することはできますか。

私が探しているのは、次のようなことです:

public static int Add(MyObject Message) {
        MySqlConnection connection = new MySqlConnection(MySqlConnection);
        MySqlCommand command = new MySqlCommand("Add_Message", connection);
        command.CommandType = CommandType.StoredProcedure;
        command.Parameters.AddWithValue("@IMFromUserID", Message.IMFromUserID);
        command.Parameters.AddWithValue("@IMToUserID", Message.IMToUserID);
        command.Parameters.AddWithValue("@IMMessage", Message.IMMessage);
        command.Parameters.AddWithValue("@IMTimestamp", Message.IMTimestamp);
        connection.Open();
        MySqlDataReader reader = command.ExecuteReader();
        while (reader.Read()) {
            Message.IMID = (int)reader["IMID"];
        }
        command.Dispose();
        connection.Close();
        connection.Dispose();
        return Message.IMID;
    }

基本的に、スニペットで Add 関数全体を入力し、@PropertyNameMessage.PropertyNamecommand.Parameters.AddWithValue

4

1 に答える 1

0

コード スニペットは十分に強力ではないと思います。ReSharper のコード テンプレートは十分に強力かもしれませんが、私もそうは思いません。コード生成が本当に必要な場合、または必要な場合は、T4 テンプレートの使用を検討できます。

個人的には、コンパイル時のコード生成を完全に避けることをお勧めします。リフレクション (簡単だが遅い) またはランタイム コード生成 (複雑だが高速) を使用できます。パフォーマンスが主な関心事でない場合は、リフレクションを使用することをお勧めします。

 public static Int32 Add<TMessage>(TMessage message)
     where TMessage: IMessageWithIMID
 {
    using (var connection = new MySqlConnection(connectionString))
    using (var command = new MySqlCommand("Add_Message", connection))
    {
        command.CommandType = CommandType.StoredProcedure;

        // We look only at public instance properties but you can easily
        // change this and even use a custom attribute to control which
        // properties to include.
        var properties = typeof(TObject).GetProperties(BindingFlags.Public |
                                                       BindingFlags.Instance);

        foreach (var property in properties)
        {
            var parameterName = "@" + property.Name;

            var value = property.GetValue(message, null);

            command.Parameters.AddWithValue(parameterName, value);
        }

        connection.Open();

        message.IMID = (Int32)command.ExecuteScalar();

        return message.IMID;
    }
}

IMessageWithIMIDプロパティにアクセスするには、インターフェイスを導入して実装する必要があることに注意してくださいIMID

internal interface IMessageWithIMID
{
    Int32 IMID { get; set; }
}

データの読み取りも必要ないことに注意してください。使用するだけで済みますExecuteScalar()。これは

using (var reader = command.ExecuteReader())
{
    while (reader.Read())
    {
        message.IMID = (Int32)reader["IMID"];
    }
}

の中へ

message.IMID = (Int32)command.ExecuteScalar();

これで完了です。

于 2012-12-19T18:35:42.100 に答える