【问题标题】:Use SqlDataReader and string array使用 SqlDataReader 和字符串数组
【发布时间】:2013-12-13 16:16:30
【问题描述】:

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

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

但我得到一个错误。

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

【问题讨论】:

标签: c# .net sql-server ado.net


【解决方案1】:

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

第 1 点非常重要。 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 语句中移动连接和命令对象的创建,但这只是我更喜欢当前的逻辑流程。

【讨论】:

  • 无法将“System.Int32”类型的对象转换为“System.String”类型。
  • @user3051479,嗯,我很确定告诉我,哪条线路对我能够为您提供帮助非常重要。
  • 第 42 行:文本框[2] = reader.GetString(reader.GetOrdinal("FReqID"));
  • @user3051479,该字段的值是 null 在该行上吗?
猜你喜欢
  • 2013-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多