如何使用 SQLiteDataAdapter 插入包含 header 列的记录
How to use SQLiteDataAdapter to insert records with header columns
我是 C# 的新手所以请多多包涵我和我糟糕的代码...
我正在使用 SQLite 开发 VS2013 Forms 应用程序。
在我的表单中,我有几个 "header" 字段,在它下面有一个 DataGridView 绑定到一个数据集,使用下面的 code.The header 字段确定要加载的数据集下面的 SQL select 语句。
private void Grid_Init()
{
Open_VCS_Connection();
string sql_query_main = "SELECT * FROM VCS_DATA WHERE OPERATOR ='" + operator_comboBox.Text.ToString() + "' AND ROTATION = '" + rotation_comboBox.Text.ToString() + "' AND ENTRY_DATE = '" + entry_dateTimePicker.Value.ToShortDateString() + "'";
main_ds = new DataSet();
main_da = new SQLiteDataAdapter(sql_query_main, dbConnection);
sqlcmdBuilder = new SQLiteCommandBuilder(main_da);
main_ds.Reset();
main_da.Fill(main_ds);
main_dataGridView.DataSource = main_ds.Tables[0].DefaultView;
main_dataGridView.Columns[0].Visible = false; //record_id
main_dataGridView.Columns[1].Visible = false; //operator
main_dataGridView.Columns[2].Visible = false; //rotation
main_dataGridView.Columns[3].Visible = false; //entry_date
main_dataGridView.Columns[4].Visible = false; //created_date
main_dataGridView.Columns[5].Visible = false; //updated_date
Close_VCS_Connection();
}
这很好地填充了我的数据网格视图,并允许我使用 main_da.Update(main_ds) 方法为我附加到 "Save Button" 的数据集插入记录。但是问题是它不会填充隐藏列。当我也尝试删除时它也会抛出错误,但这是另一个问题。
我看过许多关于 SQLiteDataAdapter、DataGridView、Dataset 的教程,但我无法完全理解如何让它执行插入操作,用我的文本中的文本填充隐藏列作为我的数据网格的 header 信息的框。
而且我还没有找到任何真正好的代码示例来做这样的事情,除了制作一个专门用于数据输入的表单。我希望用户能够直接在 DGV 中工作。
好的,我回答了我自己的问题,现在看起来很简单....
Open_VCS_Connection();
string sql_query_main = "SELECT * FROM VCS_DATA WHERE OPERATOR ='" + operator_comboBox.Text.ToString() + "' AND ROTATION = '" + rotation_comboBox.Text.ToString() + "' AND ENTRY_DATE = '" + entry_dateTimePicker.Value.ToShortDateString() + "'";
main_ds = new DataSet();
main_da = new SQLiteDataAdapter(sql_query_main, dbConnection);
sqlcmdBuilder = new SQLiteCommandBuilder(main_da);
SQLiteCommand sqlcmdInsert = new SQLiteCommand("INSERT INTO VCS_DATA"
+" (operator, rotation, entry_date, created_date, callsign, veh_type, ntc_number, bumper_number, line_number, dci_orig, dci_repl, pid_orig, pid_repl, pl_status, sawe_kill, sawe_res, cntlr_kill, cntlr_res, weapon, comments)"
+" VALUES"
+" (@operator, @rotation, @entry_date, @created_date, @callsign, @veh_type, @ntc_number, @bumper_number, @line_number, @dci_orig, @dci_repl, @pid_orig, @pid_repl, @pl_status, @sawe_kill, @sawe_res, @cntlr_kill, @cntlr_res, @weapon, @comments)");
sqlcmdInsert.Parameters.Add(new SQLiteParameter("@operator", DbType.String) { Value = operator_comboBox.Text.ToString() });
sqlcmdInsert.Parameters.Add(new SQLiteParameter("@rotation", DbType.String) { Value = rotation_comboBox.Text.ToString() });
sqlcmdInsert.Parameters.Add(new SQLiteParameter("@entry_date", DbType.String) { Value = entry_dateTimePicker.Value.ToShortDateString() });
sqlcmdInsert.Parameters.Add(new SQLiteParameter("@created_date", DbType.DateTime) { Value = DateTime.Now.ToLocalTime() });
sqlcmdInsert.Parameters.Add(new SQLiteParameter("@callsign", DbType.String, "callsign"));
sqlcmdInsert.Parameters.Add(new SQLiteParameter("@veh_type", DbType.String, "veh_type"));
sqlcmdInsert.Parameters.Add(new SQLiteParameter("@ntc_number", DbType.String, "ntc_number"));
sqlcmdInsert.Parameters.Add(new SQLiteParameter("@bumper_number", DbType.String, "bumper_number"));
sqlcmdInsert.Parameters.Add(new SQLiteParameter("@line_number", DbType.String, "line_number"));
sqlcmdInsert.Parameters.Add(new SQLiteParameter("@dci_orig", DbType.Byte, "dci_orig"));
sqlcmdInsert.Parameters.Add(new SQLiteParameter("@dci_repl", DbType.Byte, "dci_repl"));
sqlcmdInsert.Parameters.Add(new SQLiteParameter("@pid_orig", DbType.Byte, "pid_orig"));
sqlcmdInsert.Parameters.Add(new SQLiteParameter("@pid_repl", DbType.Byte, "pid_repl"));
sqlcmdInsert.Parameters.Add(new SQLiteParameter("@pl_status", DbType.Byte, "pl_status"));
sqlcmdInsert.Parameters.Add(new SQLiteParameter("@sawe_kill", DbType.Byte, "sawe_kill"));
sqlcmdInsert.Parameters.Add(new SQLiteParameter("@sawe_res", DbType.Byte, "sawe_res"));
sqlcmdInsert.Parameters.Add(new SQLiteParameter("@cntlr_kill", DbType.Byte, "cntlr_kill"));
sqlcmdInsert.Parameters.Add(new SQLiteParameter("@cntlr_res", DbType.Byte, "cntlr_res"));
sqlcmdInsert.Parameters.Add(new SQLiteParameter("@weapon", DbType.Byte, "weapon"));
sqlcmdInsert.Parameters.Add(new SQLiteParameter("@comments", DbType.String, "comments"));
main_da.InsertCommand = sqlcmdInsert;
main_da.Fill(main_ds);
main_dataGridView.DataSource = main_ds.Tables[0].DefaultView;
所以在我看到的示例中,他们指出我可以使用参数为命令生成器编写我自己的自定义 InsertCommand。通常来自表单中的其他一些字段。我没有看到的示例是将参数采购回数据集还是来自插入语句?!?地狱,如果我知道,但它通过简单地引用列名和表单中的参数来工作。所以我们开始吧,这是我的例子!
为 SQLCommandBuilder 点赞。
我是 C# 的新手所以请多多包涵我和我糟糕的代码...
我正在使用 SQLite 开发 VS2013 Forms 应用程序。
在我的表单中,我有几个 "header" 字段,在它下面有一个 DataGridView 绑定到一个数据集,使用下面的 code.The header 字段确定要加载的数据集下面的 SQL select 语句。
private void Grid_Init()
{
Open_VCS_Connection();
string sql_query_main = "SELECT * FROM VCS_DATA WHERE OPERATOR ='" + operator_comboBox.Text.ToString() + "' AND ROTATION = '" + rotation_comboBox.Text.ToString() + "' AND ENTRY_DATE = '" + entry_dateTimePicker.Value.ToShortDateString() + "'";
main_ds = new DataSet();
main_da = new SQLiteDataAdapter(sql_query_main, dbConnection);
sqlcmdBuilder = new SQLiteCommandBuilder(main_da);
main_ds.Reset();
main_da.Fill(main_ds);
main_dataGridView.DataSource = main_ds.Tables[0].DefaultView;
main_dataGridView.Columns[0].Visible = false; //record_id
main_dataGridView.Columns[1].Visible = false; //operator
main_dataGridView.Columns[2].Visible = false; //rotation
main_dataGridView.Columns[3].Visible = false; //entry_date
main_dataGridView.Columns[4].Visible = false; //created_date
main_dataGridView.Columns[5].Visible = false; //updated_date
Close_VCS_Connection();
}
这很好地填充了我的数据网格视图,并允许我使用 main_da.Update(main_ds) 方法为我附加到 "Save Button" 的数据集插入记录。但是问题是它不会填充隐藏列。当我也尝试删除时它也会抛出错误,但这是另一个问题。
我看过许多关于 SQLiteDataAdapter、DataGridView、Dataset 的教程,但我无法完全理解如何让它执行插入操作,用我的文本中的文本填充隐藏列作为我的数据网格的 header 信息的框。
而且我还没有找到任何真正好的代码示例来做这样的事情,除了制作一个专门用于数据输入的表单。我希望用户能够直接在 DGV 中工作。
好的,我回答了我自己的问题,现在看起来很简单....
Open_VCS_Connection();
string sql_query_main = "SELECT * FROM VCS_DATA WHERE OPERATOR ='" + operator_comboBox.Text.ToString() + "' AND ROTATION = '" + rotation_comboBox.Text.ToString() + "' AND ENTRY_DATE = '" + entry_dateTimePicker.Value.ToShortDateString() + "'";
main_ds = new DataSet();
main_da = new SQLiteDataAdapter(sql_query_main, dbConnection);
sqlcmdBuilder = new SQLiteCommandBuilder(main_da);
SQLiteCommand sqlcmdInsert = new SQLiteCommand("INSERT INTO VCS_DATA"
+" (operator, rotation, entry_date, created_date, callsign, veh_type, ntc_number, bumper_number, line_number, dci_orig, dci_repl, pid_orig, pid_repl, pl_status, sawe_kill, sawe_res, cntlr_kill, cntlr_res, weapon, comments)"
+" VALUES"
+" (@operator, @rotation, @entry_date, @created_date, @callsign, @veh_type, @ntc_number, @bumper_number, @line_number, @dci_orig, @dci_repl, @pid_orig, @pid_repl, @pl_status, @sawe_kill, @sawe_res, @cntlr_kill, @cntlr_res, @weapon, @comments)");
sqlcmdInsert.Parameters.Add(new SQLiteParameter("@operator", DbType.String) { Value = operator_comboBox.Text.ToString() });
sqlcmdInsert.Parameters.Add(new SQLiteParameter("@rotation", DbType.String) { Value = rotation_comboBox.Text.ToString() });
sqlcmdInsert.Parameters.Add(new SQLiteParameter("@entry_date", DbType.String) { Value = entry_dateTimePicker.Value.ToShortDateString() });
sqlcmdInsert.Parameters.Add(new SQLiteParameter("@created_date", DbType.DateTime) { Value = DateTime.Now.ToLocalTime() });
sqlcmdInsert.Parameters.Add(new SQLiteParameter("@callsign", DbType.String, "callsign"));
sqlcmdInsert.Parameters.Add(new SQLiteParameter("@veh_type", DbType.String, "veh_type"));
sqlcmdInsert.Parameters.Add(new SQLiteParameter("@ntc_number", DbType.String, "ntc_number"));
sqlcmdInsert.Parameters.Add(new SQLiteParameter("@bumper_number", DbType.String, "bumper_number"));
sqlcmdInsert.Parameters.Add(new SQLiteParameter("@line_number", DbType.String, "line_number"));
sqlcmdInsert.Parameters.Add(new SQLiteParameter("@dci_orig", DbType.Byte, "dci_orig"));
sqlcmdInsert.Parameters.Add(new SQLiteParameter("@dci_repl", DbType.Byte, "dci_repl"));
sqlcmdInsert.Parameters.Add(new SQLiteParameter("@pid_orig", DbType.Byte, "pid_orig"));
sqlcmdInsert.Parameters.Add(new SQLiteParameter("@pid_repl", DbType.Byte, "pid_repl"));
sqlcmdInsert.Parameters.Add(new SQLiteParameter("@pl_status", DbType.Byte, "pl_status"));
sqlcmdInsert.Parameters.Add(new SQLiteParameter("@sawe_kill", DbType.Byte, "sawe_kill"));
sqlcmdInsert.Parameters.Add(new SQLiteParameter("@sawe_res", DbType.Byte, "sawe_res"));
sqlcmdInsert.Parameters.Add(new SQLiteParameter("@cntlr_kill", DbType.Byte, "cntlr_kill"));
sqlcmdInsert.Parameters.Add(new SQLiteParameter("@cntlr_res", DbType.Byte, "cntlr_res"));
sqlcmdInsert.Parameters.Add(new SQLiteParameter("@weapon", DbType.Byte, "weapon"));
sqlcmdInsert.Parameters.Add(new SQLiteParameter("@comments", DbType.String, "comments"));
main_da.InsertCommand = sqlcmdInsert;
main_da.Fill(main_ds);
main_dataGridView.DataSource = main_ds.Tables[0].DefaultView;
所以在我看到的示例中,他们指出我可以使用参数为命令生成器编写我自己的自定义 InsertCommand。通常来自表单中的其他一些字段。我没有看到的示例是将参数采购回数据集还是来自插入语句?!?地狱,如果我知道,但它通过简单地引用列名和表单中的参数来工作。所以我们开始吧,这是我的例子!
为 SQLCommandBuilder 点赞。