我目前正在用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;
}
答案 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)也可能会有所帮助,因为这会使所有这些逻辑变得更加容易。
希望这会有所帮助。