2015-02-12 58 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) 

爲什麼說「no curr ent行「時有一個?

+0

什麼是'qry'的價值? – DavidG 2015-02-12 01:02:50

+0

它在文章的最開始給出。 – 2015-02-12 16:01:44

+0

如果你將它傳遞給你的函數,那麼設置參數有什麼意義? – DavidG 2015-02-12 16:06:22

回答

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()那裏。 – 2015-02-12 01:18:57

+0

謝謝@MihaiCaracostea我發佈了編輯。 – THBBFT 2015-02-12 01:20:39

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皺起眉頭)。 – 2015-02-12 16:09:35

+0

QRY是:SELECT line_id,說明,部門,upc_pack_size,pack_size,UNIT_COST,unit_list從庫存WHERE siteNum = [at符號] SiteNum和upc_code = [at符號] upcCode – 2015-02-12 16:11:53

+0

不過,據我所知,SQLiteParameter需要在 「@」這個名字也是。 – 2015-02-12 16:14:42

1

當您設置的參數,參數名稱需要@前綴工作。所以,你的代碼應該改爲閱讀:

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

而且(在其他的答案中指出),你還需要執行對讀者首先Read()

rdr.Read(); 
+0

真的嗎?我在這個項目的參數* *中沒有,並且所有內容(但是這個方法)都能正常工作。我認爲這一個,現在我已經添加了「rdr.Read()」 – 2015-02-12 16:40:18

+0

我看到這裏沒有使用@s:http://www.dotnetperls.com/sqlparameter – 2015-02-12 17:54:12

相關問題