无法将类型为“System.DateTime”的对象强制转换为类型“System.String”

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法将类型为“System.DateTime”的对象强制转换为类型“System.String”相关的知识,希望对你有一定的参考价值。

表中有个值是datatime类型
using (SqlDataReader reader = cmd.ExecuteReader())

if (reader.Read())

string time = reader.GetString(reader.GetOrdinal("time"));

这样读一直报无法强制转换的错,问下这里time应该怎么读出来 并赋值到time

参考技术A 直接用tostring()转换
string time = reader.GetOrdinal("time").ToString();本回答被提问者采纳
参考技术B 你把前面的string 改成datatime:
datatime time =reader.getordinal("time"),试一试。因为你数据库里面的数据类型已经确定了,要在在vs里面保持一致追问

按照你的写法 又变成了“int”隐式转换为“System.DateTime” 之前可以编译 改了之后直接语法错误

无法使用 0000-00-00 00:00:00 值将 MySQL.DateTime 转换为 System.DateTime

【中文标题】无法使用 0000-00-00 00:00:00 值将 MySQL.DateTime 转换为 System.DateTime【英文标题】:Unable to convert MySQL.DateTime to System.DateTime with 0000-00-00 00:00:00 values 【发布时间】:2013-04-05 14:48:27 【问题描述】:

我正在处理一个 C# 项目,但我遇到了一个问题。该程序允许用户连接到 MySQL 数据库并从每个选定的表中检索信息并将数据写入文件。问题是因为我不知道架构会是什么样子或者它会包含什么值。

如果时间戳列包含日期 0000-00-00 00:00:00,我会收到转换错误,无论我尝试什么,它都不会起作用。我尝试转换为字符串 我尝试转换为 DateTime 但我总是得到错误。

以下是我目前尝试获取数据的方式:

using (ConnectMySQLDB db = new ConnectMySQLDB(databaseSettings))

   string query = string.Format("SELECT * FROM 0.1", database, table);
   Console.WriteLine("Query: 0", query);
   using (MySqlCommand cmd = new MySqlCommand(query, db.conn))
   
      using (MySqlDataReader reader = cmd.ExecuteReader())
      
         int i = 1;
         while (reader.Read())
         
            Console.WriteLine("ID: 0", i);
            fieldsAndValues = new Dictionary<string, string>();
            foreach (ColumnDataTypes fieldAndType in fieldsAndTypes)
            
               Console.WriteLine("Column: 0 Type: 1", fieldAndType.field, fieldAndType.dataType);
               string formattedValue = "";
               if (fieldAndType.dataType == "timestamp")
               
                  DateTime date = DateTime.Parse(reader.GetDateTime(fieldAndType.field).ToString());
                  formattedValue = date.ToString("yyyyMMdd");
               

               else
               
                  formattedValue = getDBFormattedValue(reader.GetString(fieldAndType.field), fieldAndType.dataType);
                  fieldsAndValues.Add(fieldAndType.field, formattedValue);
               
            
            rows.Add(fieldsAndValues);
            i++;
         
      
   

我还在连接器字符串中添加了允许零日期和将零日期转换为 null 选项,如下所示:

connString = "server=" + server + ";uid=" + username + ";pwd=" + password + ";port=" + port + ";Allow Zero Datetime=true;zeroDateTimeBehavior=convertToNull;Convert Zero Datetime=true";

【问题讨论】:

为什么要将 DateTime 转换为字符串,然后再将其解析回来?当然,您只希望它返回与开始时相同的 DateTime。 另外,您还没有告诉我们实际发生了什么。你说你得到了“错误”,但没有说那个错误是什么。 顺便问一下,您使用的是哪个 MySQL 连接器?我所看到的关于这些连接字符串选项的所有内容都表明它适用于 Java 驱动程序。您确定您使用的驱动程序支持它们吗? @JonSkeet 错误在标题中。我希望日期以字符串结尾,但我在某处读到您需要转换为 .net 日期时间,然后再转换回字符串 @JonSkeet 我不是 100% 确定他们是否应该工作,从我读到的他们提到 C# 但我可能是错的。我正在使用 mysql 的 ado.net 连接器 【参考方案1】:

查看this documentation,您似乎指定了两个相互矛盾的选项(AllowZeroDateTime=trueConvertZeroDateTime=true)和一个似乎未列出的选项(ZeroDateTimeBehavior=ConvertToNull)。

我建议除非您有实际数据 DateTime.MinValue 并且不想与“零”值混淆,否则您只需指定 ConvertZeroDateTime=true 并检测结果是否是DateTime.MinValue。您绝对不应该调用reader.GetDateTime(),然后将结果转换为字符串,然后再转换回DateTime - 您应该尽可能避免字符串转换,因为它们会搞砸很容易为您准备好。

对于这些“零”值你想要什么字符串值并不是很清楚,但你应该能够很容易地用DateTime.MinValue 对它们进行特殊处理。就我个人而言,我实际上会尽可能地将数据保持在“本机”形式,而不是将所有内容都转换为字符串,但这是一场不同的战斗。

【讨论】:

以上是关于无法将类型为“System.DateTime”的对象强制转换为类型“System.String”的主要内容,如果未能解决你的问题,请参考以下文章

无法将类型“System.DateTime”隐式转换为“string”

asp.net 无法将类型“System.DateTime”隐式转换为“string”

C# 无法将类型 system.DateTime转换成 string[]

无法将类型“System.DateTime”隐式转换为“string”是啥意思?怎么改正?

无法隐式转换类型“System.DateTime?”到“系统。日期时间”。存在显式转换

无法将 MySQL 日期/时间值转换为 System.DateTime