小编典典

使用未知名称/参数数量更新sql语句

sql

我有一个经典的ASP网站,正在逐步升级。我想创建一个函数来 安全地 更新SQL数据库,而无需手动指定参数。有点动态。

(我不想使用实体框架或Linq)

这是到目前为止的代码:

string updateSql = "UPDATE sometable" + "SET test1= @testData1 " + "WHERE a = @aData1";
SqlCommand UpdateCmd = new SqlCommand(updateSql, conn);
UpdateCmd.Parameters.Add("@testData1 ", SqlDbType.NVarChar, 10, "testData1 ");
UpdateCmd.Parameters.Add("@aData1", SqlDbType.NVarChar, 20, "aData1");
UpdateCmd.Parameters["@testData1 "].Value = "21515";
UpdateCmd.Parameters["@aData1"].Value = "32t3t";
UpdateCmd.ExecuteNonQuery();

伪代码(我要实现的目标)

创建一个涵盖所有变量的Ilist {get; 设置:} [在此处验证类型/长度]

对于每个包含值的变量(无验证问题),请创建sql更新字符串。

执行它。

可能的问题: 我可以预见的唯一问题是,列表可能有500个变量,但是每个SQL更新可能只有2或3列正在更新。这不是很有效吗?


阅读 225

收藏
2021-04-07

共1个答案

小编典典

你需要做这样的事情....显然需要更多的编码....

 static void Main(string[] args)
    {
        var values = new Dictionary<string, object>( );

        values.Add( "name", "timmerz" );
        values.Add( "dob", DateTime.Now );
        values.Add( "sex", "m" );

        SqlUpdate( "sometable", values );
    }

    public static void SqlUpdate( string table, Dictionary<string,object> values, string where )
    {
        var equals      = new List<string>( );
        var parameters  = new List<SqlParameter>( );

        var i = 0;

        foreach( var item in values )
        {
            var pn = "@sp" + i.ToString( );

            equals.Add( string.Format( "{0}={1}", item.Key, pn ) );

            parameters.Add( new SqlParameter( pn, item.Value ) );

            i++;
        }

        string command = string.Format( "update {0} set {1} where {2}", table, string.Join( ", ", equals.ToArray( ) ), where );

        var sqlcommand = new SqlCommand(command);

        sqlcommand.Parameters.AddRange(parameters.ToArray( ) );

        sqlcommand.ExecuteNonQuery( );
    }
2021-04-07