在C#中使用(INSERT SELECT FROM WHERE)查询的正确方法是什么?

时间:2019-03-26 22:59:30

标签: c# sql sql-server ado.net

我正在C#上创建一个窗体,该窗体将数据插入带有where子句的表中,但是不起作用。我认为查询的语法是问题,但我无法解决。

这是我尝试过的一种,但是我需要一个带有where子句的插入查询。

In []:
max(data, key=lambda d: data[d]['Distance'])

Out[]:
'key1'

我在下面尝试了此代码:

SqlCommand addEmp = new SqlCommand("INSERT INTO tbl_Expenses " +
                "(InvestedMoney,EstimatedServingCount,MealName) " +
                "VALUES (@inv, @est, @mname)", conn);
addEmp.Parameters.AddWithValue("@mname", textBox1.Text);
addEmp.Parameters.AddWithValue("@inv", textBox2.Text);
addEmp.Parameters.AddWithValue("@est", textBox3.Text);

conn.Open();
addEmp.ExecuteNonQuery();
conn.Close();

但是我得到这个错误:

  

System.Data.SqlClient.SqlException:“ =”附近的语法不正确

2 个答案:

答案 0 :(得分:4)

本节在行之间缺少空格:

"from tbl_Expenses" +
"WHERE MealName = '"

因此sql代码引用了一个名为tbl_ExpensesWHERE的表,为该表指定了别名MealName,然后有一个不适当的=

但是您还应该已经从其他地方的参数使用中知道,可以将textBox1.Text替换为这样的查询 NOT 从不这样做。 甚至没有一次。甚至没有练习/学习代码!

这里还有其他一些不良做法,但这是最糟糕的。这是一个更好的模式:

string sql = @"
INSERT into tbl_Meal
    (ExpensesID,MealName,MealPrice,ImageName,Imageblob)
SELECT
    ExpensesID,@mname,@mprice,@mname,@img 
FROM tbl_Expenses
WHERE MealName = @mname";

using (var conn = new SqlConnection("connection string here"))
using (var cmd = new SqlCommand(sql, conn))
{
    //wild guess at column types. Use actual column types/size FROM THE DATABASE
    cmd.Parameters.Add("@mname", SqlDbType.NVarChar, 30).Value = textBox1.Text;  
    cmd.Parameters.Add("@mprice", SQlDbType.Decimal, 18, 8).Value = textBox4.Text;
    //use the size of the column here, not the length of the photo
    cmd.Parameters.Add("@img", SqlDbType.Image, 8000).Value = photo;

    conn.Open();
    cmd.ExecuteNonQuery();
}

答案 1 :(得分:0)

代替Parameters.AddWithValue()使用Parameters.Add()并使用正确的数据类型,例如EstimatedServingCount似乎是一个整数,但是AddWithValue不知道:

addEmp.Parameters.Add("@mname", SqlDbType.VarChar).Value = textBox1.Text;
addEmp.Parameters.Add("@inv", SqlDbType.VarChar).Value = textBox2.Text;
addEmp.Parameters.Add("@est", SqlDbType.Int).Value = textBox3.Text;