当前位置: 首页 > 面试题库 >

使用SqlDataReader作为资源的惯用法

宰父子安
2023-03-14
问题内容

问题继续,我发现自己一遍又一遍地编写以下代码:

SqlCommand command = new SqlCommand();
// Code to initialize command with what we want to do
using (SqlConnection connection = openConnection())
{
    command.Connection = connection;
    using (SqlDataReader dataReader = thisCommand.ExecuteReader())
    {
        while (dataReader.Read())
        {
            // Do stuff with results
        }
    }
}

必须嵌套两个using语句相当繁琐。有没有办法 告诉 SqlDataReader它拥有命令,并告诉命令它拥有连接?

如果有一种方法,那么我可以编写一个可以这样调用的辅助方法:

// buildAndExecuteCommand opens the connection, initializes the command
// with the connection and returns the SqlDataReader object. Dispose of the
// SqlDataReader to dispose of all resources that were acquired
using(SqlDataReader reader = buildAndExecuteCommand(...))
{
    // Do stuff with reader
}

还是我必须忍耐一下,并通过SqlDataReader编写自己的包装器?


问题答案:

一件事就是编写一个为您处理的方法,并用每个结果调用一个委托。例如:

using (SqlConnection connection = openConnection())
{
    command.Connection = connection;
    ExecuteReaderWithCommand(command, reader =>
    {
        // Do stuff with the result here.
    });
}

然后,ExecuteReaderWithCommand将类似于:

public static void ExecuteReaderWithCommand(SqlCommand command,
    Action<SqlDataReader> action)
{
    using (SqlDataReader dataReader = thisCommand.ExecuteReader())
    {
        while (reader.Read())
        {
            action(reader);
        }
    }
}

如果需要,可以将其作为扩展方法SqlCommand。哎呀,如果您愿意的话,您也可以去镇上并为您打开连接……您越能抽象化“打开/使用/关闭”的想法,那就越好。



 类似资料:
  • 22.7.3.一些 source set 的例子 加入含有类文件的 sorce set 的 JAR: 例22.8.为 source set 组装 JAR build.gradle task intTestJar(type: Jar) { from sourceSets.intTest.output } 为 source set 生成 javadoc: 例22.9.为 source set

  • 22.7.1.Source Set 属性 下表列出了 Source Set 的一些重要属性, 更多细节请查看 SourceSet 的 API 文档. 表22.9.java 插件- Source Set 属性 配置名称 类型 默认值 描述 name String (read-only) Not null 用来识别source set的名称 output SourceSetOutput(read-on

  • 22.7.2.定义一个新的 source set 要定义一个新的源组, sourceSets {} 块中引用它.下面是一个例子: 例22.5.定义一个新的 source set build.gradle sourceSets { intTest } 当你定义一个新的 source set, java 插件会为该 source set 添加一些如Table 22.6, “Java plugi

  • 问题内容: 我该如何更改: 得到 MAX(FormID) 吗? 我的自然趋势是在FormID周围抛出一个MAX,但是我遇到了IndexOutOfRange异常。 问题答案: 当您选择最大ID时,您不应使用-查询仅返回一项,默认情况下未命名,因此您的现有查询会中断,因为它希望得到一个名为“ FormID”的结果-尽管您可以通过以下方式“固定”查询使用。而是使用:

  • 【资源使用】页面主要展示项目运行过程中重点资源的使用情况,主要包括以下几个部分: 数据汇总 该项主要展示资源的具体使用情况,其展示数据根据资源种类的不同而不同,具体如下: 纹理 该项主要展示项目运行过程中纹理资源的 “内存峰值”、“大于1MB数量”、“RGBA32格式数量” 和 “RGB24格式数量”。其中,“内存峰值” 表示纹理资源在使用过程中的内存最大量;“大于1MB数量” 表示所检测到的纹理

  • Girl number twenty unable to define a horse!" said Mr. Gradgrind. — Charles Dickens. — Hard Times 除非你知道如何定义你想要什么,不然不会得到预期的结果。 在上一节的示例中,我们看到了如何将同类资源组合成数组从而减少冗余代码。 然而,这种技术有一个限制,那就是所有的资源必须使用相同的参数。 当你有一组资