C# 将日期时间值插入SQL Server数据库
我正在尝试将日期时间选择器值插入数据库中的C# 将日期时间值插入SQL Server数据库,c#,sql,sql-server,winforms,C#,Sql,Sql Server,Winforms,我正在尝试将日期时间选择器值插入数据库中的DATETIME列 这是我的密码 myconstr = "Data Source=wind;Initial Catalog=TestDB;Integrated Security=True;Connect Timeout=15;Encrypt=False;TrustServerCertificate=False"; myquery = "INSERT INTO DateTimeTB(MyDate) VALUES (@mydate)"; using
DATETIME
列
这是我的密码
myconstr = "Data Source=wind;Initial Catalog=TestDB;Integrated Security=True;Connect Timeout=15;Encrypt=False;TrustServerCertificate=False";
myquery = "INSERT INTO DateTimeTB(MyDate) VALUES (@mydate)";
using (SqlConnection connection = new SqlConnection(myconstr))
{
SqlCommand cmd = new SqlCommand(myquery);
cmd.CommandType = CommandType.Text;
cmd.Connection = connection;
cmd.Parameters.Add(new SqlParameter("@mydate", SqlDbType.DateTime).Value = MyDTP01.Value);
connection.Open();
cmd.ExecuteNonQuery();
connection.Close();
}
它给了我以下的错误
SQL参数集合只接受非空的SqlParameter类型对象,而不接受日期时间对象
如何修复此问题?您的代码相当于:
var parameter = new SqlParameter("@mydate", SqlDbType.DateTime);
var value = MyDTP01.Value;
parameter.Value = value;
cmd.Parameters.Add(value);
您要添加的是参数,而不是值。因此:
cmd.Parameters.Add(new SqlParameter("@mydate", SqlDbType.DateTime)).Value = MyDTP01.Value;
记下支架的位置
但是,这可以简化-您不需要自己调用SqlParameter
构造函数-您只需将名称和类型传递给Add
:
cmd.Parameters.Add("@mydate", SqlDbType.DateTime).Value = MyDTP01.Value;
您的代码相当于:
var parameter = new SqlParameter("@mydate", SqlDbType.DateTime);
var value = MyDTP01.Value;
parameter.Value = value;
cmd.Parameters.Add(value);
您要添加的是参数,而不是值。因此:
cmd.Parameters.Add(new SqlParameter("@mydate", SqlDbType.DateTime)).Value = MyDTP01.Value;
记下支架的位置
但是,这可以简化-您不需要自己调用SqlParameter
构造函数-您只需将名称和类型传递给Add
:
cmd.Parameters.Add("@mydate", SqlDbType.DateTime).Value = MyDTP01.Value;
使用企业库,我就是这样做的
var db = EnterpriseLibraryContainer.Current.GetInstance<Database>();
using( DbCommand command = db.GetStoredProcCommand("Your Stored proc name"))
{
db.AddInParameter(command, "@mydate", DbType.DateTime, DateTime.Now.Date); // Replace with MyDTP01.Value
db.ExecuteNonQuery(command);
}
var db=EnterpriseLibraryContainer.Current.GetInstance();
使用(DbCommand command=db.GetStoredProcCommand(“您存储的进程名”))
{
db.AddInParameter(命令“@mydate”,DbType.DateTime,DateTime.Now.Date);//替换为MyDTP01.Value
db.ExecuteNonQuery(命令);
}
使用企业库,我就是这样做的
var db = EnterpriseLibraryContainer.Current.GetInstance<Database>();
using( DbCommand command = db.GetStoredProcCommand("Your Stored proc name"))
{
db.AddInParameter(command, "@mydate", DbType.DateTime, DateTime.Now.Date); // Replace with MyDTP01.Value
db.ExecuteNonQuery(command);
}
var db=EnterpriseLibraryContainer.Current.GetInstance();
使用(DbCommand command=db.GetStoredProcCommand(“您存储的进程名”))
{
db.AddInParameter(命令“@mydate”,DbType.DateTime,DateTime.Now.Date);//替换为MyDTP01.Value
db.ExecuteNonQuery(命令);
}
这里没有任何东西不能与常规ADO.NET完全相同;heck,cmd.Parameters.AddWithValue(“mydate”,DateTime.Now.Date)代码>也同样容易工作,不需要ent lib(在我考虑过的专业观点中,这是一个架构非常糟糕的库),这里没有任何东西不能与常规ADO.NET完全一样工作;heck,cmd.Parameters.AddWithValue(“mydate”,DateTime.Now.Date)
也同样容易工作,不需要ent lib(我认为这是一个非常糟糕的架构库),除非MyDTP01。Value
既不是DateTime
也不是DateTime?
,这有点笨拙<代码>cmd.Parameters.AddWithValue(“@mydate”,MyDTP01.Value)
和cmd.Parameters.AddWithValue(“@mydate”,MyDTP01.Value??SqlDateTime.Null)代码>,分别更简单。@Brian:我个人更喜欢显式地说明参数类型。我只是觉得利用Add
的返回值很尴尬,尽管这大概就是它的用途。可能是与cmd.Parameters.AddWithValue(@mydate,newsqldatetime(MyDTP01.Value))折衷代码>?我承认,如果<代码> Mydtp01。Value是,例如<代码>字符串,但我认为这是一个净正的。布瑞恩:我还是宁愿在我的答案中使用这个模式。我同意你第一次看到它时会有点奇怪,但在那之后,它会毫不费力地准确解释你的意思。除非MyDTP01.Value
既不是DateTime
也不是DateTime?
,否则这有点笨拙<代码>cmd.Parameters.AddWithValue(“@mydate”,MyDTP01.Value)
和cmd.Parameters.AddWithValue(“@mydate”,MyDTP01.Value??SqlDateTime.Null)代码>,分别更简单。@Brian:我个人更喜欢显式地说明参数类型。我只是觉得利用Add
的返回值很尴尬,尽管这大概就是它的用途。可能是与cmd.Parameters.AddWithValue(“@mydate”,新的SqlDateTime(MyDTP01.Value))的折衷代码>?我承认,如果<代码> Mydtp01。Value是,例如<代码>字符串,但我认为这是一个净正的。布瑞恩:我还是宁愿在我的答案中使用这个模式。我同意你第一次看到它时有点奇怪,但在那之后,它就很轻松地解释了你的意思。