进入数据库

时间:2015-09-03 16:04:30

标签: c# mysql sql-server

我在基于服务的数据库中创建了一个表来存储销售信息。该表包括列日期,时间,名称,购买,数量,成本(以此特定方式)。插入表格的代码是

SqlConnection conn = new SqlConnection(@"Data Source=(LocalDB)\v11.0;AttachDbFilename=C:\Users\rnawa_000\Documents\Visual Studio 2013\Projects\Random\Random\sales.mdf;Integrated Security=True");
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
conn.Open();
cmd.CommandText = "insert into salesTB (Date,Time,Name,Quantity,Cost) values ('"+date.Text+"','"+time.Text+"','"+txtName.Text+"','"+listBox1.Items.Count+"','"+ txtCost.Text+")";

foreach (string item in listBox1.Items)
{
    cmd.CommandText = "insert into salesTB (Purchase) values ('" +item.Substring(0,10)  + "')";
}
cmd.ExecuteNonQuery();
cmd.Clone();
conn.Close();

date.texttime.text标签分别显示日期和时间。在表单加载事件中为它们分配了值。 txtName.texttxtCost.text标签使用构造函数

从上一个表单中获取其值
public Form2(ListBox.ObjectCollection objectCollection, string name,string total)
{
    InitializeComponent();
    this.listBox1.Items.AddRange(objectCollection);
    txtName.Text = name;
    txtCost.Text = total;   
}

当我执行此操作时,它会给我一个错误说"无法将值NULL插入列' Cost'"。如果我在数据库的成本列中设置allow nulls,那么它会在异常错误中显示任何其他列名。

2 个答案:

答案 0 :(得分:0)

您需要使用参数化查询来避免错误,因为您要重新连接显式字符串值。您的逻辑也是错误的,这样做会导致非规范化数据,这对任何数据库管理员来说都是可怕的。我会考虑使用它来代替:

SqlConnection conn = new SqlConnection(@"Data Source=(LocalDB)\v11.0;AttachDbFilename=C:\Users\rnawa_000\Documents\Visual Studio 2013\Projects\Random\Random\sales.mdf;Integrated Security=True");

SqlCommand cmd = new SqlCommand();

cmd.Connection = conn;
conn.Open();

foreach (string item in listBox1.Items)
{
    cmd.CommandText = "insert into salesTB (Date,Time,Name,Quantity,Cost,Purchase) values (@date, @time, @name, @quantity, @cost, @purchase)";

    cmd.Parameters.Add(new SqlParameter("date", date.Text));
    cmd.Parameters.Add(new SqlParameter("time", time.Text));
    cmd.Parameters.Add(new SqlParameter("name", txtName.Text));
    cmd.Parameters.Add(new SqlParameter("quantity", listBox1.Items.Count));
    cmd.Parameters.Add(new SqlParameter("cost", txtCost.Text));
    cmd.Parameters.Add(new SqlParameter("purchase", item.Substring(0,10)));

    cmd.ExecuteNonQuery();
    cmd.Clone();
}

conn.Close();

它没有经过测试,但你明白了。

答案 1 :(得分:0)

这是一个更好,更安全的方式来做你的事后:

      string SQLQuery = "INSERT INTO salesTB (Date,Time,Name,Quantity,Cost)" +
                            "VALUES (@date, @time, @name, @quantity, @cost)";

        using (SqlConnection DBConn = new SqlConnection(cs.ToString()))
        {
            using (SqlCommand sqlCmd = new SqlCommand(SQLQuery, DBConn))
            {
                sqlCmd.Parameters.Add("@date", SqlDbType.Text);
                sqlCmd.Parameters["@date"].Value = date.Text;

                sqlCmd.Parameters.Add("@time", SqlDbType.Text);
                sqlCmd.Parameters["@time"].Value = time.Text;

                sqlCmd.Parameters.Add("@name", SqlDbType.Text);
                sqlCmd.Parameters["@name"].Value = txtName.Text;

                sqlCmd.Parameters.Add("@quantity", SqlDbType.Int);
                sqlCmd.Parameters["@quantity"].Value = listBox1.Items.Count;

                sqlCmd.Parameters.Add("@cost", SqlDbType.Text);
                sqlCmd.Parameters["@cost"].Value = txtCost.Text

                DBConn.Open();
                sqlCmd.ExecuteNonQuery();
                DBConn.Close();
            }
        }