【问题标题】:Truncated incorrect DOUBLE value: 'hello.world'截断不正确的 DOUBLE 值:“hello.world”
【发布时间】:2020-12-16 19:13:07
【问题描述】:

在我的 DAO 中,我有:

public void UpdateProfile(string newName, string newBio, long profileId)
{
    using var dbConnection = _databaseProvider.GetConnection();
    dbConnection.SetQuery($"UPDATE `profile_data` SET `name` = @newName AND `bio` = @newBio AND `fixed_unicode` = 1 WHERE `profile_id` = @profileId");
    dbConnection.AddParameter("newName", newName);
    dbConnection.AddParameter("newBio", newBio);
    dbConnection.AddParameter("profileId", profileId);
    dbConnection.ExecuteQuery();
}

结果:

Unhandled exception. MySql.Data.MySqlClient.MySqlException (0x80004005): Truncated incorrect DOUBLE value: 'hello.world'

我不明白为什么,因为name 列是varchar(255),通过以下方式验证:

>> SELECT DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'profile_data' AND COLUMN_NAME = 'name'
>> varchar

下面我将在我的主要示例中放置代码引用,以便任何人检查它是否有助于调试问题。

_databaseProvider:

public class DatabaseProvider : IDatabaseProvider
{
    private readonly string _connectionString;

    public DatabaseProvider(string connectionString)
    {
        _connectionString = connectionString;
    }

    public DatabaseConnection GetConnection()
    {
        var connection = new MySqlConnection(_connectionString);
        var command = connection.CreateCommand();
        
        return new DatabaseConnection(connection, command);
    }
}

数据库连接:

public class DatabaseConnection : IDisposable
{
    private readonly MySqlConnection _connection;
    private readonly MySqlCommand _command;

    public DatabaseConnection(MySqlConnection connection, MySqlCommand command)
    {
        _connection = connection;
        _command = command;

        _connection.Open();
    }

    public void SetQuery(string commandText)
    {
        _command.Parameters.Clear();
        _command.CommandText = commandText;
    }

    public int ExecuteQuery()
    {
        return _command.ExecuteNonQuery();
    }

    public Task ExecuteQueryAsync()
    {
        return _command.ExecuteNonQueryAsync();
    }

    public MySqlDataReader ExecuteReader()
    {
        return _command.ExecuteReader();
    }

    public object ExecuteScalar()
    {
        return _command.ExecuteScalar();
    }

    public int GetLastId()
    {
        SetQuery("SELECT LAST_INSERT_ID();");
        return int.Parse(ExecuteScalar().ToString());
    }

    public void AddParameter(string name, object value)
    {
        _command.Parameters.AddWithValue(name, value);
    }

    public void Dispose()
    {
        _connection.Close();
        _command.Dispose();
    }
}

【问题讨论】:

  • profile_data 表中namebio 列的完整架构描述是什么?对失败的UpdateProfile 的调用中newNamenewBio 的值是什么

标签: c# mysql database


【解决方案1】:

您的 UPDATE 查询不正确。用逗号替换 AND 关键字。 查询应如下所示:

$"UPDATE `profile_data` SET `name` = @newName, 
                            `bio` = @newBio, 
                            `fixed_unicode` = 1 
WHERE `profile_id` = @profileId"

【讨论】:

  • 我觉得有点傻,谢谢你:)
  • 我假设 MySQL 有一个控制台工具(类似于 SQL Server Management Studio)。第一步是复制查询字符串,在查询前加上一些 DECLARE 语句来填充参数,看看从进程中删除 C#(或您使用的任何客户端语言)后会发生什么
【解决方案2】:

如果不执行您的代码,我会注意到您的 UPDATE 命令不正确。 试试这个

UPDATE `profile_data` SET `name` = @newName ,`bio` = @newBio ,`fixed_unicode` = 1 WHERE `profile_id` = @profileId");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-07
    • 2018-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-23
    • 2023-03-28
    相关资源
    最近更新 更多