C# 从字符串转换日期和/或时间时转换失败

C# 从字符串转换日期和/或时间时转换失败,c#,sql-server,visual-studio-2010,C#,Sql Server,Visual Studio 2010,我在SQL Server 2008中有一个查询 SELECT CONVERT(char(80), i.InvDate,3) AS InvDate, i.InvoiceNo, i.TaxAmount + i.SubTotal AS Amount, '' AS Payment, pd.GivenName FROM dbo.Invoice i INNER JOIN dbo.PatientDetails pd ON (pd.MedicalRecordID

我在SQL Server 2008中有一个查询

SELECT
    CONVERT(char(80), i.InvDate,3) AS InvDate,
    i.InvoiceNo,
    i.TaxAmount + i.SubTotal AS Amount,
    '' AS Payment,
    pd.GivenName
FROM
dbo.Invoice i
    INNER JOIN dbo.PatientDetails pd ON (pd.MedicalRecordID = i.MedicalRecordID)
    WHERE (InvDate >= CONVERT(datetime, '16/10/2012', 105)) AND 
(InvDate <= CONVERT(datetime, '16/10/2012', 105))
选择
将(字符(80),即InvDate,3)转换为InvDate,
i、 发票号,
i、 TaxAmount+i.小计为金额,
""作为报酬,,
吉文纳姆警长
从…起
dbo.发票一
内部连接dbo.PatientDetails pd ON(pd.MedicalRecordID=i.MedicalRecordID)
其中(InvDate>=转换(日期时间,'16/10/2012',105))和

(InvDate您的
SQL代码没有问题。如果您有多行字符串,您只需要在命令中的双引号之前添加
@
(逐字字符串文字)

SqlCommand objCmd = new SqlCommand(@"SELECT CONVERT(char(80), i.InvDate,3) AS InvDate,
               i.InvoiceNo, 
               i.TaxAmount +  i.SubTotal AS Amount,'' AS Payment,pd.GivenName 
FROM    dbo.Invoice i INNER JOIN dbo.PatientDetails pd
            ON (pd.MedicalRecordID = i.MedicalRecordID)
WHERE   (InvDate >= CONVERT(datetime, 'dd/MM/yyyy', 105)) AND 
        (InvDate <= CONVERT(datetime, 'dd/MM/yyyy', 105))", objConn);
SqlCommand objCmd=newsqlcommand(@“选择CONVERT(char(80),i.InvDate,3)作为InvDate,
i、 发票号,
i、 TaxAmount+i.小计为金额,“”为付款,pd.GivenName
从dbo.Invoice i内部加入dbo.PatientDetails pd
ON(pd.MedicalRecordID=i.MedicalRecordID)
其中(InvDate>=CONVERT(datetime,'dd/MM/yyyyy',105))和

(InvDate我更愿意将查询移动到存储过程,并从数据映射器类调用存储过程。

CONVERT(datetime,'dd/MM/yyyyy',105)
正在尝试将文本
dd/MM/yyyyy
转换为
datetime
-这是行不通的

SqlCommand objCmd = new SqlCommand(@"SELECT CONVERT(char(80), i.InvDate,3) 
AS InvDate,
i.InvoiceNo, i.TaxAmount + i.SubTotal AS Amount,'' AS Payment,pd.GivenName 
FROM
dbo.Invoice i INNER JOIN dbo.PatientDetails pd
ON 
(pd.MedicalRecordID = i.MedicalRecordID)
WHERE
(InvDate >= @StartDate) 
AND 
(InvDate <= @EndDate)", objConn);

objCmd.Parameters.AddWithValue("@StartDate",/* some C# expression that gives you the start date, as a DateTime value */);
objCmd.Parameters.AddWithValue("@EndDate",/* some C# expression that gives you the end date, as a DateTime value */);
SqlCommand objCmd=newsqlcommand(@“选择转换(char(80),i.InvDate,3)
截至目前,,
i、 发票编号,i.税金额+i.小计作为金额,''作为付款,pd.GivenName
从…起
dbo.Invoice i内部联接dbo.PatientDetails pd
在…上
(pd.MedicalRecordID=i.MedicalRecordID)
哪里
(InvDate>=@StartDate)
及

(InvDate您是否尝试过yyyy/MM/dd或MM/dd/yyyy?如果确实需要将日期指定为字符串,则应使用独立于语言和日期格式的格式ISO-8601。在SQL Server中,这是
YYYYMMDD
(无破折号!)或
yyyy-MM-DDTHH:MM:SS
(如果您也需要时间)。这两种方法是将日期指定为字符串的唯一可靠方法,它适用于所有SQL Server区域设置。嗨,manish,尝试了两种方法都不起作用。嗨@marc_,你能给我指一个引用,我可以用它来更改日期吗?要消除指定为字符串的情况吗?@Newbie创建一个
存储过程
。它允许你传递参数。噢,现在它向我展示了其他一些东西。“必须声明标量变量“@SELECT”。“不,
@
符号应该在字符串
@”SELECT
之外,而不是
”@SELECT
啊,很抱歉。我的错。即使使用
@"选择
,它向我显示了相同的错误。奇怪。你不认为试图将字符串
'dd/MM/yyyy'
转换为
日期时间
是错误的吗?@Damien_不相信它。但我认为上面查询中的
'dd/MM/yyyy'
是OP试图显示的日期格式,而不是原始日期。对吗
objCmd.Parameters.AddWithValue(“@StartDate”,DateTime.Parse(dtpFrom.Text));
objCmd.Parameters.AddWithValue(“@EndDate”,DateTime.Parse(dtpTo.Text));
@Newbie-no.停止将日期转换为字符串。datetimepicker(我假设是
dtpX
控件的功能)拥有一个
Value
属性,该属性将日期作为
DateTime
值提供。ADO.Net完全能够将.Net
DateTime
值转换为SQL Server
DateTime
值。将这些值转换为字符串是不必要的转换(也是许多可能的错误的根源)。只需执行
.AddWithValue即可(“@StartDate”,dtpFrom.Value)
SqlCommand objCmd = new SqlCommand(@"SELECT CONVERT(char(80), i.InvDate,3) 
AS InvDate,
i.InvoiceNo, i.TaxAmount + i.SubTotal AS Amount,'' AS Payment,pd.GivenName 
FROM
dbo.Invoice i INNER JOIN dbo.PatientDetails pd
ON 
(pd.MedicalRecordID = i.MedicalRecordID)
WHERE
(InvDate >= @StartDate) 
AND 
(InvDate <= @EndDate)", objConn);

objCmd.Parameters.AddWithValue("@StartDate",/* some C# expression that gives you the start date, as a DateTime value */);
objCmd.Parameters.AddWithValue("@EndDate",/* some C# expression that gives you the end date, as a DateTime value */);