使用 SqlDataReader 和字符串数组

2024-01-28

我想使用数据读取器读取记录并将结果发送到数组字符串。

我使用存储过程从 2 个表中选择数据。

string ReqID = "";
string ConnectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
SqlConnection sqlc;
string[] textbox;
string ReqType;

protected void Page_Load(object sender, EventArgs e)
{
    if (Request.QueryString["ReqID"] != null)
        ReqID = this.Request.QueryString["ReqID"];

    sqlc = new SqlConnection(ConnectionString);
    SqlCommand cmd = new SqlCommand();
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.CommandText = "LoadReq";

    string[] textbox = new string[4];
    if (!this.IsPostBack)
    {
        if (ReqID != "")
        {
            cmd.Parameters.Add("@ReqID", SqlDbType.NChar).Value = ReqID;
            cmd.Connection = sqlc;
            sqlc.Open();

            SqlDataReader reader = cmd.ExecuteReader();

            while (reader.Read())
            {
                textbox[2] = reader.GetString(reader.GetOrdinal("FReqID"));
                textbox[3] = reader.GetString(reader.GetOrdinal("OrderDate"));
                textbox[4] = reader.GetString(reader.GetOrdinal("OrderTime"));
                textbox[5] = reader.GetString(reader.GetOrdinal("ReqIP"));
                textbox[6] = reader.GetString(reader.GetOrdinal("Status"));
                textbox[7] = reader.GetString(reader.GetOrdinal("FileCode"));
                textbox[8] = reader.GetString(reader.GetOrdinal("Type"));
                textbox[9] = reader.GetString(reader.GetOrdinal("DOI"));
                textbox[10] = reader.GetString(reader.GetOrdinal("PubMedID"));
                textbox[11] = reader.GetString(reader.GetOrdinal("PaperCode"));


                LoadCorrectForm(textbox[8], textbox);
            }
        }

我的存储过程是:

CREATE PROCEDURE [dbo].LoadReq
@ReqID int = 0
AS
SELECT 
        Request.FReqID, Request.ReqIP, Request.OrderDate, Request.OrderTime,
        Request.[Status], Request.FileCode, Request.[Description],
        Details.[Type], Details.DOI, Details.PubMedID, Details.PaperCode, 
        Details.ISBN, Details.Title, Details.Journal, Details.BookTitle,
        Details.Conference, Details.[Year], Details.Publisher, Details.Edition, 
        Details.Vol, Details.Issue, Details.pp, Details.[Author(s)],
        Details.URL
     FROM 
        Request 
     INNER JOIN 
        Details ON Details.ID = Request.FreqID
     WHERE 
        (Request.ID = @ReqID)

但我收到错误。

我应该如何编辑我的代码来完成这项工作?


正如哈比卜所说,你的数组太小了。考虑这个修改。而不是这个:

string[] textbox = new string[4];

甚至这个:

string[] textbox = new string[11];

删除该行并执行以下操作:

SqlDataReader reader = cmd.ExecuteReader();
string[] textbox = new string[reader.FieldCount];

建议

除了修复之外,还有一些您应该考虑的建议。

if (Request.QueryString["ReqID"] != null)
    ReqID = this.Request.QueryString["ReqID"];

using (SqlConnection sqlc = new SqlConnection(ConnectionString))
{
    using (SqlCommand cmd = new SqlCommand("LoadReq", sqlc))
    {
        cmd.CommandType = CommandType.StoredProcedure;

        if (!this.IsPostBack)
        {
            if (ReqID != "")
            {
                cmd.Parameters.Add("@ReqID", SqlDbType.NChar).Value = ReqID;

                sqlc.Open();
                using (SqlDataReader reader = cmd.ExecuteReader())
                {
                    string[] textbox = new string[reader.FieldCount];

                    while (reader.Read())
                    {
                        textbox[2] = reader.GetString(reader.GetOrdinal("FReqID"));
                        textbox[3] = reader.GetString(reader.GetOrdinal("OrderDate"));
                        textbox[4] = reader.GetString(reader.GetOrdinal("OrderTime"));
                        textbox[5] = reader.GetString(reader.GetOrdinal("ReqIP"));
                        textbox[6] = reader.GetString(reader.GetOrdinal("Status"));
                        textbox[7] = reader.GetString(reader.GetOrdinal("FileCode"));
                        textbox[8] = reader.GetString(reader.GetOrdinal("Type"));
                        textbox[9] = reader.GetString(reader.GetOrdinal("DOI"));
                        textbox[10] = reader.GetString(reader.GetOrdinal("PubMedID"));
                        textbox[11] = reader.GetString(reader.GetOrdinal("PaperCode"));

                        LoadCorrectForm(textbox[8], textbox);
                    }
                }
            }

            ...
        }
    }
}

修改后的代码有很多地方需要注意:

  1. 我正在利用using陈述。
  2. 我正在利用不同的.ctor of the SqlCommand使其更加简洁。
  3. 我正在利用FieldCount来确定数组的大小。
  4. I'm 不共享连接实例。
  5. 这里可能有更好的数据结构可以使用。
  6. 您当前的代码流程想必建立连接和命令,即使它们不需要使用。

第一点非常重要。这using语句确保创建和使用的对象得到正确处理。每当你消费一些实现的东西时IDisposable,利用using陈述。

第 4 点几乎与第 1 点一样重要。不要共享连接实例。当您需要一个时,构建它、打开它、使用它并处理它。

让我在这里详细说明#5。而不是使用string[],怎么样List<string>. The List<string>是可变的(即它可以自动改变大小)。代码会更容易,因为你可以这样做:

textbox.Add(reader.GetString(reader.GetOrdinal("FReqID")));
textbox.Add(reader.GetString(reader.GetOrdinal("OrderDate")));
textbox.Add(reader.GetString(reader.GetOrdinal("OrderTime")));
textbox.Add(reader.GetString(reader.GetOrdinal("ReqIP")));
textbox.Add(reader.GetString(reader.GetOrdinal("Status")));
textbox.Add(reader.GetString(reader.GetOrdinal("FileCode")));
textbox.Add(reader.GetString(reader.GetOrdinal("Type")));
textbox.Add(reader.GetString(reader.GetOrdinal("DOI")));
textbox.Add(reader.GetString(reader.GetOrdinal("PubMedID")));
textbox.Add(reader.GetString(reader.GetOrdinal("PaperCode")));

然后,如果您需要将其发送给string[]你可以这样做:

textbox.ToArray();

但是,这可能不适合您,因为您有一个奇怪的偏移量。直到索引开始插入数组2。再说一次,我真的不能肯定地说有更好的数据结构。

第 6 点对我来说只是一个有趣的点。如果它是一个PostBack or the ReqID是一个空字符串,您实际上没有执行任何操作。这让我相信您实际上应该将连接和命令对象的创建移到这些对象中if陈述,但这只是我更喜欢当前逻辑流程的逻辑流程。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 SqlDataReader 和字符串数组 的相关文章

  • 为 Visual Studio 2013 编译 Tesseract

    我正在尝试使用tesseract在 Visual Studio 2013 中 我在链接器 gt 输入 不是 libtesseract302 static lib 中使用 libtesseract302 lib 一切都正常 并且已编译并运行
  • 向 Nhibernate 发出 SQL 查询

    如何将此 SQL 查询发送给 Nhibernate SELECT Customer name FROM Company INNER JOIN Customer ON Company CompanyId Customer CompanyId
  • 启动时出现 OData v4 错误:找不到段“Whatever”的资源

    我正在构建新的 v4 服务 一切进展顺利 直到我为新模型 实体添加了新控制器 并在启动站点进行测试运行时收到此错误 控制器似乎编码正确 就像其他控制器一样 控制器 CustomersOData 中的操作 GetFeed 上的路径模板 Cus
  • 如何修复此错误“GDI+ 中发生一般错误”?

    从默认名称打开图像并以默认名称保存 覆盖它 我需要从 Image Default jpg 制作图形 将其放在 picturebox1 image 上并在 picurebox1 上绘制一些图形 它有效 这不是我的问题 但我无法保存 pictu
  • 将内置类型转换为向量

    我的 TcpClient 类接受vector
  • 在 Unity 进程和另一个 C# 进程之间进行本地 IPC 的最快方法 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我希望每秒大约 30 次从 C 应用程序向我的 Unity 应用程序传送大量数据 由于 Unity 不支持映射内存和管道 我考虑了 t
  • 如何访问另一个窗体上的ListView控件

    当单击与 ListView 所在表单不同的表单中的按钮时 我试图填充 ListView 我在 Form1 中创建了一个方法以在 Form2 中使用 并将参数传递给 Form1 中的方法 然后填充 ListView 当我调试时 我得到了传递的
  • 生成(非常)大的非重复整数序列而不进行预洗牌

    背景 我编写了一个简单的媒体客户端 服务器 我想生成一个不明显的时间值 随从客户端到服务器的每个命令一起发送 时间戳中将包含相当多的数据 纳秒分辨率 即使它不是真正准确 因为现代操作系统中计时器采样的限制 等 我想做的 在 Linux 上
  • 单击 form2 上的按钮触发 form 1 中的方法

    我对 Windows 窗体很陌生 我想知道是否可以通过单击表单 2 中的按钮来触发表单 1 中的方法 我的表格 1 有一个组合框 我的 Form 2 有一个 保存 按钮 我想要实现的是 当用户单击表单 2 中的 保存 时 我需要检查表单 1
  • 使用 JNI 从 Java 代码中检索 String 值的内存泄漏

    我使用 GetStringUTFChars 从使用 JNI 的 java 代码中检索字符串的值 并使用 ReleaseStringUTFChars 释放该字符串 当代码在 JRE 1 4 上运行时 不会出现内存泄漏 但如果相同的代码在 JR
  • 在一个字节中存储 4 个不同的值

    我有一个任务要做 但我不知道从哪里开始 我不期待也绝对不想要代码中的答案 我想要一些关于该怎么做的指导 因为我感到有点失落 将变量打包和解包到一个字节中 您需要在一个字节中存储 4 个不同的值 这些值为 NAME RANGE BITS en
  • 上下文敏感与歧义

    我对上下文敏感性和歧义如何相互影响感到困惑 我认为正确的是 歧义 歧义语法会导致使用左推导或右推导构建多个解析树 所有可能的语法都是二义性的语言是二义性语言 例如 C 是一种不明确的语言 因为 x y 总是可以表示两个不同的事物 如下所述
  • 如何将自定义 JSON 文件添加到 IConfiguration 中?

    我正在使用 asp net Autofac 我正在尝试加载自定义 JSON 配置文件 并基于该文件创建 实例化 IConfiguration 实例 或者至少将我的文件包含到默认情况下构建的 IConfiguration asp net 中
  • HttpWebRequest 在第二次调用时超时

    为什么以下代码在第二次 及后续 运行时超时 代码挂在 using Stream objStream request GetResponse GetResponseStream 然后引发 WebException 表示请求已超时 我已经尝试过
  • 如何从main方法调用业务对象类?

    我已将代码分为业务对象 访问层 如下所示 void Main Business object public class ExpenseBO public void MakeExpense ExpensePayload payload var
  • 如何对 Web Api 操作进行后调用?

    我创建了一个 Web API 操作 如下所示 HttpPost public void Load string siteName string providerName UserDetails userDetails implementat
  • .NET中的LinkedList是循环链表吗?

    我需要一个循环链表 所以我想知道是否LinkedList是循环链表吗 每当您想要移动列表中的 下一个 块时 以循环方式使用它的快速解决方案 current current Next current List First 电流在哪里Linke
  • 如何在按钮单击时模拟按键 - Unity

    我对 Unity 中的脚本编写非常陌生 我正在尝试创建一个按钮 一旦单击它就需要模拟按下 F 键 要拾取一个项目 这是我当前的代码 在编写此代码之前我浏览了所有统一论坛 但找不到任何有效的东西 Code using System Colle
  • 有没有办法强制显示工具提示?

    我有一个验证字段的方法 如果无法验证 该字段将被清除并标记为红色 我还希望在框上方弹出一个工具提示 并向用户显示该值无效的消息 有没有办法做到这一点 并且可以控制工具提示显示的时间 我怎样才能让它自己弹出而不是鼠标悬停时弹出 If the
  • Linq-to-entities,在一个查询中获取结果+行数

    我已经看到了有关此事的多个问题 但它们已经有 2 年 或更长 的历史了 所以我想知道这方面是否有任何变化 基本思想是填充网格视图并创建自定义分页 所以 我还需要结果和行数 在 SQL 中 这将类似于 SELECT COUNT id Id N

随机推荐

  • 如何比较两个git分支并通过提交消息过滤差异?

    我有一个名为的发布分支release X X X X其中包含我想要部署到生产的所有功能分支 发布分支是在master这是当前的生产状态 在每个发布日 我都会确保我们的发布分支仅包含计划用于发布的更改 我使用此命令来比较发布分支和主分支 gi
  • requireJs 订单插件:它可以存在于与 require.js 基本路径不同的路径中吗?

    使用订单插件时 require js 在给定的 basePath order js 中查找它 example require baseUrl public js require order http cdnjs cloudflare com
  • 如何将移动构造函数与二维数组 (**) 一起使用?

    可能是我错误地编码了我的类 但是当我使用移动构造函数而不是复制 cotr 作为重载之一 而不是准确地说 时 我的程序崩溃了 例如 class Sample int a int b constructor declarations 在 cpp
  • python 按键简单游戏

    我想在屏幕上看到一个符号 例如可能是 散列 符号会有一些起始位置 比如说 0 0 如果我按向右箭头 我希望看到标志向右移动 如果按向左箭头 我希望看到标志向左移动 等等 到目前为止 我的代码看起来像这样 它适用于读取 pos 但我想添加某种
  • Delphi 如何获取控件上的光标位置?

    我想知道 TCustomControl 上光标的位置 如何找到坐标 获取光标位置 http msdn microsoft com en us library ms648390 28v vs 85 29 aspx如果您无法处理鼠标事件 这会很
  • 动画 UIButton 的标题更改

    在这里我找到了如何制作动画UIButton的标题更改使用现已弃用beginAnimations context method iPhone 的 UIBUtton 标题动画 https stackoverflow com questions
  • 在 ASP.NET WebApi 2 中实现移动应用程序的外部身份验证

    我正在尝试构建一个 API 使用 ASP NET WebApi 该 API 将由学校项目的本机移动应用程序使用 我不关心 开发移动应用程序 这个责任由不同的成员承担 我现在需要实现基于令牌的 Facebook 登录 有很多教程可用于介绍如何
  • 如何以编程方式获取 Admob 的设备 ID?

    我有多个设备 而且可能还会有更多 并且不想一一添加 有人知道 Admob 使用什么 ID 吗 String aid Settings Secure getString getContext getContentResolver androi
  • Gem 安装错误可写和 PATH

    这是我遇到的两个错误 我使用的是 OS X 老实说 不知道我是否通过 gem 安装 如果这很重要的话 WARNING Installing to gem since Library Ruby Gems 1 8 and usr bin are
  • 将列表拆分为单独但重叠的块

    假设我有一个清单A A 1 2 3 4 5 6 7 8 9 10 我想创建一个新列表 比如说B 按以下顺序使用上面的列表 B 1 2 3 3 4 5 5 6 7 7 8 9 9 10 即前 3 个数字为A 0 1 2 后 3 个数字为A 2
  • GAE 云数据存储:获取最常编写的模型

    我正在尝试按最常编写的模型的降序排列模型列表 这是我到目前为止所尝试过的 client查询集提供模型及其属性 属性的详细信息 以及这些模型相关的详细信息 实体计数 内置索引计数 内置索引大小 数据大小 复合索引大小 复合索引计数 总大小 但
  • 为什么结构体的 sizeof 不安全

    The MSDN http msdn microsoft com en us library eahchzkf 28v vs 80 29 aspx明确指出 对于所有其他类型 包括结构体 sizeof 运算符只能 在不安全的代码块中使用 Th
  • 在 URLSearchParams 中使用 json 对象

    是否可以以某种方式将 json 对象附加到 URLSearchParams 对象上 所以而不是 urlSearchParams append search person it s urlSearchParams append search
  • 没有为 MySQLi 准备好的语句中的参数提供数据

    我一直在重新设计我的网站 从不受保护的 MySQL 查询到 mysqli 准备好的语句 一切都很顺利 直到我得到这个 没有为准备好的语句中的参数提供数据 if empty err pSETQuery NULL if empty POST p
  • 命名空间中的枚举

    做这样的事情有没有意义 namespace status enum status ok error 并像这样使用它status ok 或者我应该这样做 enum status status ok status error 并像这样使用它st
  • 添加到 ArrayList Java

    我是java初学者 需要一些帮助 我正在尝试将抽象数据类型 Foo 它是一个关联列表 转换为字符串 B 的 Arraylist 如何循环遍历该列表并将每个字符串添加到数组中 我可能想多了 但我现在迷失了 我在这里先向您的帮助表示感谢 实例化
  • deepcopy() 非常慢

    我在 Python 中有一个包含大约 1000 个对象 行星系统 恒星 行星 的游戏状态 我需要复制它并在需要时对其应用一堆转换 然而 在大约 1 个请求 秒的情况下 这是占用了我24 63 的运行时间 https i stack imgu
  • 如何列出属于某个VPC的所有资源?

    在我的 AWS 账户中 我的 VPC 很少 我正在尝试找到一种方法来列出位于某个 VPC 下的所有资源 谢谢 您可以通过三种方式完成此操作 AWS CLI AWS 控制台或代码 AWS CLI 您可以使用 AWS CLI 列出与 VPC 关
  • Slim 基本身份验证

    今天是个好日子 我这里有一个有效的精简代码slim basic auth https packagist org packages tuupola slim basic auth当我进入受限目录时 会显示以下内容 一切正常 但我想做的是将其
  • 使用 SqlDataReader 和字符串数组

    我想使用数据读取器读取记录并将结果发送到数组字符串 我使用存储过程从 2 个表中选择数据 string ReqID string ConnectionString ConfigurationManager ConnectionStrings