我刚开始使用Asp .Net并尝试手动将数据添加到我的数据库中。
我有以下迁移,将dateTime
添加到数据库中的相关字段,但我收到错误Incorrect syntax near '00'
。
不知道这意味着什么,据我所知,我正在将正确的数据类型传递给数据库。
有什么想法吗?
namespace VidlyNew.Migrations
{
using System;
using System.Data.Entity.Migrations;
public partial class AddBirthDateValues : DbMigration
{
public override void Up()
{
Sql($"UPDATE Customers SET CustomerBirthDate = {DateTime.Parse("19-12-1990")} WHERE Id = 1");
}
public override void Down()
{
}
}
}
模型
using System;
using System.ComponentModel.DataAnnotations;
namespace VidlyNew.Models
{
public class Customers
{
public int Id { get; set; }
[Required]
[StringLength(255)]
public string Name { get; set; }
public bool IsSubscribedToNewsletter { get; set; }
public MembershipType MembershipType { get; set; }
public byte MembershipTypeId { get; set; }
public DateTime? CustomerBirthdate { get; set; }
}
}
更新了以下输入:
SqlParameter DateParam1 = new SqlParameter("@CustomerBirthDate_1", new DateTime(1990,12,01));
Sql("UPDATE Customers SET CustomerBirthDate = @CustomerBirthDate_1 WHERE Id = 1", DateParam1);
但是现在我有以下错误:
Cannot convert from 'System.Data.Sqlclient.Sqlparameter' to 'bool'
答案 0 :(得分:4)
问题是您的SQL语句最终会像...SET CustomerBirthDate = 1990/12/19 00:00:00 ...
那样取决于您的文化,这种语法在无效的SQL语法中(作为字符串提供的日期值必须用引号括起来)。
您应该使用参数而不是内联SQL来提供值。由于您使用Sql
调用将其换行,因此可能意味着重构以允许传递或一个或多个参数:
SqlParameter p = new SqlParameter("@CustomerBirthDate",new DateTime(1990,12,19));
Sql("UPDATE Customers SET CustomerBirthDate = @CustomerBirthDate WHERE Id = 1", p);
虽然可以只用单引号(SET CustomerBirthDate = '1990-12-19'
)包围值,但我会养成使用参数传递值的习惯。这将意味着更少的格式化问题(特别是日期/时间)和SQL注入的漏洞更少。
答案 1 :(得分:2)
您无法在查询中直接将c#datetime分配给SQL Server日期时间。
问题在于您尝试将c#datetime分配给sql server列的查询部分。你可以这样做..
Sql("UPDATE Customers SET CustomerBirthDate = '12-19-1990' WHERE Id = 1");
SQL Server尝试根据您的目标类型将字符串转换为DateTime(或Date)。如果您的日期是SQL Server可接受的格式,则将隐式执行转换。
答案 2 :(得分:0)
您的查询生成如下:
UPDATE Customers SET CustomerBirthDate = 19/12/1990 12:00:00 AM WHERE Id = 1
取决于您的文化。这是SQL Server的无效日期。
您可以简单地写一下:
UPDATE Customers SET CustomerBirthDate = '1990/12/19' WHERE Id = 1
由于您的日期是硬编码的。如果它不是硬编码的,请使用准备好的语句。