2016-06-30 9 views
-1

実際のオブジェクトを作成する前にMySQLCommandオブジェクトのパラメータを作成する方法はありますか?MySQLのパラメータを追加する

は現在、私はこのように生成されたコマンドを設定する必要があります。

public static MySqlCommand User(MySqlConnection MySQL, User u) 
{ 
    var cmdVars = new List<string>(); 
    const string cmd = "SELECT * FROM `schema`.`table` WHERE 1=1 AND "; 

    if (u.ID != null) cmdVars.Add("`ID` LIKE @0"); 
    if (u.Username != null) cmdVars.Add("`Username` LIKE @1"); 
    if (u.First != null) cmdVars.Add("`FirstName` LIKE @2"); 
    if (u.Last != null) cmdVars.Add("`LastName` LIKE @3"); 
    if (u.Phone != null) cmdVars.Add("`Phone` LIKE @4"); 
    if (u.Extension != null) cmdVars.Add("`Extension` LIKE @5"); 
    if (u.Email != null) cmdVars.Add("`Email` LIKE @6"); 

    var MySqlCmd = new MySqlCommand(cmd + string.Join(" AND ", cmdVars), MySQL); 

    if (u.ID != null) MySqlCmd.Parameters.AddWithValue("@0", u.ID); 
    if (u.Username != null) MySqlCmd.Parameters.AddWithValue("@1", u.Username); 
    if (u.First != null) MySqlCmd.Parameters.AddWithValue("@2", u.First); 
    if (u.Last != null) MySqlCmd.Parameters.AddWithValue("@3", u.Last); 
    if (u.Phone != null) MySqlCmd.Parameters.AddWithValue("@4", u.Phone); 
    if (u.Extension != null) MySqlCmd.Parameters.AddWithValue("@5", u.Extension); 
    if (u.Email != null) MySqlCmd.Parameters.AddWithValue("@6", u.Email); 

    return MySqlCmd; 
} 

どちらが、細かい動作しますが、より多くのパラメータが追加されると見て総額でわずかに新しいユーザオブジェクトを作成するには、ユーザーが必要です1つの値で検索する。

私はin this questionの方法に切り替えると考えましたが、MySQLConnectorで使用すると値を管理するのが非常に複雑になり、読みやすさを向上させるために何もしません。

答えて

0

どのように、あなたは関係なく、NULLかのかどうか、すべてのパラメータを追加することができ、この

... WHERE (@0 is null or `ID` LIKE @0) 
     AND (@1 is null or `Username` LIKE @1) 
     AND (@2 is null or `FirstName` LIKE @2) ... 

のようなクエリを使用してについて。

あなたは次のようになり、この

private void FillNullValuesWithDbNull(SqlParameterCollection parameters) 
{ 
    foreach (IDataParameter param in parameters) 
    { 
     if (param.Value == null) param.Value = DBNull.Value; 
    } 
} 
0

私の提案を実行することができます実行する代わりに、関数に渡さUserインスタンスを持つ前に、UserSearchCriteriaのようなものと呼ばれる新しいクラスを作成します。そのクラスははるかに単純な設計(0パラメータのコンストラクタ、単純なセッタを持つすべてのプロパティなど)を持つことができます。

ファンクションコードを短縮または「クリーンアップ」することはあまりありませんが、関数を使用する方がずっと簡単です。


実際には、限りの機能が行くように、あなたはおそらくこのような何かを行うことができます... `schema`.`table``と`」との間に差がある以外は

public static MySqlCommand User(MySqlConnection MySQL, UserSearchCriteria u) 
{ 
    var cmdVars = new List<string>(); 
    const string cmd = "SELECT * FROM `schema`.`table` WHERE 1=1 AND "; 

    var MySqlCmd = new MySqlCommand("", MySQL); 

    if (u.ID != null) 
    { 
     cmdVars.Add("`ID` LIKE @0"); 
     MySqlCmd.Parameters.AddWithValue("@0", u.ID); 
    } 
    if (u.Username != null) 
    { 
     cmdVars.Add("`Username` LIKE @1"); 
     MySqlCmd.Parameters.AddWithValue("@1", u.Username); 
    } 

    // and the rest of the relevant properties 

    MySqlCmd.CommandText = cmd + string.Join(" AND ", cmdVars); 

    return MySqlCmd; 
} 

public void somefunction() 
{ 
    var myCmd = User(someconnections, new UserSearchCriteria() {FirstName = "Joe"}); 
} 
+0

schema'.table'' – MethodMan

+0

@MethodManあなたが何を言おうとしているのか分かりません。 – Uueerdo

+0

私はまだあなたが何を意味するか分からない。私が投稿した箇所には一重引用符はありません。また、 ""はスキーマ、表、およびフィールド名を囲むためにMySQLで使用されているものです。 (_ "それを見つけ出す" _あなたがトローリングしているように見せて、実際に問題を指摘することはできません) – Uueerdo

関連する問題