C# 连接的日期时间字符串为';t传递给sql

C# 连接的日期时间字符串为';t传递给sql,c#,sql-server-2008,datetime,datetimepicker,C#,Sql Server 2008,Datetime,Datetimepicker,我正在将格式化的datetime变量传递给SQL Server。我需要将日期与时间连接起来,因为它们来自两个不同的控件。代码似乎工作正常,这两个字符串一旦放在一起,就会被解析为DateTime 问题是,当它转到SQL Server时,时间部分丢失,列显示为2012-09-03 00:00:00.000,而不是2012-09-03-12 1:23:45:678(例如) 这是我的代码,为了测试,我用一个硬编码变量替换了时间,objInfo.SemesterEnrollStart是一个DateTime

我正在将格式化的datetime变量传递给SQL Server。我需要将日期与时间连接起来,因为它们来自两个不同的控件。代码似乎工作正常,这两个字符串一旦放在一起,就会被解析为DateTime

问题是,当它转到SQL Server时,时间部分丢失,列显示为
2012-09-03 00:00:00.000
,而不是
2012-09-03-12 1:23:45:678
(例如)

这是我的代码,为了测试,我用一个硬编码变量替换了时间,
objInfo.SemesterEnrollStart
是一个
DateTime
变量。另外,控件
dpEnrollStart
是一个
DatePicker

DateTime semDate = Convert.ToDateTime(dpEnrollStart.SelectedDate);
string semTime = "12:34";
DateTime dtp = DateTime.ParseExact(semDate.ToShortDateString() + " " + semTime, "MM/dd/yyyy hh:mm", null);
objInfo.SemesterEnrollStart = dtp;  
非常感谢

编辑: 下面是我用来调用存储过程的c#:

objInfo.SemesterQuarter =  ddl_SemQuarter.SelectedValue;
objInfo.SemesterYear = ddl_SemYear.SelectedValue;
objInfo.SemesterStart = Convert.ToDateTime(dpSemStart.SelectedDate);
objInfo.SemesterEnd = Convert.ToDateTime(dpSemEnd.SelectedDate);

DateTime semDate = Convert.ToDateTime(dpEnrollStart.SelectedDate);
string semTime = "12:34:00.000";
objInfo.SemesterEnrollStart = DateTime.ParseExact(semDate.ToShortDateString() + " " + semTime, "MM/dd/yyyy HH:mm:ss.fff", null);                                                        

objInfo.SemesterEnrollEnd = Convert.ToDateTime(dpEnrollEnd.SelectedDate);
objInfo.PriorityRegDate = Convert.ToDateTime(dpPriRegDate.SelectedDate);
objInfo.AgeCutoffDate = Convert.ToDateTime(dpAgeCutoffDate.SelectedDate);
lblTSMessage.Text = objInfo.SemesterEnrollStart.ToString();
objManager.AddNewSemester(objInfo);

问题在于您在ParseExact中使用的格式:

 MM/dd/yyyy hh:mm
因此,您故意丢弃秒和毫秒部分

相反,您需要使用:
yyyy-MM-dd HH:MM:ss.fff
解析日期,但是您需要在semTime变量中捕获
秒(ss)和
毫秒(fff),否则
ParseExact
方法将失效

一个例子:

string s = "01/01/2012 11:23";
//FAILS because there's not ss and fff part 
DateTime dtp = DateTime.ParseExact(s, "MM/dd/yyyy hh:mm:ss.fff", null);

string s = "01/01/2012 11:23:12.678";
//Works because there's a ss and fff part
DateTime dtp = DateTime.ParseExact(s, "MM/dd/yyyy hh:mm:ss.fff", null);

您能否提供“何时使用SQL”的移动详细信息?您正在运行查询吗?调用存储过程?什么是
objInfo
?您的sql数据类型是
smalldatetime
还是仅仅是
日期
?这将导致它不随时间存储。(或者我想设置为12:00:00…)谢谢各位,我正在运行一个SQL存储过程非查询。它正在插入日期时间。SQL列是日期时间。objInfo是保存变量的对象。谢谢,伊卡洛斯。如果我没有通过,我还需要将日期时间格式化为毫秒和分数吗?此外,我还尝试了
DateTime.Parse(semDate.ToShortDateString()+“”+semTime)
正确地(表面上)输出时间,但用户仍然无法识别时间sql@LucasSmith问题是,如果使用
MM/dd/yyyy hh:MM:ss.fff
而不提供ss和fff,则ParseExact会抛出错误。因此,在没有
ss
fff
部分的情况下,必须将
0
作为默认值传递。您可以验证解析的日期是否确实包含传入的秒和毫秒:
Console.WriteLine(dtp.ToString(“MM/dd/yyyy hh:MM:ss.fff”)应该显示所有内容。提供了一个例子再次感谢@Icarus!我尝试将一些默认秒、毫秒和分数值(12:34:00.000)传递给ParseExact方法
DateTime dtp=DateTime.ParseExact(semDate.ToShortDateString()+“”+semTime,“MM/dd/yyyy hh:MM:ss.fff”,null)
将字符串转换为有效的日期时间,但sql仍然没有正确记录它。@LucasSmith这很奇怪。如果可以,请发布存储过程代码,特别是在声明接收的参数的位置。如果可以的话,多发布一点用于调用它的C代码。以下是存储过程代码:
@semQuarter-NVARCHAR(50)、@semYear-NVARCHAR(50)、@startDate-DATE、@endDate-DATE、@enrollStart-DATETIME、@enrollEnd-DATE、@priRegDate-DATE、@ageCutoffDate-DATE-AS-INSERT-to-dbo.\u学期(quartId,[Year],StartDate,EndDate,FirstRegDate,LastRegDate,PriorityRegDate,AgeCutoffDate)值((从dbo.allthatdance_ClassQuarters中选择ClassQuarterId,其中QuarterName=@semQuarter)、@semYear、@StartDate、@EndDate、@enrollStart、@enrollEnd、@priRegDate、@AgeCutoffDate)