如何从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