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 但我希望我的代码能够适应适应性,例如它应该适用于一个字段(更新或插入)甚至 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 数据类型,这是无法自动推断的。例如, ADateTime可能是 Time、DateTime 或 DateTime2 之一。字符串可以是 char、nchar、varchar、nvarchar、text、ntext……你懂的。

您最好的(如果最冗长的话)的赌注实际上是制作类似的params东西params SqlParameter parameters,并自己建立各个参数,在哪里使用它们。尝试构建自己的映射算法将付出高昂的代价。

如果您想要易用性,请使用任何各种 ORM(实体框架、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 回答