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
来修复它,它起作用了。
我希望你能帮助我了解为什么它会导致这个问题...... :(
错误消息非常明确地说明了有效日期的范围:
"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
更新:(问题不清楚):
USER
, USER_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,这将导致错误。