0

私は C# と SQL でパラメーターを渡すのは初めてですが、実装することが重要であることは知っています。

シナリオは次のとおりです。

既にシステムに関数を組み込んでいますが、関数に渡されるパラメーターを使用できるようにするために関数を編集する方法がわかりません。

INSERT または UPDATE を介して編集する私の機能は次のとおりです。

   namespace SQLFunc
   {
   class SQLClass
   {

   public void SQLEdit(string var_SQLCommand)
    {
        using (SqlConnection myConn = new SqlConnection(this.SQLConnectString))
        using (SqlCommand var_command = new SqlCommand(var_SQLCommand, myConn))
        {
            myConn.Open();
            try
            {
                var_command.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                MessageBox.Show("An error occurred: " + ex.Message + " using SQL Query: " + var_SQLCommand, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                myConn.Close();
            }
        }
    }
    ...

私の関数を使用するための私の一般的なコマンドは次のとおりです。

   using SQLFunc.SQLClass

   ....

   //command to variable
   var_Command = "UPDATE tbl_Table SET fld_Active = 'YES' WHERE fld_IDNo = " + var_A;

   //execute function
   var_SQLClass.SQLEdit(var_Command);

パラメータを使用して、コードに行きたい:

   using SQLFunc.SQLClass

   ....

   //command to variable
   var_Command = "UPDATE tbl_Table SET fld_Active = 'YES' WHERE fld_IDNo = @var_A_";

   // need to pass this entire line after the SQLCommand in the function SQLEdit
   var_Command.Parameters.AddWithValue("var_A_", var_A );

   var_SQLClass.SQLEdit(var_Command);

関数でパラメータ受け渡しを利用できるようにしたかったのです。変数 var_A を渡すことはできましたが、フィールド数が変わるたびに関数のコードを変更することなく、1 つのフィールド (更新または挿入) または 10 フィールド (更新または挿入) に対しても機能するように、コードを適応性に対応させたいと考えました。

これは達成可能ですか?もしそうなら、どのように?

4

3 に答える 3

1

いいね?

public void insert(string sql,Dictionary<stirng,object> parameters){
    using (SqlConnection myConn = new SqlConnection(this.SQLConnectString))
    using (SqlCommand var_command = new SqlCommand(var_SQLCommand, myConn))
    {
        myConn.Open();
        try
        {
            foreach(string name in parameters.Keys){
                var_Command.Parameters.AddWithValue(name, parameters[name] );
            }       
            var_command.ExecuteNonQuery();
        }
        catch (Exception ex)
        {
            MessageBox.Show("An error occurred: " + ex.Message + " using SQL Query: " + var_SQLCommand, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
        finally
        {
            myConn.Close();
        }
    }
}
于 2013-08-14T00:38:03.943 に答える
1

これが私がそれを行う方法です。

public class SqlClass
{
    public void ExecuteNonQuery(string sqlStatement, Dictionary<string, object> parameters)
    {
        using (SqlConnection connection = new SqlConnection(this.ConnectionString))
        {
            connection.Open();

            using (SqlCommand command = connection.CreateCommand())
            {
                command.CommandType = System.Data.CommandType.Text;
                command.CommandText = sqlStatement;

                foreach(var keyValuePair in parameters)
                {
                    command.Parameters.Add(new SqlParameter(keyValuePair.Key, keyValuePair.Value));
                }

                command.ExecuteNonQuery();

            }
        }
    }
}

SqlClass.ExecuteNonQuery() への呼び出しは次のようになります。

Dictionary<string, object> parameters = new Dictionary<string, object>
{
    { "@fld_Active", "Yes" },
    { "@fld_IDNo", 1 }
};

SqlClass sql = new SqlClass();
sql.ExecuteNonQuery("UPDATE tbl_Table SET fld_Active = @fld_Active WHERE fld_IDNo = @fld_IDNo", 
    parameters);
于 2013-08-14T01:21:51.190 に答える
0

私があなたを正しく理解していれば、「正常に動作」し、クエリの適切な場所にプラグインされるSQLEdit(command, /* params */)ような関数が必要です。paramsそうですか?

もしそうなら、それは難しいです。パラメータ化されたクエリを使用するには、SqlParameterオブジェクトを提供する必要があります。次に、引数の SQL Server データ型を知る必要がありますが、これは自動的に推測することはできません。DateTimeたとえば、Aは、Time、DateTime、または DateTime2 のいずれかです。文字列には、char、nchar、varchar、nvarchar、text、ntext などがあります。

あなたの最善の(最も冗長な場合)賭けは、実際にはのparamsようなものparams SqlParameter parametersを作成し、個々のパラメーターを使用する場所で自分で構築することです。独自のマッピング アルゴリズムを構築しようとすると、多大な費用がかかります。

使いやすさが必要な場合は、さまざまな ORM (Entity Framework、Dapper など) のいずれかを使用してください。生の SQL のパフォーマンスが必要な場合は、コードを書く準備をしてください。

物事を冗長にするために、パラメーターオブジェクトを作成するヘルパー関数を作成できます。これは、次のようなものです。これはメモリから実行したもので、テストしていません。

public static SqlParameter Create(string name, SqlDbType type, object value)
{
    var p = new SqlParameter();
    p.ParameterName = name;
    p.SqlDbType = type;

    // If type is a fixed-length type, maybe set the correct string length here

    if (value == null)
    {
        p.SqlValue = DBNull.Value;
    }
    else
    {
        p.SqlValue = value;
    }

    return p;
}
于 2013-08-14T00:43:11.203 に答える