如果输入错误,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。
那应该可以解决您的问题。
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。 那应该可以解决您的问题。