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

时间:2013-09-15 02:58:25

标签: c# sql-server parameters getdate

更新:

我认为问题是:

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

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

GETDATE()如何运作?

我遇到了SQL Server插入查询的问题。

我将GETDATE()放入插入查询中,但我也将名为DATE_CREATE的参数放入值0001/01/01

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

  

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

请帮我弄清楚导致此错误的原因。

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来修复它,并且它有效。

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

3 个答案:

答案 0 :(得分: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 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())";

我刚刚创建了一个运行表create语句的空表,并成功运行了这个命令,例如。

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

答案 1 :(得分:1)

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.

答案 2 :(得分: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 ,这将导致错误。