操作数类型冲突:int与sql中的date不兼容

问题描述 投票:0回答:1

我正在编写一条插入语句,但出现上述错误

插入查询

var insertSql = string.Format(
                $"INSERT INTO Sales (Date, Team, Sales) VALUES ({0}, {1}, {2})",
                new List<SqlParameter>()
                {
                    new("@date", sales.Date.ToString("yyyy-MM-dd")),
                    new("@team", sales.Team),
                    new("@sales", sales.Sales),
                });
            var rowCount = Sql.ExecuteNonQuery(Conn,insertSql);

这是我的表架构和类

SaleId int,
Date Date,
Team varchar(50),
Sales int

public class Sales
{
    public int SalesId { get; set; }
    public DateTime Date { get; set; }
    public string Team { get; set; }
    public int Sales { get; set; }
}

我想使用参数化查询来实现此目的,因此尝试了此操作,但给出了上述错误

c# sql ado.net prepared-statement sql-injection
1个回答
1
投票

这里的立即问题是

$"..."
本身插值字符串,并且您注入的值是literal
0
1
2
- 它们不是占位符: 它们就是价值观。删除
$
会使其成为适合
string.Format
的文字字符串,但是 您不想在此处使用
string.Format
;另外,您不想格式化日期 - 只需将其作为日期传递即可。

老实说:如果您自己编写 SQL,我不确定这里是否需要 EF;有了 Dapper,这将很简单:

conn.Execute("INSERT INTO Sales (Date, Team, Sales) Values (@Date, @Team, @Sales)",
    sales);

或者使用更好的 SQL 格式化技巧:

conn.Execute("""
    INSERT INTO Sales (Date, Team, Sales)
    Values (@Date, @Team, @Sales)
    """, sales);

Dapper 将处理查找

sales.Date
sales.Team
sales.Sales
,并正确添加它们。 EF 可能还有一个用于执行此类临时查询的 API,但是...这感觉更像是 Dapper 场景,除非您对 EF 投入了感情。

© www.soinside.com 2019 - 2024. All rights reserved.