update sql statement with unknown name/amount of params

后端 未结 3 1632
礼貌的吻别
礼貌的吻别 2021-01-16 07:12

I have a classic ASP site, that I am slowly upgrading. I would like to create a function to securely update a SQL database without specifying parameters man

相关标签:
3条回答
  • 2021-01-16 08:02

    If you are using SQL Server 2008 you have the option of passing in the parameters and their values as a table to a Stored Procedure. Inside the Stored Procedure you can join the table to be updated with the table passed in. That would probably be more efficient than creating hundreds of sep update statements. Here is a link that may help http://msdn.microsoft.com/en-us/library/bb675163.aspx And here is some sample code based on the code you posted in your question

    First Create a table to play with and populate it with some data

    CREATE TABLE [dbo].[sometable](
        [Test1] [nvarchar](100) NULL,
        [a] [nvarchar](100) NULL
    ) ON [PRIMARY]
    
    Insert sometable Select 'rerere', '122342'
    Insert sometable Select 'sfsfw', '343'
    Insert sometable Select 'sfdrgss', '434545'
    Insert sometable Select 'srgegrgeg', '3939932'
    

    Then Create the Type in SQL Server

    Create TYPE dbo.ParamsType AS TABLE
    ( Test1 nvarchar(100), a nvarchar(100) )
    

    Then Create the Stored Procedure that accepts the type as a parameter

        CREATE PROCEDURE usp_UpdateSomeTable 
    @Parameters dbo.ParamsType READONLY
    AS
    BEGIN
        SET NOCOUNT ON;
    UPDATE sometable
        SET sometable.Test1 = p.Test1
        FROM sometable INNER JOIN @Parameters as p
        ON sometable.a = p.a;
    END
    GO
    

    To test from SQL Server Management Studio you can run

    Declare @t as ParamsType
    Insert @t Select 'newValue1', '122342'
    Insert @t Select 'morenew ', '343'
    Insert @t Select 'again', '434545'
    Insert @t Select 'OnceMore', '3939932'
    
    exec usp_UpdateSomeTable @Parameters=@t
    

    To Test from C# Try

            static void Main(string[] args)
            {
                System.Data.DataTable YourData = new DataTable("Parameters");
                DataColumn column;
                DataRow row;
    
                column = new DataColumn();
                column.DataType = System.Type.GetType("System.String");
                column.ColumnName = "Test1";
                YourData.Columns.Add(column);
    
                column = new DataColumn();
                column.DataType = System.Type.GetType("System.String");
                column.ColumnName = "a";
    
                YourData.Columns.Add(column);
    
                row = YourData.NewRow();
                row["Test1"] = "newValue1";
                row["a"] = "122342";
                YourData.Rows.Add(row);
    
                row = YourData.NewRow();
                row["Test1"] = "morenew";
                row["a"] = "343";
                YourData.Rows.Add(row);
    
                row = YourData.NewRow();
                row["Test1"] = "again";
                row["a"] = "434545";
                YourData.Rows.Add(row);
    
                SqlConnectionStringBuilder connString = new SqlConnectionStringBuilder();
                connString.DataSource = "127.0.0.1";
                connString.InitialCatalog = "SO";
                connString.IntegratedSecurity = true;
    
                using (SqlConnection conn = new SqlConnection())
                using (SqlCommand cmd = new SqlCommand())
                {
                    cmd.CommandText = "usp_UpdateSomeTable";
                    cmd.CommandType = System.Data.CommandType.StoredProcedure;
                    SqlParameter p = cmd.Parameters.AddWithValue("@Parameters", YourData);
                    p.SqlDbType = SqlDbType.Structured;
                    p.TypeName = "dbo.ParamsType";
    
                    cmd.Connection = conn;
    
                    conn.ConnectionString = connString.ConnectionString;
                    conn.Open();
                    cmd.ExecuteNonQuery();
                }
            }
    
    0 讨论(0)
  • 2021-01-16 08:07

    you need to do something like this....needs more coding obviously....

     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( );
        }
    
    0 讨论(0)
  • 2021-01-16 08:16

    I'm not sure I fully understand what you're trying to do, but this might be close to what you're looking for. You can create an arbitrarily long list of parameters and respective values, then build the corresponding UPDATE dynamically from that list.

    //set up SqlCommand
    SqlCommand UpdateCmd = new SqlCommand();
    UpdateCmd.Connection = conn;
    
    //build your dictionary (probably happens elsewhere in your code)
    Dictionary<string, object> parameters = new Dictionary<string, object>();
    parameters.Add("col1", "col1 value");
    parameters.Add("col2", 42);
    parameters.Add("col3", DateTime.Now);
    
    //build a command string and add parameter values to your SqlCommand
    StringBuilder builder = new StringBuilder("UPDATE sometable SET ");
    foreach(KeyValuePair<string, object> parameter in parameters) {
        builder.Append(parameter.Key).Append(" = @").Append(parameter.Key).Append(",");
        UpdateCmd.Parameters.AddWithValue("@" + parameter.Key, parameter.Value);
    }
    builder.Remove(builder.Length - 1,1);
    
    //set the command text and execute the command
    UpdateCmd.CommandText = builder.ToString();
    UpdateCmd.ExecuteNonQuery();
    
    0 讨论(0)
提交回复
热议问题