如何从Sqlite请求获取一个字段值?
我使用这个函数进行查询:
public SQLiteDataReader returnDataReader(string txtQuery)
{
SQLiteCommand cmd = new SQLiteCommand();
try
{
cmd.Connection = Openconn();
cmd.CommandText = txtQuery;
SQLiteDataReader rd;
rd = cmd.ExecuteReader();
return rd;
}
catch (Exception Ex)
{
throw Ex;
}
finally
{
cmd = null;
}
}
这是我的问题:
SQLiteDataReader data = db.returnDataReader("SELECT created_at FROM Transactions ORDER BY created_at DESC LIMIT 1");
我尝试从查询中获取created_at
字段的值,如下所示:
string res = data["created_at"].ToString();
它返回我的错误。 我也直接在Sqlite管理器中检查了这个查询。 它工作并返回一行。
错误是:
System.InvalidOperationException发生HResult = 0x80131509
消息=没有当前行Source = System.Data.SQLite StackTrace:位于System.Data.SQLite.SQLiteDataReader.Check_ValidRow()位于System.Data.SQLite.SQLiteDataReader.GetValue(Int32 i)位于System.Data.SQLite.SQLiteDataReader.get_Item (String name)在D: Projects c-tests-ukraine Ukraine Library StatisticService.cs中的Ukraine.StatisticService.lastsync():第25行在Ukraine.Main.Form1_Load(Object sender,EventArgs e)in D: Projects c-tests-ukraine Ukraine Main.cs:System.Windows.Forms.Form.OnLoad(EventArgs e)在System.Windows.Forms.Form.OnCreateControl()在System.Windows.Forms的第81行。 Control.CreateControl(Boolean fIgnoreVisible)
System.Windows.Forms.Control.CreateControl()System.Windows.Forms.Control.WmShowWindow(Message&m)at System.Windows.Forms.Control.WndProc(Message&m)at System.Windows.Forms.ScrollableControl.WndProc (Message&m)at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message&m)at System.Windows.Forms.Form.WndProc(Message&m)at System.Windows.Forms.Form.WmShowWindow(Message&m)at System.Windows.Forms.Form.WndProc .Windows.Forms.Control.ControlNativeWindow.WndProc(Message&m)at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd,Int32 msg,IntPtr wparam,IntPtr lparam)
只调用ExecuteReader是不够的。 最初,任何类型的DataReader都位于任何检索行之前。 您需要在阅读器上调用Read以将其放在返回的第一行上
SQLiteDataReader data = db.returnDataReader(.....);
if(data.Read())
{
string res = data["created_at"].ToString();
....
}
或添加一个循环
SQLiteDataReader data = db.returnDataReader(.....);
while(data.Read())
{
..get data from your rows here
}
不过,我不认为你的方法返回一个SqlLiteDataReader是一个好习惯。 读者取决于连接是否打开,连接是否应该尽快关闭以避免危险的资源泄漏。
我建议使用另一种方法来读取您的数据
public void ReadData(string txtQuery, Action<SQLiteDataReader> loader)
{
using(SQLiteConnection con = Openconn())
using(SQLiteCommand cmd = new SQLiteCommand(txtQuery, con))
using(SQLiteDataReader rd = cmd.ExecuteReader())
{
while(rd.Read())
loader(rd);
}
}
然后调用此方法将委托传递给读取数据的方法
ReadData(...querytext..., readCreatedData);
然后编写readCreatedData方法,该方法将由打开连接的代码和其他一次性对象调用。
void readCreatedData(SQLiteDataReader data)
{
string res = data["created_at"].ToString();
.....
}
最后,Rufo在其评论中指出,你实际上只是从单个列中读取单个值,而使用简单的ExecuteScalar
public string ReadString(string txtQuery)
{
using(SQLiteConnection con = Openconn())
using(SQLiteCommand cmd = new SQLiteCommand(txtQuery, con))
{
object result = cmd.ExecuteScalar();
return (result == null ? "" : result.ToString());
}
}
链接地址: http://www.djcxy.com/p/93513.html
上一篇: How to get one field value from Sqlite request?
下一篇: C# Exception has been thrown by the target of an invocation