如果输入错误,C# SQLite 会崩溃

C# SQLite crashing if input is wrong

Windows 表单程序出现问题:用户应该能够选择他们想要查看的table(年份)。

这是我的解决方案:

SQLiteConnection con = new SQLiteConnection(@"Data Source=C:\App\DRSTZMSTR\Datenbank\Database.db");
con.Open();
string query = "SELECT* from '"+yeartxtbox.Text+"' ";
SQLiteCommand cmd = new SQLiteCommand(query, con);
DataTable dt = new DataTable();
SQLiteDataAdapter adapter = new SQLiteDataAdapter(cmd);
adapter.Fill(dt);

dataGridView1.DataSource = dt;
con.Close();

我正在使用文本框“yeartxtbox”来接收想要的 table。 基本上它的工作,但每次用户输入 table 不存在程序崩溃。

任何ide我该如何解决这个问题?

我的想法:

我可以使用组合框来显示现有的 table,而不是使用文本框,但我不知道 ide 如何实现这一点。我在网上找不到任何东西。

尝试/捕捉

try {
   SQLiteConnection con = new SQLiteConnection(@"Data Source=C:\App\DRSTZMSTR\Datenbank\Database.db");
   con.Open();
   string query = "SELECT* from '"+yeartxtbox.Text+"' ";
   SQLiteCommand cmd = new SQLiteCommand(query, con);
   DataTable dt = new DataTable();
   SQLiteDataAdapter adapter = new SQLiteDataAdapter(cmd);
   adapter.Fill(dt);

   dataGridView1.DataSource = dt;
   con.Close();
}
catch (Exception e){
   // do whatever you want to tell the user they made a mistake - eg
   MessageBox.Show(e.ToString());
}

请注意,这种 SQL 字符串组合非常糟糕。我可以输入“table1;从 table1 中删除 *”作为 table 名称。它被称为“SQL 注入”

如果您想查询数据库以获得 table 的列表,您可以这样做

SELECT name, sql FROM sqlite_master
WHERE type='table'
ORDER BY name;

SQLite Schema Information Metadata

您的方法是错误的,因为它允许用户在文本框中键入内容,这就是用户可以键入不存在的 table 名称的原因。使用组合框代替文本框,该组合框只能从数据库中存在的项目列表中 selected。

为了填充组合框,将您的查询更改为:- string query = "Select [ID],[Name] from sysobjects where xtype = 'U'";

将结果放入您的数据table并将您的组合框绑定到该数据table,然后用户只能看到现有 table 和 [=21] 的列表=]任何人。

注意:- sysobjects 是每个 SQL 服务器数据库中的一个 table,它包含所有对象。 xType 列 = 'U' 表示您只查看 table。 那应该可以解决您的问题。