【问题标题】:Output from SQL Server and C# differentSQL Server 和 C# 的输出不同
【发布时间】:2019-08-25 23:08:05
【问题描述】:

我认为我的编码有问题。我猜它不是按日期过滤的。请帮忙

SQL 代码:

SELECT
   CONVERT(char(80), i.InvDate,3) AS InvDate,
   i.InvoiceNo,
   i.EmployerCode,
   i.TaxAmount + i.SubTotal AS Amount,
   '' AS Payment,
   pd.GivenName
FROM
   dbo.Invoice i
INNER JOIN 
   dbo.PatientDetails pd ON (pd.MedicalRecordID = i.MedicalRecordID)

C#代码:

SqlCommand objCmd = new SqlCommand("SELECT CONVERT(char(80), i.InvDate,3) AS InvDate, 
    i.InvoiceNo,
    i.EmployerCode,
    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, '" + dtpFrom.Text + "', 105 )) 
    AND (InvDate <= CONVERT(datetime, '" + dtpTo.Text + "', 105))," , objConn);

这就是我想要实现的目标:

这是我得到的:

在我被踢出这里之前。我会做一些修改。

编辑:

日期时间为 105 格式 (dd-mm-yyyy)

WHERE (InvDate >= CONVERT(datetime, '" + dtpFrom.Text + "', 105 )) 
AND (InvDate <= CONVERT(datetime, '" + dtpTo.Text + "', 105))

这应该从特定日期中选择。例如:2012 年 10 月 11 日至 2012 年 10 月 15 日。

即使没有 DateTimepicker,输出也不会显示“GivenName”

【问题讨论】:

  • 你的 VB 代码看起来像 C# 代码
  • 你的SQL代码和你的VB代码有什么关系?如果它们是相同的,则您的 SQL 代码没有 VB 代码中存在的 WHERE 子句,
  • 你并没有真正解释你真正得到的输出有什么错误....想详细说明一下吗?只是在我们身上放两张截图,让我们从两个输出中找出答案,并不是很有帮助....另外:fromto 在这些示例中使用的 是什么?
  • 请尽量避免将日期视为字符串。使用SqlParameters 将日期时间值传递给SQL Server(而不是作为字符串传递并尝试使用CONVERT 将它们返回到datetimes),我对你为什么将其格式化为SELECT 中的固定宽度、80 个字符宽的列。
  • 在你的循环中放置一个断点,在那里你会检查查询结果,并使用检查 dr.GetString(dr.GetOrdinal("GivenName")) 返回的内容。如果您仍然卡住,您可以编辑您的问题并添加您正在使用的代码,以显示您如何从查询结果中获取数据。您应该能够按照一个简单的示例(例如 one on MSDN for SqlDataReader)来找出哪里出错了。

标签: c# visual-studio-2010 sql-server-2008


【解决方案1】:

最好的方法是将您的输入格式化为 dd/MMM/yyyy 格式。它更好地帮助 SqlServer 识别月份和日期。我强烈建议您在与 SqlServer 通信时使用 MMM 格式。

DateTime fromDate, toDate;
fromDate = DateTime.Parse(dtpFrom.Text);
toDate = DateTime.Parse(dtpTo.Text);

SqlCommand objCmd = new SqlCommand("SELECT CONVERT(char(80), i.InvDate,3) AS InvDate, 
i.InvoiceNo,
i.EmployerCode,
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 datediff(d, '" + fromDate.ToString("dd/MMM/yyyy") + "', i.InvDate) >=0  
AND datediff(d, '" + toDate.ToString("dd/MMM/yyyy") + "', i.InvDate) <=0", objConn);

或者如果您有任何上述限制,请使用 CONVERT() 转换输入

SqlCommand objCmd = new SqlCommand("SELECT CONVERT(char(80), i.InvDate,3) AS InvDate, 
i.InvoiceNo,
i.EmployerCode,
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 datediff(d, CONVERT(datetime, '" + dtpFrom.Text + "', 105 ), i.InvDate) >=0  
AND datediff(d, CONVERT(datetime, '" + dtpTo.Text + "', 105 ), i.InvDate) <=0", objConn);

【讨论】:

  • 嗨@vinodpthmn,当我使用MMM格式时,它会抛出一个"String was not recognized as a valid DateTime"错误。当我使用您的第二个选项时,打印输出和以前一样,不会在 txt 文件中显示 pd.GivenName。
  • 我会尝试更改配置文件中的全球化,看看是否可行。
  • “字符串未被识别为有效日期时间”错误是因为您在 dtpFrom/dtpTo 中传递了无效值。您可以尝试 DateTime.TryParse() 并且第二个选项由于同样的原因也不起作用。请检查 dtpFrom/dtpTo 中的值,确保您传递了正确的日期时间。
  • 嗨@vinodpthmn,这次我可以运行程序而没有任何错误。但是输出没有显示 pd.GivenName。真奇怪。
【解决方案2】:

问题是由于日期类型转换为字符,过滤可能无法按预期工作。尝试使用 datediff,它可以解决问题。

SqlCommand objCmd = new SqlCommand("SELECT CONVERT(char(80), i.InvDate,3) AS InvDate, 
i.InvoiceNo,
i.EmployerCode,
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 datediff(d, '" + dtpFrom.Text + "', i.InvDate) >=0  
AND datediff(d, '" + dtpTo.Text + "', i.InvDate) <=0", objConn);

【讨论】:

  • 嗨,这是由于拼写错误(零附近的附加逗号),从上面的答案中删除了 - 请再试一次
  • 嗨@vinodpthmn,谢谢你帮助我。但它给了我另一个错误。将 varchar 数据类型转换为 datetime 数据类型导致值超出范围。如果我没有错,它没有指定我需要的 ISO 105。
猜你喜欢
  • 2018-07-16
  • 1970-01-01
  • 2013-03-26
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-09
相关资源
最近更新 更多