发送的查询是好的;运行它:
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)
为什么有“没有当前行”?
答案 0 :(得分:7)
虽然我没有明确熟悉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)
}
}
答案 1 :(得分:1)
设置参数时,参数名称需要@
前缀才能生效。所以你的代码应该改为:
cmd.Parameters.Add(new SQLiteParameter("@upcCode", upcCode));
cmd.Parameters.Add(new SQLiteParameter("@SiteNum", siteNum));
此外(正如其他答案中所指出的)你还需要先在读者身上执行Read()
:
rdr.Read();
答案 2 :(得分:0)
我相信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
您的参数如下:
cmd.Parameters.Add(new SQLiteParameter("@siteNum", siteNum));
cmd.Parameters.Add(new SQLiteParameter("@upcCode", upcCode));