gpt4 book ai didi

c# - 使用 SqlDataReader 和字符串数组

转载 作者:太空宇宙 更新时间:2023-11-03 13:30:58 25 4
gpt4 key购买 nike

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

我使用存储过程从 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)

但是我得到一个错误。

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

最佳答案

正如 Habib 所述,您的阵列太小。考虑这种修改。而不是这个:

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. 我正在利用不同的 .ctorSqlCommand使其更简洁。
  3. 我正在利用 FieldCount确定数组的大小。
  4. 不共享连接实例。
  5. 这里可能有更好的数据结构可以使用。
  6. 您当前的代码流大概会构建连接和命令,即使它们不需要使用也是如此。

第一点非常重要。 using语句确保创建和使用的对象得到正确处理。每当您使用实现 IDisposable 的东西时, 利用 using声明。

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

让我在这里详细说明#5。而不是使用 string[] ,一个List<string>怎么样? . 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 ReqID是一个空字符串,你实际上什么都不做。这使我相信您实际上应该在那些 if 中移动连接和命令对象的创建。语句,但这只是我更喜欢当前流程的逻辑流程。

关于c# - 使用 SqlDataReader 和字符串数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20571047/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com