使用C#更新多个sql表中的相同列

时间:2010-08-27 14:20:04

标签: c# asp.net sql sql-update

情景:
我有一个手机比较asp.net网站,显示各种网络的交易。我们从网络收到的交易数据在excel表中。我们将excel表中的数据导入到数据库中每个网络的表中。现在,我们收到的数据对于每个网络都不一致,例如,网络可能将电话名称命名为“曲线8250”,另一个可能将其命名为“8250曲线”,另一个可能将其称为“8250曲线”。

现在,我们有另一个模块,允许用户查看所有网络上可用的特定手机的交易。为了使这个模块工作,我们需要做的是确保所有网络的电话名称一致 为此,我计划为webadmin创建一个模块,该模块显示所有网络表中的电话名称(可能在gridview中),网站管理员可以编辑电话名称以使其保持一致。从所有表中检索不同的列名很简单,就这样做了。

问题: 现在,真正的部分是我们如何编程模块,以便更新所有网络表中的特定列值。每个表的架构完全相同。

编辑:我总是忘记添加一些内容:@。我知道它可以通过艰难的方式完成,在代码背后,运行循环。但那里有没有更简单,更轻松的方式?比如一些在这种情况下会让生活更轻松的数据控制?

更新
我尝试使用后面的代码执行此操作。我制作了一个gridview并使用项目模板显示数据,并在第二个模板中提供了一个文本框。然后在按钮上单击,我正在运行此代码:

protected void Button1_Click(object sender, EventArgs e)
    {
        SqlConnection con = new SqlConnection(ConfigurationSettings.AppSettings[0].ToString());
        foreach(GridViewRow gvr in GridView1.Rows)
        {                
            TextBox tb = (TextBox)gvr.FindControl("New Value");
            Label lbl = (Label)gvr.FindControl("Old Value");
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = con;
            if (lbl.Text != tb.Text)
            {

                try   //updation if primary key constraint is not broken
                {
                    con.Open();
                    cmd.CommandText = myupdatecommand; /*this is not the actual command that I'm passing, the command I'm passing does contain the values lbl.Text & tb.Text. This is just to make it a better read.*/
                    cmd.ExecuteNonQuery();
                }
                catch (SqlException sqe)
                {
                    if (sqe.ErrorCode == -2146232060)//if primary key constraint is broken
                    {
                        try   
                        {
                            //delete the row from the table that contains only unique phone names
                            cmd.CommandText = deletecommand;
                            cmd.ExecuteNonQuery();
                        }
                        catch { }
                    }
                }
                finally
                {
                    con.Close();
                }


                //Update table2
                try          //only updation as here the phone name is not a primary key
                {
                    con.Open();
                    cmd.CommandText = updatetable2;
                    cmd.ExecuteNonQuery();
                }
                catch
                {

                }
                finally
                {
                    con.Close();
                }

                .
                .
                .
                //similarily update rest of the tables
                .
                .
                .
                Response.Redirect(Request.Url.ToString());
            }
       }

当我运行此代码时,一切都顺利进行,但是当我们一次更新网格中的多行时,更新仅发生在第一个编辑的行中,其他编辑的行保持不变。 /> 我知道这一定是我在这里错过的一件小事,但我无法继续下去:(

对此事的任何帮助都非常感谢。提前谢谢!

PS - 我正在使用ASP.Net 3.5,c#作为代码,而SQL Server 2005作为后端。

2 个答案:

答案 0 :(得分:0)

好的,我假设您正在使用LINQ-to-Sql,但从理论上讲,它并不重要,基本原理是一样的。

您将需要一个连接字符串集合,每个数据库对应一个字符串。大概你已经有了这个。

using (TransactionScope scope = new TransactionScope())
{
    foreach (var connStr in listOfConnStr)
    {
        using (var db = new MyDataContext(connStr);
        {
            // do update here.
        }
    }
}

这就是它。

您可以将“do update here”部分作为lambda函数传递。

答案 1 :(得分:0)

说实话,我现在很尴尬地回答我自己的问题。

问题在于我错误地放了Response.Redirect(Request.Url.ToString());

if循环内部,它本身位于foreach循环内。

我什么时候会停止做出愚蠢的错误:|