C# - SQL Server:使用 GETDATE() 和 Parameter 插入查询

本文关键字:Parameter 插入 查询 GETDATE SQL Server 使用 | 更新日期: 2023-09-27 18:31:16

>更新:

我认为问题是:

为什么命令将GETDATE()的值替换为DATE_CREATED参数值,尽管DATE_CREATED在命令查询中不存在?

我在Select声明中也遇到了问题...

GETDATE()如何工作?

我在使用 SQL Server 插入查询时遇到问题。

GETDATE()放入插入查询中,但也将名为 DATE_CREATE 的参数与值0001/01/01放在一起。

当我执行插入查询时,它会抛出异常

SqlDateTime overflow。必须介于 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 下午。

请帮助我找出导致此错误的原因。

P/s:对不起,我的英语不好

表创建代码:

CREATE TABLE [dbo].[USER](
    [USER_ID] [int] NOT NULL,
    [USER_NAME] [nvarchar](100) NOT NULL,
    [DATE_CREATED] [datetime] NOT NULL,
    CONSTRAINT [PK_USER] PRIMARY KEY CLUSTERED ([USER_ID] ASC)
) ON [PRIMARY]
GO

C# 代码:

    private void Working()
    {
        //Get a SQL Connection
        IDbConnection con = GetConnection();
        USER user = new USER();
        user.USER_ID = 1;
        user.USER_NAME = "User";
        user.DATE_CREATED = new DateTime(1, 1, 1);
        USERDao dao = new USERDao(con);
        con.Open();
        try{
            Insert(con,user);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
        con.Close();
    }
    private int Insert(IDbConnection con,USER obj)
    {
        IDbCommand command;
        command = con.CreateCommand();
        string query = @"INSERT INTO USER (USER_ID, USER_NAME, DATE_CREATED) 
                          VALUES (@USER_ID, @USER_NAME, GETDATE())";
        command.CommandText = query +";";
        addDbDataParameter(command, "USER_ID", obj.USER_ID, DbType.Int32);
        addDbDataParameter(command, "USER_NAME", obj.USER_NAME, DbType.String);
        addDbDataParameter(command, "DATE_CREATED", obj.DATE_CREATED, DbType.DateTime);
        int res = command.ExecuteNonQuery();
        if (res == 0) { throw new Exception("Zero rows were affected."); }
        return res;
    }
    static public void addDbDataParameter(IDbCommand command, string name, object value, DbType dbType)
    {
        IDbDataParameter parameter = command.CreateParameter();
        parameter.DbType = dbType;
        parameter.Direction = ParameterDirection.Input;
        parameter.ParameterName = "@" + name;
        //parameter.SourceColumn = name;
        if (value == null) { parameter.Value = DBNull.Value; }
        else { parameter.Value = value; }
        command.Parameters.Add(parameter);
    }

如您所见,插入查询中没有名为 DATE_CREATED 的参数(它是 GETDATE() 值),但该命令仍添加 user.DATE_CREATED 的值。

P/s:我通过从命令中删除addParameter DATE_CREATED来修复它,它起作用了。

我希望你能帮助我了解为什么它会导致这个问题...... :(

C# - SQL Server:使用 GETDATE() 和 Parameter 插入查询

错误消息非常明确地说明了有效日期的范围:

"SqlDateTime overflow。必须介于 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 PM."

datetime数据类型的最小日期值为 '1753-01-01'

如果你真的想使用'0001-01-01'那么使用datetime2数据类型,例如:

[DATE_CREATED] [datetime2] NOT NULL,

如果您真正想要的是 SQL Server datetime数据类型支持的最小日期,然后按照@Damith建议进行操作并使用

user.DATE_CREATED = (DateTime)System.Data.SqlTypes.SqlDateTime.MinValue

更新:(问题不清楚):

USERUSER_ID 和 (! USER_NAME都是 SQL Server 中的保留字。尝试:

    string query = @"INSERT INTO [USER] ([USER_ID], [USER_NAME], DATE_CREATED) 
                     VALUES (@USER_ID, @USER_NAME, GETDATE())";

我刚刚创建了一个运行您的表创建语句的空表,并成功将此命令作为 TSQL 运行,例如

INSERT INTO [USER] ([USER_ID], [USER_NAME], DATE_CREATED) VALUES (1, 'joe', GETDATE())

MSSQL 最小日期与 C# DateTime.MinValue (1/1/0001) 不同,请尝试以下操作:

 user.DATE_CREATED = (DateTime)System.Data.SqlTypes.SqlDateTime.MinValue;

即使您没有使用命令参数集合中的所有参数,它也将是具有您给定类型的参数值的验证。 验证将因输入错误而失败。

例如,检查以下内容

var res =new System.Data.SqlTypes.SqlDateTime(1,1,1); //Invalid SqlDateTime.
 user.DATE_CREATED = new DateTime(1, 1, 1);

应该是

 user.DATE_CREATED = DateTime.Now;

为什么?

正如错误所说:

"SqlDateTime overflow。必须介于 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 PM."

但是您将日期设置为 0001/01/01,这将导致错误。