我的C#代码中有2个表,dtProducts
从SQL Server表填充,dtProductdetails
从MS Access填充。
dtProduct
列code
和name
,dtProductdetails
列id
,code
,localname
,{{ 1}}。
我需要替换price
中的localname
,并使用dtProductdetails
替换name
代码在两个数据表中都具有唯一性。
然后将dtProducts
更新为SQL Server中的第三个表。
首先:我该怎么办?第二:我有超过100K的记录可供使用,任何人都可以建议在性能方面这样做的最佳方式。
答案 0 :(得分:1)
从以下查询开始,该查询应该执行您正在寻找的数据库端:
UPDATE dtProductdetails
SET PD.localname = P.name
FROM dtProductdetails PD
JOIN dtProducts P ON PD.code = P.code
您可以使用以下C#
代码执行更新:
dtProductdetails.Rows
.Cast<DataRow>()
.Join
(
dtProducts.Rows.Cast<DataRow>(),
r1 => new { p1 = r1["code"], p2 = r1["code"] },
r2 => new { p1 = r2["code"], p2 = r2["code"] },
(r1, r2) => new { r1, r2 }
)
.ToList()
.ForEach(o => o.r1.SetField("localname", o.r2["name"]));
可替换地:
var query = from r1 in dtProductdetails.AsEnumerable()
join r2 in dtProducts.AsEnumerable()
on r1.Field<Int32>("code") equals r2.Field<Int32>("code")
select new { r1, r2 };
foreach (var x in query)
x.r1.SetField("localname", x.r2.Field<String>("name"));
确保将两个表的code
字段设置为键索引。
答案 1 :(得分:0)
见How to create indexes on MSDN
您还可以使用UPDATE JOIN
普通SQL
来更新记录
UPDATE dtProductdetails
SET localname = name
FROM dtProductdetails
JOIN dtProducts
ON dtProductdetails.code = dtProducts.code
可以通过这种方式创建索引,这样可以提高join
的性能:
CREATE UNIQUE INDEX UI_dtProductdetails_Code
ON dtProductdetails (code);
CREATE UNIQUE INDEX UI_dtProducts_Code
ON dtProducts (code);