C#中SqlDataReader日期字段调用ToString带参数报无重载错误求助
报错原因
SqlDataReader的索引器返回值为object类型,object类的ToString()方法无带参数的重载,因此直接调用ToString("dd-MM-yyyy")会触发编译错误。
解决方案
下面提供3种可直接落地的方案,你可以根据自己的项目习惯选择:
方案1:后端先转换为DateTime类型再格式化
先判断字段是否为数据库空值,再转换为DateTime类型后调用带格式的ToString方法,示例代码如下:while (dr.Read()) { DBtoRestore currentdgUID = new DBtoRestore { CUID_dbname = dr["DB_name"].ToString(), CUID_RaisonSoc = dr["RS_name"].ToString(), // 新增空值判断+类型转换逻辑 CUID_DateFinExercice = dr.IsDBNull("RS_DateFinExercice") ? string.Empty : dr.GetDateTime(dr.GetOrdinal("RS_DateFinExercice")).ToString("dd-MM-yyyy", System.Globalization.CultureInfo.InvariantCulture), CUID_IsClosed = dr["RS_IsClosed"].ToString() }; dgUIDcollection.Add(currentdgUID); }加上
CultureInfo.InvariantCulture是为了避免系统区域设置影响日期分隔符,确保始终输出-作为分隔符。方案2:SQL查询阶段直接格式化日期为字符串
在查询语句中直接用SQL的日期转换函数输出符合要求的字符串,不需要修改C#逻辑,修改SQL中RS_DateFinExercice的取值逻辑即可:-- 用CONVERT函数的105格式输出dd-MM-yyyy格式的日期字符串 RS_DateFinExercice = CAST(CONVERT(VARCHAR(10), (SELECT Max(v) FROM (VALUES (a.[D_FinExo01]), (a.[D_FinExo02]), (a.[D_FinExo03]),(a.[D_FinExo04]),(a.[D_FinExo05])) AS value(v)), 105) AS VARCHAR(100)),方案3:DataGrid绑定阶段指定格式(仅适用于CUID_DateFinExercice为DateTime类型的场景)
如果你的DBtoRestore类中CUID_DateFinExercice属性是DateTime类型,不需要修改后端读取逻辑,直接在XAML的DataGrid列绑定时指定字符串格式即可:<DataGrid x:Name="dgDBtoRestore" AutoGenerateColumns="False"> <DataGrid.Columns> <!-- 其他列 --> <DataGridTextColumn Header="财务年度结束日" Binding="{Binding CUID_DateFinExercice, StringFormat='dd-MM-yyyy'}" /> </DataGrid.Columns> </DataGrid>
内容的提问来源于stack exchange,提问作者Fabrice Bertrand
相关产品推荐
相关产品推荐

