c# - 为什么 SQLite 告诉我 "No current row"?

标签 c# sqlite

正在发送的查询是好的;运行它:

SELECT line_id, description, department, upc_pack_size, pack_size, unit_cost, unit_list FROM Inventory WHERE siteNum = "03" AND upc_code = "76145513"

...在 LINQPad 中返回具有这些值的记录:

line_id = 0
description = [empty string]
department = 2.99
upc_pack_size = 333
pack_size = 333
unit_cost = 50.01
unit_list = 50.99

但是代码:

public List<String> GetDynamicINVValsForUPCCode(String qry, String siteNum, String upcCode)
{
    ExceptionLoggingService.Instance.WriteLog(String.Format("Reached TestHHSDBUtils.GetDynamicINVValsForUPCCode(); siteNum is {0}; upcCode is {1}; qry is {2}", siteNum, upcCode, qry));
    List<String> dsdValsForUPCCode = new List<string>(); 
    try
    {
        using (SQLiteConnection conn = new SQLiteConnection(HHSUtils.GetDBConnection()))
        {
            conn.Open();
            using (SQLiteCommand cmd = new SQLiteCommand(qry, conn))
            {
                cmd.Parameters.Add(new SQLiteParameter("upcCode", upcCode));
                cmd.Parameters.Add(new SQLiteParameter("SiteNum", siteNum));
                using (SQLiteDataReader rdr = cmd.ExecuteReader())
                {
                    dsdValsForUPCCode.Add(Convert.ToString(rdr["Line_id"]));       // Line_id, int32
                    dsdValsForUPCCode.Add(Convert.ToString(rdr["Description"]));   // Description
                    dsdValsForUPCCode.Add(Convert.ToString(rdr["Department"]));    // Department
                    dsdValsForUPCCode.Add(Convert.ToString(rdr["Upc_pack_size"])); // Upc_pack_size (int32)
                    dsdValsForUPCCode.Add(Convert.ToString(rdr["Pack_size"]));     // Pack_size (int32)
                    dsdValsForUPCCode.Add(Convert.ToString(rdr["Unit_qty"]));      // Unit_qty (single)
                }
            }
            return dsdValsForUPCCode;
        }
    }
    catch (Exception ex)
    {
        String msgInnerExAndStackTrace = String.Format("{0}; Inner Ex: {1}; Stack Trace: {2}", ex.Message, ex.InnerException, ex.StackTrace);
        ExceptionLoggingService.Instance.WriteLog(String.Format("From TestHHSDBUtils.GetDynamicINVValsForUPCCode: {0}", msgInnerExAndStackTrace));
        return null;
    }
}

...失败,错误记录为:

Message: From TestHHSDBUtils.GetDynamicINVValsForUPCCode: No current row; Inner Ex: ; Stack Trace:    at System.Data.SQLite.SQLiteDataReader.CheckValidRow()
   at System.Data.SQLite.SQLiteDataReader.GetValue(Int32 i)
   at System.Data.SQLite.SQLiteDataReader.get_Item(String name)
   at HHS.TestHHSDBUtils.GetDynamicINVValsForUPCCode(String qry, String siteNum, String upcCode)

为什么有一个却说“没有当前行”?

最佳答案

虽然我并不明确熟悉 SqlLiteReader,但其他读者需要您阅读第一行。我使用的是 if 语句,但如果您希望有大量行,则可以使用 while。 DataReader.Read() 返回一个 bool 值以指示是否已读取记录。 https://msdn.microsoft.com/en-us/library/haa3afyz%28v=vs.110%29.aspx

using (SQLiteDataReader rdr = cmd.ExecuteReader())
{
  if (rdr.Read()){
    dsdValsForUPCCode.Add(Convert.ToString(rdr["Line_id"]));       // Line_id, int32
    dsdValsForUPCCode.Add(Convert.ToString(rdr["Description"]));   // Description
    dsdValsForUPCCode.Add(Convert.ToString(rdr["Department"]));    // Department
    dsdValsForUPCCode.Add(Convert.ToString(rdr["Upc_pack_size"])); // Upc_pack_size (int32)
    dsdValsForUPCCode.Add(Convert.ToString(rdr["Pack_size"]));     // Pack_size (int32)
    dsdValsForUPCCode.Add(Convert.ToString(rdr["Unit_qty"]));      // Unit_qty (single)
  }
}

关于c# - 为什么 SQLite 告诉我 "No current row"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28467484/

相关文章:

ruby-on-rails - SQLite3安装问题

java - 将 SQLite 数据库导出到 Android 中的 XML 文件

sqlite - 导出不带 col.names 的 CSV

sqlite - 在 qt 中使用 sqlite 数据库

c# - 在 UserManager 上等待导致错误在上一个操作完成之前在此上下文上启动了第二个操作

c# - 字符串比较 - strA.ToLower()==strB.ToLower() 或 strA.Equals(strB,StringComparisonType)?

c# - 在没有查询字符串的情况下将变量从 View 传递到 Controller

c# - 更改 C# 字典中项目的基数

c# - InternalsVisibleTo - 如何防止某人创建具有相同名称的程序集并访问内部类或方法?

c# - 如何使用 EFC 和 SQLite 避免使用 AUTOINCRMENT 关键字?