繁体   English   中英

C# 脚本 - SQL 查询最佳实践

[英]C# script - SQL query best practice

我有一个 Excel 文件,其中包含一长串用户名。 Col A 包含旧用户名 Col. B 具有新名称。 我想根据 excel 文件重命名 SQL 表中的用户。 我的问题如下:在我遍历 excel 的循环中多次调用 SQL 是否可以? 或者有没有更好的方法来打开单个连接并使用“一个”go 进行所有 SQL 更新查询?

您应该将 Excel 表加载到数据库中的一个表中,该表具有(至少)两列,称为old_usernamenew_username

然后您可以直接在数据库中运行update 您尚未指定数据库。 但由于 C# 标记,我将提供 SQL 服务器语法进行更新——此语法因数据库而异:

update u
    set username = nc.new_username
    from users u join -- the table you want to update
         name_changes nc
         on u.username = nc.old_username;

也就是说,通常最好将数据放入数据库并在那里完成所有工作。

这个问题的答案总是“取决于”“你能证明它是正确的”
除了对与错之外,您的业务案例可能包括的情况并非意味着多个连接是可接受的解决方案。

迭代数据列表时,虽然性能不是最好的,但执行只会影响数据库中单个记录的单个语句通常是可以接受的。

  • 您可能会这样做以捕获有关每一行的特定错误信息,并且在您的业务逻辑中,您将不会重新处理确实成功的行。
  • 如果您需要在一行失败时使整个批次失败,那么您需要确保使用事务 scope 以便您可以回滚整个集合。

但是,您通常不会创建多个连接。 一个标准的代码模式是在循环之外创建一个连接,并为每个事务重用相同的连接。

using (var conn =  new SqlConnection(connectionString))
{
    ...
    start a transaction
    ...
    try
    {
        foreach(var record in dataRecords)
        {
            try
            {
                ...
                Execute your transactions
                ...
            }
            catch(SqlException sx)
            {
                ...
                Process the exception, 
                record relevant information based on the input parameters for this record
                ...
                throw; // or throw a new exception with formatted info...  
            }
        }
    }
    catch(Exception ex)
    {
        ...
        rollback the transaction
        ...
    }
}

基于集合的方法通常可以提供更好的性能,但是从最佳实践的角度来看,这需要一些管道设置,Gordon Linoff 的这个建议也很有效。

多个事务或同一事务中的多个执行是可以接受的,但是应该避免多个连接

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM