手动迁移

时间:2016-12-19 23:04:42

标签: c# sql asp.net-mvc

我刚开始使用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'

SqlParameter()个签名。 enter image description here

3 个答案:

答案 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

由于您的日期是硬编码的。如果它不是硬编码的,请使用准备好的语句。