【问题标题】:Add record to MySQL always raises - "Input string was not in a correct format error"向 MySQL 添加记录总是引发 - “输入字符串格式不正确”
【发布时间】:2020-05-02 10:55:17
【问题描述】:

每次我尝试将记录添加到数据库时,事务都会失败,并显示“输入字符串的格式不正确”,即使我尝试过不涉及任何字符串!

让您更深入地了解我正在尝试做的事情,基本上我的应用程序的用户在启动时请求他的会话 ID,以跟踪他的活动,在下面的阶段,服务器已收到请求并从MySQL,然后将其传回给客户端,客户端使用这个数字来形成对他自己通道的身份验证。

我从下面的日志中看到的似乎是一些引发此异常的无效转换。

我正在使用:

  1. .NET Core 2.1
  2. Pomelo.EntityFrameworkCore.MySql 3.1.0
  3. 为 linux-gnu x86_x64 编译的 Oracle MySQL 5.1.73(没有机会更新它)

希望有人能帮忙。

这里是麻烦的代码以及Entity的定义,表设计和错误日志:

    public static uint CreateSession(UsageTracking usageTracking)
    {
        using (MySQL SQL = new MySQL())
        {
            SQL.UsageTracking.Add(usageTracking);
            SQL.SaveChanges();

            return usageTracking.SessionID;
        }
    }

   public class UsageTracking
    {
        [Key]
        public uint SessionID { get; set; }
        [MaxLength(7)] [Required]
        public string USID{ get; set; }
        [Required]
        public long Date { get; set; }
    }


class MySQL : DbContext
{
    public static string connectionHost;
    public static string connectionPort;
    public static string connectionDB;
    public static string connectionUsn;
    public static string connectionPsw;

    public DbSet<DB.UsageTracking> UsageTracking { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder options)
    {
        options
            .UseMySql($"server={connectionHost};port={connectionPort};database={connectionDB};user= 
                 {connectionUsn};password={connectionPsw}", mySQLOptions => mySQLOptions
                .ServerVersion(new Version(5,1,73), ServerType.MySql)
            );
    }
}

使用情况跟踪表:

CREATE TABLE `UsageTracking` (
`SessionID` int(4) unsigned NOT NULL,
`USID` varchar(7) DEFAULT NULL,
`Date` int(8) DEFAULT NULL,
 PRIMARY KEY (`SessionID`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

错误日志:

        <logevent time="2020-01-15 16:24:17.2857" level="ERROR">
          <message>Input string was not in a correct format.</message>
          <type>System.FormatException</type>
          <trace>   at System.Number.StringToNumber(ReadOnlySpan`1 str, NumberStyles options, NumberBuffer&amp; number, NumberFormatInfo info, Boolean parseDecimal)
           at System.Number.ParseUInt32(ReadOnlySpan`1 value, NumberStyles options, NumberFormatInfo numfmt)
           at System.String.System.IConvertible.ToUInt32(IFormatProvider provider)
           at System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider)
           at MySql.Data.MySqlClient.MySqlConnectionStringValueOption`1.ChangeType(Object objectValue) in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlConnectionStringBuilder.cs:line 703
           at MySql.Data.MySqlClient.MySqlConnectionStringValueOption`1.GetValue(MySqlConnectionStringBuilder builder) in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlConnectionStringBuilder.cs:line 674
           at MySqlConnector.Core.ConnectionSettings..ctor(MySqlConnectionStringBuilder csb) in C:\projects\mysqlconnector\src\MySqlConnector\Core\ConnectionSettings.cs:line 39
           at MySqlConnector.Core.ConnectionPool.GetPool(String connectionString) in C:\projects\mysqlconnector\src\MySqlConnector\Core\ConnectionPool.cs:line 405
           at MySql.Data.MySqlClient.MySqlConnection.OpenAsync(Nullable`1 ioBehavior, CancellationToken cancellationToken) in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlConnection.cs:line 292
           at MySql.Data.MySqlClient.MySqlConnection.Open() in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlConnection.cs:line 280
           at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.OpenDbConnection(Boolean errorsExpected)
           at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.Open(Boolean errorsExpected)
           at Pomelo.EntityFrameworkCore.MySql.Storage.Internal.MySqlRelationalConnection.Open(Boolean errorsExpected)
           at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.BeginTransaction(IsolationLevel isolationLevel)
           at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.BeginTransaction()
           at Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.Execute(IEnumerable`1 commandBatches, IRelationalConnection connection)
           at Microsoft.EntityFrameworkCore.Storage.RelationalDatabase.SaveChanges(IList`1 entries)
           at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(IList`1 entriesToSave)
           at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(DbContext _, Boolean acceptAllChangesOnSuccess)
           at Pomelo.EntityFrameworkCore.MySql.Storage.Internal.MySqlExecutionStrategy.Execute[TState,TResult](TState state, Func`3 operation, Func`3 verifySucceeded)
           at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(Boolean acceptAllChangesOnSuccess)
           at Microsoft.EntityFrameworkCore.DbContext.SaveChanges(Boolean acceptAllChangesOnSuccess)
           at Microsoft.EntityFrameworkCore.DbContext.SaveChanges()
           at ReportingServer.DB.CreateSession(UsageTracking usageTracking) in C:\Users\User\source\repos\Reporting Server\MySQL.cs:line 20
           at ReportingServer.APIs.GetSessionID() in C:\Users\User\source\repos\Reporting Server\APIs.cs:line 66
           at ReportingServer.APIs.Process() in C:\Users\User\source\repos\Reporting Server\APIs.cs:line 41
           at ReportingServer.HTTPServer.&lt;Listen&gt;b__10_0(Object HTTPRequest) in C:\Users\User\source\repos\Reporting Server\HTTPServer.cs:line 135</trace>
          <source>System.Private.CoreLib</source>
          <location>
          <ReportedIn>ReportingServer.Log</ReportedIn>
          <OnLine>17</OnLine>
        </location>
        </logevent>

【问题讨论】:

  • 似乎是在打开连接时发生的。执行OnConfiguring时请检查connectionPort的值
  • 你能在 UsageTracking 对象中发布值吗?

标签: c# mysql entity-framework pomelo-entityframeworkcore-mysql


【解决方案1】:

确保您下面的代码工作正常。设置断点检查。

$"server={connectionHost};port={connectionPort};database={connectionDB};user= {connectionUsn};密码={connectionPsw}"

【讨论】:

    【解决方案2】:

    解决了。 Oleksa 的回答是正确的,我在配置后检查了连接,它不正确,配置部分被错误地更改,我一直在看代码的错误部分......

    谢谢!!

    【讨论】:

      【解决方案3】:

      堆栈跟踪显示,MySqlConnector 无法将您提供的连接字符串选项之一转换为 UInt32

      这是port 参数,在您的情况下是connectionPort 变量,它不是有效的UInt32。它必须是介于165535 之间的有效端口号(MySQL 的默认值为3306)。


      顺便说一句,Pomelo 3.1.0 不是官方的 support MySQL 5.1.73,因此您将来可能会遇到不兼容问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-10-13
        • 2021-08-19
        • 1970-01-01
        • 2015-07-12
        • 1970-01-01
        • 2011-09-06
        • 2022-01-23
        相关资源
        最近更新 更多