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

Posted

技术标签:

【中文标题】从字符串转换日期和/或时间时 C# 转换失败【英文标题】:C# Conversion failed when converting date and/or time from character string 【发布时间】:2012-01-13 18:32:00 【问题描述】:

过去几个小时我在谷歌上搜索,这些问题都不适用于我的案例,所以希望你们能提供帮助。 我有一个报告应用程序,用户可以从 DateTimePicker 中选择一个日期,并且将显示具有最大数量值的项目。我使用报表查看器控件来显示信息。

这是我的表适配器中的 SQL 查询:

SELECT TOP (1) 
   Drink_Name, 
   SUM(Quantity) AS NoDrink, 
   Bill_No, 
   Staff_No, 
   Bill_Date, 
   Bill_Value, 
   Customer_No, 
   Unit_Price, 
   Quantity
FROM            

   (SELECT        
        Bill.Bill_No,
        Bill.Staff_No, 
        Bill.Bill_Date, 
        Bill.Bill_Value, 
        Bill.Customer_No, 
        Bill_Detail.Drink_Name, 
        Bill_Detail.Bill_No AS Expr1, 
        Bill_Detail.Unit_Price, 
        Bill_Detail.Quantity
    FROM 
        Bill INNER JOIN
         Bill_Detail ON Bill.Bill_No = Bill_Detail.Bill_No
    WHERE        
        (Bill.Bill_Date = @Bill_Date)
   ) AS Temp
   GROUP BY Drink_Name, 
        Bill_No, 
        Staff_No, 
        Bill_Date, 
        Bill_Value, 
        Customer_No, 
        Unit_Price, 
        Quantity
ORDER BY NoDrink DESC

这是生成数据并将数据加载到报表数据集中的代码

CoffeeShopDataSetTableAdapters.DataTable1TableAdapter adapter = 
    new CoffeeShopDataSetTableAdapters.DataTable1TableAdapter();
CoffeeShopDataSet.DataTable1DataTable table = 
    new CoffeeShopDataSet.DataTable1DataTable();
adapter.FillByMax(table, dateTimePicker1.Value.ToShortDateString());
ReportDataSource maxdatasource = 
    new ReportDataSource("DataSet1form3", (DataTable)table);

this.reportViewer1.LocalReport.DataSources.Clear();
this.reportViewer1.LocalReport.DataSources.Add(maxdatasource);
this.reportViewer1.LocalReport.Refresh();
this.reportViewer1.RefreshReport();

问题是我总是得到这个错误:

“System.Data.dll 中发生了“System.Data.SqlClient.SqlException”类型的未处理异常

附加信息:从字符串转换日期和/或时间时转换失败。"

当我尝试使用 SQL Server Management 2008 进行 SQL 查询时,它工作得很好,所以我认为这是 VS 的问题。 提前谢谢大家。 抱歉英语不好

【问题讨论】:

dateTimePicker1.Value.ToShortDateString()返回的值是多少 Bill.Bill_Date 是数据库中的有效日期时间字段,还是字符类型字段(varchar、varchar 等)?它可以包含空值吗? 为什么要传递字符串而不是日期时间? 【参考方案1】:

我会明确表达您的日期,因此日期时间格式之间不会混淆。

1) 更改将日期转换为具有显式格式的字符串的行

dateTimePicker1.Value.ToString("yyyyMMdd");

2) 更改 SQL(假设 Bill.Bill_Date 列是日期

(Bill.Bill_Date = CONVERT(DATE, @Bill_Date, 112)

【讨论】:

我将保留 SQL 并简单地将实际的 DateTime 值 dateTimePicker1.Value 作为参数传递。 是的,那会更理想,但是 CoffeeShopDataSetTableAdapters.DataTable1TableAdapter 代码不可用,所以我不知道用作@Bill_Date 的 SQLParameter 的数据类型和 FillByMax 方法参数需要更改,因为第二个参数现在是字符串类型。 @Simon 请试试这个建议,让我们知道结果如何。

以上是关于从字符串转换日期和/或时间时 C# 转换失败的主要内容,如果未能解决你的问题,请参考以下文章

将 C# 日期时间发送到 SQL Server - 错误“从字符串转换日期和/或时间时转换失败”

请问:从字符串转换日期和/或时间时,转换失败。怎么修改

TSQL:从字符串转换日期和/或时间时转换失败

转换输入时间时从字符串转换日期和/或时间时转换失败 | SQL, SQLSRV

仅在更新期间从字符串转换日期和/或时间时转换失败

从字符串转换日期和/或时间时转换失败 - Visual Studio