如何将行插入 SQL 数据库的 table?
How to insert the row into the table of SQL database?
我的问题看似微不足道,但不幸的是我不知道如何解决这个问题。
一个数据库中有一个table。我必须通过单击按钮向 table 添加数据。当用户单击按钮时,他将进入某种形式,he/she 可以在其中输入数据。第一次能输入:id,服务种类,价格就好了。我决定创建一个新的 class,我将在其中包含包括这三个变量在内的所有变量。这些变量是 public.
我还决定从文本框中读取文本并将此信息写入 class 的变量。在第二种形式中有 2 个按钮。 “确定”和“取消”。我决定使用 ShowDialog。
我能够将 table 从数据库输出到 DataGridView,但我不太清楚如何将数据添加到我的 table 并在 datagridview 中成功展示插入后
我的class:
public class AllDataDB
{
public int id_serv;
public double price;
public string name;
}
第二种形式:
public partial class TypeService : Form
{
public AllDataDB Class;
public TypeService(AllDataDB t)
{
Class = t;
InitializeComponent();
}
private void button2_Click(object sender, EventArgs e)
{
this.Close();
}
private void button1_Click(object sender, EventArgs e)
{
AllDataDB Class = new AllDataDB();
Class.id_serv = Convert.ToInt32(textBox3.Text);
Class.name = NameService.Text;
Class.price = Convert.ToDouble(PriceService.Text);
this.DialogResult = DialogResult.OK;
this.Close();
}
}
按钮调用表单和查询的工作:
private void NewServe_Click(object sender, EventArgs e)
{
AllDataDB Class = new AllDataDB();
TypeService form = new TypeService(Class);
if (form.ShowDialog() == DialogResult.OK)
{ // відповідно до класу створюється новий запис. INSERT.
SqlConnection Con = new SqlConnection(connectionString);
Con.Open();
string Que = "INSERT INTO type_service " +
"VALUES(" + Class.id_serv + " ,'" + Class.name +
"' ," + Class.price + " );" +
"SELECT * FROM type_service";
SqlCommand cmd = new SqlCommand(Que, Con);
cmd.ExecuteNonQuery();
Con.Close();
SqlDataAdapter sqlDa = new SqlDataAdapter("SELECT * FROM type_service", Con);
DataTable d = new DataTable();
sqlDa.Fill(d);
dataGridView3.AutoGenerateColumns = false;
dataGridView3.DataSource = d;
}
}
显示的代码中存在很多问题。最重要的是您读取值的方式以及您如何尝试插入数据。在表单 TypeService 中,您创建了一个 AllDataDB class 的新实例,您将在其中存储结果。该实例不再是您输入的实例,因此您需要从 TypeService 表单创建的实例中读取值(存储在全局字段 Class 中)。第二个问题是您的值的字符串连接。这是导致解析问题和 sql 注入的众所周知的问题。它由参数化查询修复,如下所示
private void NewServe_Click(object sender, EventArgs e)
{
// Do no pass an instance of Class here, just pass null
// or remove it at all if you don't plan to reuse the form for updating
TypeService form = new TypeService(null);
if (form.ShowDialog() == DialogResult.OK)
{
// Add the using statement to ensure a proper release of resources.
using SqlConnection Con = new SqlConnection(connectionString);
Con.Open();
// Parameterized query
string Que = "INSERT INTO type_service VALUES(@id,@name,@price);";
SqlCommand cmd = new SqlCommand(Que, Con);
cmd.Parameters.Add("@id", SqlDbType.Int).Value = form.Class.id_serv;
cmd.Parameters.Add("@name", SqlDbType.NVarChar).Value = form.Class.name;
cmd.Parameters.Add("@price", SqlDbType.Decimal).Value = form.Class.price;
cmd.ExecuteNonQuery();
SqlDataAdapter sqlDa = new SqlDataAdapter("SELECT * FROM type_service", Con);
DataTable d = new DataTable();
sqlDa.Fill(d);
dataGridView3.AutoGenerateColumns = false;
dataGridView3.DataSource = d;
}
}
还有其他小问题。在 TypeService 表单和 class AllDataDB 中,您使用了全局字段而不是更灵活的属性使用方式。
public class AllDataDB
{
public int id_serv {get;set;}
public double price {get;set;}
public string name {get;set;}
}
还有
public AllDataDB Class {get;set;}
此外,鉴于传递给 TypeService 表单的构造函数的空值,您现在需要确保在不检查其空值的情况下不使用该 Class 属性
嗯,这个辅助很有用。谢谢。但是我已经通过在 class TypeService 中创建一个新的 3 个变量解决了这个问题。这些变量也是 public。它看起来像这样:
在 class 类型服务中:
public int i;
public string n;
public double p;
在 class MainCore 中:
cmd.Parameters.Add("@id", SqlDbType.Int).Value = form.i;// form.Class.id_serv;
cmd.Parameters.Add("@name", SqlDbType.NVarChar).Value = form.n;//form.Class.name;
cmd.Parameters.Add("@price", SqlDbType.Decimal).Value = form.p; //form.Class.price;
所以它有效。我可以删除 class AllDataDB,因为它现在不重要也没有用。
感谢您的帮助。
我的问题看似微不足道,但不幸的是我不知道如何解决这个问题。
一个数据库中有一个table。我必须通过单击按钮向 table 添加数据。当用户单击按钮时,他将进入某种形式,he/she 可以在其中输入数据。第一次能输入:id,服务种类,价格就好了。我决定创建一个新的 class,我将在其中包含包括这三个变量在内的所有变量。这些变量是 public.
我还决定从文本框中读取文本并将此信息写入 class 的变量。在第二种形式中有 2 个按钮。 “确定”和“取消”。我决定使用 ShowDialog。
我能够将 table 从数据库输出到 DataGridView,但我不太清楚如何将数据添加到我的 table 并在 datagridview 中成功展示插入后
我的class:
public class AllDataDB
{
public int id_serv;
public double price;
public string name;
}
第二种形式:
public partial class TypeService : Form
{
public AllDataDB Class;
public TypeService(AllDataDB t)
{
Class = t;
InitializeComponent();
}
private void button2_Click(object sender, EventArgs e)
{
this.Close();
}
private void button1_Click(object sender, EventArgs e)
{
AllDataDB Class = new AllDataDB();
Class.id_serv = Convert.ToInt32(textBox3.Text);
Class.name = NameService.Text;
Class.price = Convert.ToDouble(PriceService.Text);
this.DialogResult = DialogResult.OK;
this.Close();
}
}
按钮调用表单和查询的工作:
private void NewServe_Click(object sender, EventArgs e)
{
AllDataDB Class = new AllDataDB();
TypeService form = new TypeService(Class);
if (form.ShowDialog() == DialogResult.OK)
{ // відповідно до класу створюється новий запис. INSERT.
SqlConnection Con = new SqlConnection(connectionString);
Con.Open();
string Que = "INSERT INTO type_service " +
"VALUES(" + Class.id_serv + " ,'" + Class.name +
"' ," + Class.price + " );" +
"SELECT * FROM type_service";
SqlCommand cmd = new SqlCommand(Que, Con);
cmd.ExecuteNonQuery();
Con.Close();
SqlDataAdapter sqlDa = new SqlDataAdapter("SELECT * FROM type_service", Con);
DataTable d = new DataTable();
sqlDa.Fill(d);
dataGridView3.AutoGenerateColumns = false;
dataGridView3.DataSource = d;
}
}
显示的代码中存在很多问题。最重要的是您读取值的方式以及您如何尝试插入数据。在表单 TypeService 中,您创建了一个 AllDataDB class 的新实例,您将在其中存储结果。该实例不再是您输入的实例,因此您需要从 TypeService 表单创建的实例中读取值(存储在全局字段 Class 中)。第二个问题是您的值的字符串连接。这是导致解析问题和 sql 注入的众所周知的问题。它由参数化查询修复,如下所示
private void NewServe_Click(object sender, EventArgs e)
{
// Do no pass an instance of Class here, just pass null
// or remove it at all if you don't plan to reuse the form for updating
TypeService form = new TypeService(null);
if (form.ShowDialog() == DialogResult.OK)
{
// Add the using statement to ensure a proper release of resources.
using SqlConnection Con = new SqlConnection(connectionString);
Con.Open();
// Parameterized query
string Que = "INSERT INTO type_service VALUES(@id,@name,@price);";
SqlCommand cmd = new SqlCommand(Que, Con);
cmd.Parameters.Add("@id", SqlDbType.Int).Value = form.Class.id_serv;
cmd.Parameters.Add("@name", SqlDbType.NVarChar).Value = form.Class.name;
cmd.Parameters.Add("@price", SqlDbType.Decimal).Value = form.Class.price;
cmd.ExecuteNonQuery();
SqlDataAdapter sqlDa = new SqlDataAdapter("SELECT * FROM type_service", Con);
DataTable d = new DataTable();
sqlDa.Fill(d);
dataGridView3.AutoGenerateColumns = false;
dataGridView3.DataSource = d;
}
}
还有其他小问题。在 TypeService 表单和 class AllDataDB 中,您使用了全局字段而不是更灵活的属性使用方式。
public class AllDataDB
{
public int id_serv {get;set;}
public double price {get;set;}
public string name {get;set;}
}
还有
public AllDataDB Class {get;set;}
此外,鉴于传递给 TypeService 表单的构造函数的空值,您现在需要确保在不检查其空值的情况下不使用该 Class 属性
嗯,这个辅助很有用。谢谢。但是我已经通过在 class TypeService 中创建一个新的 3 个变量解决了这个问题。这些变量也是 public。它看起来像这样:
在 class 类型服务中:
public int i;
public string n;
public double p;
在 class MainCore 中:
cmd.Parameters.Add("@id", SqlDbType.Int).Value = form.i;// form.Class.id_serv;
cmd.Parameters.Add("@name", SqlDbType.NVarChar).Value = form.n;//form.Class.name;
cmd.Parameters.Add("@price", SqlDbType.Decimal).Value = form.p; //form.Class.price;
所以它有效。我可以删除 class AllDataDB,因为它现在不重要也没有用。 感谢您的帮助。