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

C# 如何在SQLite数据库中保存对象列表并读取以检索它?,c#,C#,我目前正在申请C语言。我试图将用户的数据保存在SQLite数据库中。该用户有姓名、名字、用户名、密码、余额和程序列表。除了程序列表,我可以保存数据库中的所有内容。下面是我现在要记录所有这些的代码: SQLiteConnection sqliteCon=新的SQLiteConnectiondbConnectionString; 尝试 { sqliteCon.Open; string Query=Update tblUser Set Balance='+CurrentUser.Balance+',P

我目前正在申请C语言。我试图将用户的数据保存在SQLite数据库中。该用户有姓名、名字、用户名、密码、余额和程序列表。除了程序列表,我可以保存数据库中的所有内容。下面是我现在要记录所有这些的代码:

SQLiteConnection sqliteCon=新的SQLiteConnectiondbConnectionString; 尝试 { sqliteCon.Open; string Query=Update tblUser Set Balance='+CurrentUser.Balance+',ProgramList='+CurrentUser.ProgramList+',其中UserName='+CurrentUser.UserName+'; SQLiteCommand createCommand=newsqlitecommandquery,sqliteCon; createCommand.ExecuteOnQuery; sqliteCon.Close; 这个.关闭,; } 捕获异常 { MessageBox.Showex.Message; } 问题是,当我想要恢复数据时,我收到一条错误消息,上面说:无法强制转换System.String类型System.Collection.Generic.List[ClassLibrary1.Program]的对象

以下是我的表格的结构:

创建表tblUser ID整数非空主键自动递增唯一, 名字文本不为空, LastName文本不为空, 用户名文本不为空且唯一, 密码文本不为空, Balance INT不为空, 节目表 ; 以下是我尝试恢复数据时的代码:

  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=Listdr[6];和从程序列表中

回答本:

公共类用户 { 公共字符串用户名{get;set;} 公共字符串名{get;set;} 公共字符串LastName{get;set;} 公共整数平衡{get;set;} 公共列表程序列表{get;set;} 公共用户{} public Userstring username、string firstname、string lastname、int balance、List programlist { this.UserName=用户名; this.FirstName=FirstName; this.LastName=LastName; 平衡=平衡; this.ProgramList=程序列表; }
这里有几件事。首先要注意,当你写作时:

string Query = "Update tblUser Set Balance ='"+CurrentUser.Balance+"',ProgramList='"+CurrentUser.ProgramList+"' Where UserName='"+CurrentUser.UserName+"'";
您没有插入ProgramList,而是调用列表的ToString方法将其连接到正在创建的字符串的其余部分,该字符串的结果类似于System.Collection.Generic.list[ClassLibrary1.Program],所以您实际上是在该列中插入了一个字符串。这带来了另一个问题,您的表没有配置ProgramList,并且说它只是混淆了试图帮助理解您的问题的人。我猜它也是一个文本字段,但如果包含实际定义,而不是您认为的定义,会更有帮助应该是

解决这个问题。你不能在数据库列中存储列表。这样想,行中的每个字段和每列都是一段数据。你没有一段数据,你有一个数据集合。因此,你需要一个新表来存储数据。有两种主要方法来处理这个问题。一种是记录每个程序的数据ser有,类似于:

CREATE TABLE "tblProgramsForUser" (
    "ID"    INTEGER NOT NULL,
    "UserID" INTEGER NOT NULL,
    "ProgramName" TEXT NOT NULL,
    "ProgramType"  TEXT NOT NULL,
    "OtherProgramField"  TEXT NOT NULL
);
或者,如果您希望大量重用程序,请单独存储它们,然后加入它们:

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

CREATE TABLE "tblUserPrograms" (
    "UserID"    INTEGER NOT NULL,
    "ProgramID" INTEGER NOT NULL
);
因此,现在您在程序中要做的是更新特定于用户的信息,然后循环浏览用户的程序列表,并将它们插入新表或更新(如果适用)

话虽如此,您应该研究使用SQL参数:使您的程序更安全。研究类似ORM的实体框架也可能会使所有这些逻辑变得更简单


希望这有帮助。

如果你将User.ProgramList改为string而不是list,结果是什么?我会得到一个字符串。这不是我想要的,我想要一个程序列表…插入…不应该工作。你的用户类的定义是什么?特别是User.ProgramList。C类,而不是SQL表定义。我编辑了我的博文什么数据库品牌?好的,我更好地理解我的错误。因此,不可能直接将列表放在表的列中。第一个解决方案似乎是可利用的。我将尝试,感谢您给予的时间!