- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想使用数据读取器读取记录并将结果发送到数组字符串。
我使用存储过程从 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);
}
}
}
...
}
}
}
修改后的代码有几点需要注意:
using
声明。.ctor
的 SqlCommand
使其更简洁。FieldCount
确定数组的大小。第一点非常重要。 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/
如何在另一个 SqlDataReader 中实现一个 SqlDataReader? 我的问题是我有一个 SqlDataReader。我正在发出 while (reader.read()) 并且在 wh
作为 C# 新手,我在不同线程之间传递 SqlDataReader 时遇到了这个“难题”。无需过多讨论,其想法是让主线程从数据库(大型记录集)中获取数据,然后让辅助任务逐条记录地运行该记录,并根据其内
在命名空间System.Data.SqlClient下,我们都有 SqlDataReader.GetSqlBinary 和 SqlDataReader.GetSqlBytes . 两者似乎都提供了“原
更新:事实证明反射也不一定很慢。使用 Fasterflect (http://www.codeproject.com/Articles/38840/Fasterflect-a-fast-and-sim
一个被认为是更好的标准?一个比另一个快吗?或者,主要是偏好? GetOrdinal 很好,因为您可以自己调用列名,而不必担心在 SQL 中计算字段的索引,但我想知道使用其中一个是否比另一个有好处。 按
这两种方法的主要区别是什么?在 msdn 网站上,它的解释如下,但我不明白。 Read 将 SqlDataReader 前进到下一条记录。 (覆盖DbDataReader.Read().) NextR
我想从数据库中检索十进制值,我想知道检查空值的推荐方法是什么。 我在 MSDN - DBNull.Value Field 上看到过很少使用此检查。 因此,reader.IsDBNull 是检查空值的最
我正在为我的数据访问层编写单元测试。为此,我为 SqlCommand (ISqlCommand) 创建了一个包装器,以便我可以模拟其功能。 ISqlCommand command = _connect
我有一个存储过程,其中包含用于返回记录的 ORDER BY 子句。当我在 SQL 中执行时,我看到适当的顺序。 但是,当我从客户端执行并加载到 SqlDataReader 时,顺序发生了变化。这不是预
从值为 null 的读取器转换日期时间时出现问题。 form._date101 = reader[52] == DBNull.Value ? DBNull.Value : (DateTime?)rea
有谁知道 DbDataReaders 是如何工作的。我们可以以SqlDataReader为例。 当您执行以下操作时 cmd.CommandText = "SELECT * FROM Customers
使用以下语法从SqlDataReader读取值之间有什么区别: Dim reader As SqlClient.SqlDataReader reader("value").ToString() 要么
我在 MSSMS 中执行了约 2 秒的查询(返回 25K 行) .NET (sqlReader) 中使用的相同查询执行几分钟! 我也尝试过只执行阅读器 (注释了 while 循环中的所有代码,只留下
我有一个问题,我列出了 100 多个学生,但读取器只检索到表中的最后一个学生。 string selectQuery = "SELECT * FROM Students WHERE firstName
我的项目是一个 Windows 服务,我在从我的数据库返回值时遇到了问题,所以我将这段代码分离到一个控制台应用程序中以便于调试,但在我的服务中不起作用的代码在控制台应用程序。 所以在我的服务中我有这个
我在数据库记录 1 和记录 2 中有两条记录。datareader 将返回记录 1 的 guid 值,代码工作正常。但在记录 2 上,数据读取器将返回“”。我的问题是如何无一异常(exception)
我有一个使用 SQLLite 的数据库,我正在使用 C#。我进行了查询并且它有效,但是当查询有 ( ) 时它失败并给出了关于 SQL 语法的异常。 我创建了一个函数来帮助我使用 SQLiteDataR
我想用对象填充列表。这些对象包含以下格式的信息: class record { //klassen variable private string voornaam; priv
能否将 SqlDataReader 传递给 session 或发送给客户端? 例如,如果我从数据库中检索了一些行,并想将这些数据发送到另一台客户端机器。我可以通过在服务器上使用 json 序列化它然后
我正在尝试通过引用传递给读者或让读者返回。我在返回时遇到了问题。 public static SqlDataReader GetSql(string businessUnit, string task
我是一名优秀的程序员,十分优秀!