我有一个通用方法,用于查看给定表中给定列中是否存在至少一个具有给定值的记录。但是,当我这样称呼它时:
return ColumnInTableContainsStrValue("Inventory", "siteNum", NRBQConsts.currentSiteNum);
...它返回false,即使该表确实包含“siteNum”列为“03”的记录。这是有问题的方法:
public bool ColumnInTableContainsStrValue(String tableName, String
columnName, String valToFind)
{
ExceptionLoggingService.Instance.WriteLog("Reached
TestHHSDBUtils.ColumnInTableContainsStrValue");
int count;
string qry = String.Format("SELECT COUNT(*) FROM {0} WHERE {1} =
@soughtValue", tableName, columnName)
// TODO: temp - remove
MessageBox.Show(String.Format("In ColumnInTableContainsStrValue; qry
== {0}; valToFind == {1}", qry, valToFind));
try
{
using (SQLiteConnection con = new
SQLiteConnection(HHSUtils.GetDBConnection()))
{
con.Open();
SQLiteCommand cmd = new SQLiteCommand(qry, con);
cmd.Parameters.Add(new SQLiteParameter("soughtValue",
valToFind));
count = (int)cmd.ExecuteScalar();
}
}
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.ColumnInTableContainsStrValue: {0}",
msgInnerExAndStackTrace));
return false;
}
return count > 0;
}
我在上面的方法中的临时MessageBox.Show()调用显示:
因此,一旦查询arg从@soughtValue转换为valToFind(“03”),查询应为:
SELECT COUNT(*) FROM Inventory WHERE siteNum = "03"
上面的查询在LINQPad中按预期工作:
那为什么它在“现实生活”中失败了?
注意: ColumnInTableContainsStrValue()中的catch块没有捕获任何内容 - 日志文件diebzg中没有任何内容。
在更改catch块以捕获SQLiteException(代替通用Exception)之后,我得到了这个:
日期:2009年4月8日10:01:28 PM 消息:来自frmMain.ProcessNewDelivery:InvalidCastException;内部Ex :;堆栈跟踪:在HHS.TestHHSDBUtils.ColumnInTableContainsStrValue(String tableName,String columnName,String valToFind) 在HHS.frmMain.SiteInventoryHasBeenFetched() 在HHS.frmMain.ProcessNewDelivery() 在HHS.frmMain.menuItemFILE_NewDelivery_Click(对象发件人,EventArgs e) 在System.Windows.Forms.MenuItem.OnClick(EventArgs e) 在System.Windows.Forms.Menu.ProcessMnuProc(Control ctlThis,WM wm,Int32 wParam,Int32 lParam) 在System.Windows.Forms.Form.WnProc(WM wm,Int32 wParam,Int32 lParam) 在System.Windows.Forms.Control._InternalWnProc(WM wm,Int32 wParam,Int32 lParam) 在Microsoft.AGL.Forms.EVL.EnterMainLoop(IntPtr hwnMain) 在System.Windows.Forms.Application.Run(Form fm) 在HHS.Program.Main()
也许我必须用引号括住arg?
答案 0 :(得分:2)
在SQLite中,ExecuteScalar
的结果是Int64
所以从技术上讲,你的查询应该失败Invalid Cast Exception
(在'现实生活中'和在LinqPad中)
您可以验证是否将您的通话更改为ExecuteScalar
至
object result = cmd.ExecuteScalar();
result.GetType().Dump();
因此,您只需将count
的数据类型更改为long并将ExecuteScalar的返回值转换为long。
你在日志文件中没有看到任何内容的原因仍然是一种迷惑。