情景:
我有一个手机比较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作为后端。
答案 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
循环内。
我什么时候会停止做出愚蠢的错误:|