正如哈比卜所说,你的数组太小了。考虑这个修改。而不是这个:
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);
}
}
}
...
}
}
}
修改后的代码有很多地方需要注意:
- 我正在利用
using
陈述。
- 我正在利用不同的
.ctor
of the SqlCommand
使其更加简洁。
- 我正在利用
FieldCount
来确定数组的大小。
- I'm 不共享连接实例。
- 这里可能有更好的数据结构可以使用。
- 您当前的代码流程想必建立连接和命令,即使它们不需要使用。
第一点非常重要。这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
陈述,但这只是我更喜欢当前逻辑流程的逻辑流程。