Я пытаюсь получить дату для сохранения в виде строки в таблице, но дата продолжает преобразовываться в отрицательное 4-значное число, которое коррелирует с датой, и я не могу на всю жизнь выяснить, где я испортил Обратите внимание, что я использую комбо C # и SQL Server
foreach(DataRow dr in dt.Rows)
{
int qty = 0;
string pname = "";
SqlCommand cmd3 = con.CreateCommand();
cmd3.CommandType = CommandType.Text;
cmd3.CommandText = "insert into order_item values('" + orderid.ToString() + "','" + dr["product"].ToString() + "'," +
"'" + dr["price"].ToString() + "','" + dr["qty"].ToString() + "','"+ dr["total"].ToString() + "')";
cmd3.ExecuteNonQuery();
qty = Convert.ToInt32(dr["qty"].ToString());
pname = dr["product"].ToString();
SqlCommand cmd6 = con.CreateCommand();
cmd6.CommandType = CommandType.Text;
cmd6.CommandText = "update stock set product_qty = product_qty - " + qty + " where product_name = '"+pname.ToString()+"'";
cmd6.ExecuteNonQuery();
// date keeps getting updated to negative 4 digit number which coordinates with the date. ex: 14-01-2020 is converting to -2007.
SqlCommand cmd7 = con.CreateCommand();
cmd7.CommandType = CommandType.Text;
**cmd7.CommandText = "update stock_over_time set product_qty = product_qty - " + qty + ", date_changed = " + date.ToString("dd-MM-yyyy") + "" +
" where product_name = '" + pname.ToString() + "'";**
cmd7.ExecuteNonQuery();
}
Всего 2 ответа
Непосредственная проблема заключается в том, что:
, date_changed = " + date.ToString("dd-MM-yyyy") + "
станет
, date_changed = 15-01-2020
что: -2006
, то есть (из-за того, как хранятся даты) какое-то время в июле 1894 года.
Плохим решением для этого будет добавление кавычек, но это: плохо - у него есть целый ряд проблем, связанных с интернационализацией (08-01 первого августа? 8 января?), SQL-инъекцией и т. Д.
Правильное решение заключается в использовании параметров во всем. Например:
cmd7.CommandText = @"
update stock_over_time
set product_qty = product_qty - @qty,
date_changed = @date
where product_name = @pname";
Это, однако, требует добавления параметров со значениями.
Самый простой способ сделать это с помощью Dapper:
string pname = ...
int qty = ...
DateTime date = ...
con.Execute(@"
update stock_over_time
set product_qty = product_qty - @qty,
date_changed = @date
where product_name = @pname",
new { pname, qty, date });
Примечание: весь доступ к вашей базе данных должен быть параметризован, как описано выше, или с использованием необработанного ADO.NET, или с использованием инструментов, таких как EF и т. Д. Не только это одно место; везде
Дата не должна храниться как строковый тип данных, вместо этого измените date-changed
измените ее на тип даты и времени (или даже просто на дату, так как хранимые значения не имеют элемента «время»).
Кроме того, рекомендуется использовать параметризованный запрос, чтобы избежать внедрения SQL
string sql = @"update stock_over_time set product_qty = product_qty - @qty, date_changed = @date where product_name = @pname";
using (SqlConnection connection = new SqlConnection(connString)
{
connection.Open();
using (SqlCommand cmd= new SqlCommand(sql, connection))
{
cmd.Parameters.Add("@qty", SqlDbType.SqlInt32).value = qty;
cmd.Parameters.Add("@date", SqlDbType.SqlDateTime).value = date;
cmd.Parameters.Add("@pname", SqlDbType.Varchar, 50).value = pname;
cmd.ExecuteNonQuery();
}
}