Как правильно использовать (INSERT SELECT FROM WHERE) запрос в C #? - PullRequest
0 голосов
/ 27 марта 2019

Я делаю форму на C #, которая вставляет данные в таблицу с предложением where, но она не работает.Я думаю, что синтаксис моего запроса - проблема, но я не могу решить ее.

Это тот, который я попробовал, это работает, но мне нужен запрос вставки с предложением where.

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();

Я попробовал этот код ниже:

SqlCommand cmd = new SqlCommand("INSERT INTO tbl_Meal" +                                 
    " ExpensesID, MealName, MealPrice, ImageName, Imageblob)" +
    "SELECT ExpensesID, @mname, @mprice, @imname, @img " +
    "FROM tbl_Expenses" +
    "WHERE MealName = '"+textBox1.Text+"'",conn);

cmd.Parameters.AddWithValue("@mname", textBox1.Text);                      
cmd.Parameters.AddWithValue("@mprice", textBox4.Text);
cmd.Parameters.AddWithValue("@imname", textBox1.Text);
cmd.Parameters.Add("@img", SqlDbType.Image, photo.Length).Value = photo;

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

Но я получаю эту ошибку:

System.Data.SqlClient.SqlException: неправильный синтаксис рядом с '='

Ответы [ 2 ]

4 голосов
/ 27 марта 2019

В этом разделе отсутствует пробел между строками:

"from tbl_Expenses" +
"WHERE MealName = '"

, поэтому код sql ссылается на таблицу с именем tbl_ExpensesWHERE, присваивает ей псевдоним MealName, а затем имеет неуместный =.

Но вы также должны знать, что из-за использования параметров в других местах НЕ нормально подставлять textBox1.Text в запрос, подобный этому. НИКОГДА не делай этого. Ни разу. Даже не для практики / учебного кода!

Здесь есть и другие плохие практики, но это было худшее. Вот лучшая модель:

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();
}
0 голосов
/ 27 марта 2019

Вместо Parameters.AddWithValue() используйте Parameters.Add(), а также используйте правильные типы данных, например EstimatedServingCount выглядит как int, но, однако, 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...