【发布时间】:2019-11-20 22:55:57
【问题描述】:
当我尝试更新我的数据库时,它会在到达日期时间列时崩溃。
这是我正在尝试执行的函数(pub Date 是它崩溃的地方):
public void UpdateDatabase(List<Title> titleList, List<Author> authorList, List<Publisher> publisherList)
{
using (IDbConnection connection = new System.Data.SqlClient.SqlConnection(Helper.CnnVal("CsharpMD3")))
{
foreach (var item in titleList)
{
connection.Execute($"update titles Set title='{item.title}', titleType='{item.TitleType}', price='{item.Price}' , pubdate=cast({item.PubDate.Year}{item.PubDate.Month}{item.PubDate.Day} as datetime2) , pubID='{item.PubID}' where ID={item.ID}");
}
}
}
我尝试将其转换为 datetime2/datetime,我尝试使用转换函数
CONVERT(datetime, mydate, 112)
我试图只输入整个日期,但是当它开始读取时间时也会崩溃。 我试过这个:
connection.Execute($"update titles Set title='{item.title}', titleType='{item.TitleType}', price='{item.Price}' , pubdate='{item.PubDate.Year}{item.PubDate.Month}{item.PubDate.Day}' , pubID='{item.PubID}' where ID={item.ID}");
我也尝试添加和删除撇号。
我得到的主要错误是:算术溢出错误将表达式转换为数据类型日期时间。 and : 从字符串转换日期和/或时间时转换失败。
奇怪的是,当我尝试在数据库中创建(插入)一个新项目时它会起作用 如果我在 sql 本身中键入命令并将变量名更改为数字,它也可以工作:
public void InsertTitle(Title toInsert)
{
using (IDbConnection connection = new System.Data.SqlClient.SqlConnection(Helper.CnnVal("CsharpMD3")))
{
connection.Execute($"insert into dbo.titles (title, titleType, price, pubdate, pubID) VALUES ('{toInsert.title}' , '{toInsert.TitleType}', '{toInsert.Price}', '{toInsert.PubDate.Year}{toInsert.PubDate.Month}{toInsert.PubDate.Day}', '{toInsert.PubID}')");
}
}
我也尝试过参数化的 sql 命令,但对我来说不起作用,所以我只想弄清楚为什么更新功能不起作用。
如果我只更改年份而不是月份或日期,它也可以工作!
【问题讨论】:
-
哎呀,这很可怕——容易受到 sql 注入问题的影响。
-
我想更好地了解为什么尝试了参数化命令,但这对我没有用 正如您现在所做的那样,除了 sql 注入问题之外,您将所有内容都作为字符串传递您的代码可能会因简单的解析错误而失败,如果您的标题值包含单引号怎么办?如果字段与属性具有相同的名称,也可以使用 dapper 将对象简单地传递给执行命令