Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#脚本-SQL查询最佳实践_C#_Sql - Fatal编程技术网

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

C#脚本-SQL查询最佳实践,c#,sql,C#,Sql,我有一个Excel文件,其中有一长串用户名。A列包含旧用户名,B列包含新用户名。我想根据excel文件重命名SQL表中的用户。我的问题如下: 在迭代excel的循环中多次使用using语句调用SQL可以吗?还是有更好的方法打开一个连接,用“一”进行所有SQL update查询?您应该将Excel表加载到数据库中的一个表中,该表至少有两列,分别为old\u username和new\u username 然后可以直接在数据库中运行更新。您尚未指定数据库。但由于C#标记的缘故,我将为更新提供SQL

我有一个Excel文件,其中有一长串用户名。A列包含旧用户名,B列包含新用户名。我想根据excel文件重命名SQL表中的用户。我的问题如下:
在迭代excel的循环中多次使用using语句调用SQL可以吗?还是有更好的方法打开一个连接,用“一”进行所有SQL update查询?

您应该将Excel表加载到数据库中的一个表中,该表至少有两列,分别为
old\u username
new\u username

然后可以直接在数据库中运行
更新。您尚未指定数据库。但由于C#标记的缘故,我将为更新提供SQL Server语法——这种语法因数据库而异:

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;

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

答案总是“视情况而定”和“你能证明它的合理性吗”。
不管是对是错,您的商业案例可能包含的情况并不意味着多个连接是一个可接受的解决方案

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

  • 您可以这样做来捕获关于每一行的特定错误信息,并且在您的业务逻辑中,您不会重新处理成功的行
  • 如果需要在一行失败时使整个批处理失败,则需要确保使用事务作用域,以便可以回滚整个集合
但是,通常不会创建多个连接。标准的代码模式是在循环之外创建一个连接,并为每个事务重新使用相同的连接

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
        ...
    }
}
基于集合的方法通常提供更高的性能,但从最佳实践的角度来看,这需要一点管道设置,也很有效

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


标记您正在使用的数据库。这实际上取决于文件的大小,如果它只是一小部分行,那么在这些行上循环并更新每一行并不是什么大问题,如果你说的是1000行,那么将用户列表传递给sql进程并在数据库中进行一次更新会更有意义。大量的数据库使用也是一个因素,最终可能会出现页锁或表锁,但这在很大程度上取决于特定场景。这太广泛了,您需要包含一个代码示例以获得更具体的响应,否则您会得到“这取决于”…谢谢您,Chris,@Gordon的帮助!:)很抱歉,缺少信息,我试图将其保持在最低限度(隐私政策)。最近才开始使用SQL,但我肯定走对了方向。在您的帮助下,我能够完成我的申请,即使是回滚也可以正常工作,因此再次感谢您抽出时间帮助我:)非常感谢。