如何在SQLite数据库中保存对象列表并读取以进行检索?

时间:2019-06-02 22:22:27

标签: c#

我目前正在用C#进行申请。我正在尝试将用户数据保存在SQLite数据库中。该用户具有名称,名字,用户名,密码,余额和程序列表。除了程序列表,我可以将所有内容保存在数据库中。这是我现在要记录所有这些的代码:

 SQLiteConnection sqliteCon = new SQLiteConnection(dbConnectionString);

                try
                {
                    sqliteCon.Open();
                    string Query = "Update tblUser Set Balance ='"+CurrentUser.Balance+"',ProgramList='"+CurrentUser.ProgramList+"' Where UserName='"+CurrentUser.UserName+"'";
                    SQLiteCommand createCommand = new SQLiteCommand(Query, sqliteCon);
                    createCommand.ExecuteNonQuery();
                    sqliteCon.Close();
                    this.Close();

                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }

问题是当我想恢复数据时,我收到一条错误消息:无法转换类型为“ System.String”的对象,类型为“ System.Collection.Generic.List [ClassLibrary1。Program]

这是我的表的结构:

CREATE TABLE "tblUser" (
    "ID"    INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
    "FirstName" TEXT NOT NULL,
    "LastName"  TEXT NOT NULL,
    "Username"  TEXT NOT NULL UNIQUE,
    "Password"  TEXT NOT NULL,
    "Balance"   INT NOT NULL,
    "ProgramList"   LIST
);

这是我尝试恢复数据时的代码:

  SQLiteConnection sqliteCon = new SQLiteConnection(dbConnectionstring);
            try
            {
                sqliteCon.Open();
                string Query = "select * from tblUser where UserName='" + this.txtUsername.Text + "' and PassWord='" + this.txtPassword.Password + "'";
                SQLiteCommand createCommand = new SQLiteCommand(Query, sqliteCon);

                createCommand.ExecuteNonQuery();
                SQLiteDataReader dr = createCommand.ExecuteReader();

                int count = 0;
                while (dr.Read())
                {
                    User user = new User();
                    User.Username = (string)dr[3];
                    User.FirstName = (string)dr[1];
                    User.LastName = (string)dr[2];
                    User.Balance = (int)dr[5];
                    User.ProgramList = (List<Programme>)dr[6] ;
                    CurrentUser = User;
                }
...

我可以恢复列表以外的所有内容... 我知道错误来自:User.ProgramList =(List)dr [6];并从“ ProgramList” LIST

要回答Ben:

public class User
    {

        public string UserName { get; set; }
        public string FirstName{ get; set; }
        public string LastName { get; set; }
        public int Balance { get; set; }
        public List<Program> ProgramList { get; set; }


        public User() { }
        public User(string username, string firstname, string lastname, int balance,List<Program> programlist)
        {
            this.UserName = username;
            this.FirstName = firstname;
            this.LastName = lastname;
            this.Balance = balance;
            this.ProgramList = programlist;
        }

1 个答案:

答案 0 :(得分:1)

这里有几件事。首先要注意,当您编写:

string Query = "Update tblUser Set Balance ='"+CurrentUser.Balance+"',ProgramList='"+CurrentUser.ProgramList+"' Where UserName='"+CurrentUser.UserName+"'";

您没有插入ProgramList,而是调用列表的ToString()方法将其连接到要创建的字符串的其余部分,结果类似{ {1}},因此您实际上是在该列中插入一个字符串。这就带来了另一个问题,您的表没有配置"System.Collection.Generic.List [ClassLibrary1. Program]",并且说它只是在试图帮助理解您的问题的人们感到困惑。我的猜测是它也是一个"ProgramList" LIST字段,但是包含实际定义而不是您认为的应该会更有用。

解决问题。您不能将LIST存储在数据库列中。这样想,每个字段(一行中的每一列)都是一条数据。您没有任何数据,只有数据集合。因此,您需要一个新表来存储该数据。有两种主要的处理方法。一种是记录用户拥有的每个程序的数据,例如:

TEXT

或者,如果您希望大量重复使用程序,请分别存储它们,然后加入它们:

CREATE TABLE "tblProgramsForUser" (
    "ID"    INTEGER NOT NULL,
    "UserID" INTEGER NOT NULL,
    "ProgramName" TEXT NOT NULL,
    "ProgramType"  TEXT NOT NULL,
    "OtherProgramField"  TEXT NOT NULL
);

所以现在您要在程序中执行的操作是更新用户特定的信息,然后为用户循环浏览程序列表,并将其插入新表中(或更新(如果适用))。

现在所有这些,您应该研究使用SQL参数:https://csharp-station.com/Tutorial/AdoDotNet/Lesson06,以使程序更安全。研究ORM(例如Entity Framework)也可能会有所帮助,因为这会使所有这些逻辑变得更加容易。

希望这会有所帮助。