2015-02-12 2 views
1

Отправляемый запрос хорош; запустить его:Почему 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) 

Почему это говорит «нет никакой ent row ", когда есть один?

+0

Что такое значение 'qry'? – DavidG

+0

Это дается в самом начале сообщения. –

+0

Если вы передаете это в свою функцию, то в чем смысл настройки параметров? – DavidG

ответ

6

Хотя я явно не знаком с SqlLiteReader, но остальные читатели требуют для чтения первой строки. Я использую оператор if, но там, где вы ожидаете числовые строки, вы должны использовать while. DataReader.Read() возвращает логическое значение, чтобы указать, была ли прочитана запись. 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) 
        } 
     } 
+0

Хорошая точка! Кроме того, он должен быть rdr.Read(). –

+0

спасибо @MihaiCaracostea Я опубликовал редактирование. – THBBFT

1

Я верю, что SQLite требует, чтобы параметры имели префиксные имена «@», «:» или «$». Source.

Таким образом, ваш запрос должен быть как:

SELECT line_id, description, department, upc_pack_size, pack_size, unit_cost, unit_list FROM Inventory WHERE siteNum = @siteNum AND upc_code = @upcCode 

и ваш PARAMATERS, как это:

cmd.Parameters.Add(new SQLiteParameter("@siteNum", siteNum)); 
cmd.Parameters.Add(new SQLiteParameter("@upcCode", upcCode)); 
+0

Я использую «@», вы просто не видите их выше; запрос, который я показываю, - это то, к чему он решает. Я показываю точно, что я дал LINQPad (который нахмурился бы @s). –

+0

qry is: SELECT line_id, описание, department, upc_pack_size, pack_size, unit_cost, unit_list FROM Inventory WHERE siteNum = [при знаке] SiteNum AND upc_code = [at sign] upcCode –

+0

Тем не менее, насколько мне известно, SQLiteParameter нуждается в "@" в имя, также. –

1

При настройке параметров, имя параметра нужен @ префикс для работы. Так что ваш код должен вместо следующего содержания:

cmd.Parameters.Add(new SQLiteParameter("@upcCode", upcCode)); 
cmd.Parameters.Add(new SQLiteParameter("@SiteNum", siteNum)); 

Кроме того (как указано в других ответах) также необходимо выполнить Read() на читателя первый:

rdr.Read(); 
+0

Действительно? У меня это в * none * параметров в этом проекте, и все (но этот метод) отлично работает. И я думаю, что это будет, теперь, когда я добавил «rdr.Read()» –

+0

Я не вижу здесь @ @: http://www.dotnetperls.com/sqlparameter –

Смежные вопросы