我在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))
输出:
http://i50.tinypic.com/1z6wfex.png
当我尝试将其放入C#时,它表示“从字符串转换日期和/或时间时转换失败。”
信息:16/10/2012是我尝试插入查询以确保其运行的示例日期。这是一个旧程序,这就是为什么它从字符串转换。我很确定它与日期时间格式有关。看看http://www.sqlusa.com/bestpractices/datetimeconversion/。但我不能指责它。
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);
SqlDataReader objReader;
objReader = objCmd.ExecuteReader();
System.IO.FileStream fs = new System.IO.FileStream("C:\\CMSExportedData\\Sales-" +
DateTime.Now.ToString("dd-MM-yyyy") + ".txt", System.IO.FileMode.Create);
System.IO.StreamWriter sw = new System.IO.StreamWriter(fs,
System.Text.Encoding.Default);
答案 0 :(得分:1)
SQL code
没有任何问题。如果你有多行字符串,你只需要在命令中的双引号之前@
(逐字字符串文字)。
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);
答案 1 :(得分:1)
CONVERT(datetime, 'dd/MM/yyyy', 105)
正在尝试将文字文本dd/MM/yyyy
转换为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 */);
您必须在上面的最后两行填写注释部分。我们可以previous question从dtpFrom.Value
开始dtpTo.Value
和{{1}}。
答案 2 :(得分:0)
我更愿意将查询移到存储过程并从Data Mapper类中调用存储过程。