0

更新:

我认为问题是:

为什么命令用参数值替换值GETDATE()虽然DATE_CREATEDDATE_CREATED命令查询中不存在?

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

如何GETDATE()工作?

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

我放入GETDATE()了插入查询,但我也放入了以DATE_CREATE值命名的参数0001/01/01

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

SqlDateTime 溢出。必须介于 1753 年 1 月 1 日上午 12:00:00 和 9999 年 12 月 31 日晚上 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,并且它有效。

我希望你能帮助我了解它导致问题的原因...... :(

4

3 回答 3

4

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

“SqlDateTime 溢出。必须在 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 Serverdatetime数据类型支持的最短日期,请按照@Damith建议进行操作并使用

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

更新:(问题不清楚):

USER, USER_ID, and(!)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())
于 2013-09-15T03:06:08.757 回答
1

MSSQL min date is different to 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.
于 2013-09-15T03:06:32.370 回答
0
 user.DATE_CREATED = new DateTime(1, 1, 1);

应该

 user.DATE_CREATED = DateTime.Now;

为什么 ?

正如错误所说:

“SqlDateTime 溢出。必须在1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 PM 之间。”

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

于 2013-09-15T03:02:50.987 回答