Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C“Mysql插入查询”;数据因列成本而截断”;_C#_Mysql - Fatal编程技术网

C# C“Mysql插入查询”;数据因列成本而截断”;

C# C“Mysql插入查询”;数据因列成本而截断”;,c#,mysql,C#,Mysql,我正在处理处理MySQL数据库的应用程序,但在此表中插入值时出错: private const string createItemTableQuery = "CREATE TABLE IF NOT EXISTS `virtualstartupdb`.`item` (" + "`id` BIGINT(20) NOT NULL AUTO_INCREMENT," + "`na

我正在处理处理MySQL数据库的应用程序,但在此表中插入值时出错:

private const string createItemTableQuery = "CREATE TABLE IF NOT EXISTS `virtualstartupdb`.`item` (" +
                                "`id` BIGINT(20) NOT NULL AUTO_INCREMENT," +
                                "`name` VARCHAR(1000) NOT NULL," +
                                "`title` VARCHAR(1000) NOT NULL," +
                                "`description` VARCHAR(1000) NOT NULL," +
                                "`language_id` VARCHAR(45) NOT NULL," +
                                "`price` DOUBLE(12,2) NOT NULL," +
                                "`costs` DOUBLE(12,2) NOT NULL," +
                                "`item_type_id` BIGINT(20) NOT NULL," +
                                "PRIMARY KEY(`id`)," +
                                "FOREIGN KEY(item_type_id) REFERENCES `virtualstartupdb`.`item_type` (id) ON DELETE NO ACTION ON UPDATE NO ACTION); ";
我还有在该表中插入查询的类:

这些是属性:

long _id;
double _costs;
string _name;
string _title;
string _description;
string _language_id;
double _price;
long _item_type_id;
这是我正在使用的插入查询:

private string insertQuery = "INSERT INTO `virtualstartupdb`.`item` (`name`, `title`, `description`, `language_id`, `price`, `item_type_id`, `costs`) VALUES ('{0}', '{1}', '{2}', '{3}', '{4}', '{5}', '{6}');";
当我为属性costs和price插入2650551,0这样的值时,一切都正常,但当我尝试插入41.67或193.33时,我在控制台上得到以下错误:

Error in adding mysql row. Error: Data truncated for column 'costs' at row 1

我也试过使用float,同样的错误。我做错了什么?

根据您发布的表定义,
costs DOUBLE(12,2)NOT NULL
costs列可以保存一个长达12位的值,其中2位可以位于小数点之后,这就是
DOUBLE(M,D)
的说明

因此,
193.33
的值是完全正确的,不会引起任何问题。您必须通过放置断点来调试代码,并查看导致此错误/异常的特定值

将代码包装在
中,然后重试。。捕捉
块。
同样,不要将整个
CREATE
语句放在一个字符串中;将其卸载到存储过程中,并从代码后面调用该过程。

在插入的数值上去掉引号

  private string insertQuery = "INSERT INTO `virtualstartupdb`.`item` (`name`, `title`, `description`, `language_id`, `price`, `item_type_id`, `costs`) VALUES ('{0}', '{1}', '{2}', '{3}', {4}, {5}, {6});";
当您保留引号时,您正在使MySQL进行字符串到数字的转换


更好的方法是使用参数化查询。你可以读一下

谢谢大家的回答,但我发现mySQL不知何故接受我的值时使用了逗号,而不是点(193.33是193,33等等)。因此,我将查询更改为:

private string insertQuery = "INSERT INTO `virtualstartupdb`.`item` (`name`, `title`, `description`, `language_id`, `price`, `item_type_id`, `costs`) VALUES ('{0}', '{1}', '{2}', '{3}', REPLACE('{4}', ',', '.'), {5}, REPLACE('{6}', ',', '.'));";

现在一切都很有魅力

使用十进制的请求是正确的。在处理货币时,您几乎应该始终使用十进制而不是双精度。但我认为这不是真正的问题。做出改变是很重要的,但是当改变完成后,你仍然会得到同样的错误

相反,我怀疑问题与
成本
价格
字段占位符周围的单引号有关。这使得MySQL首先将您的值转换为字符串,然后必须将其转换回
DOUBLE(12,2)
以匹配列类型。在这种双精度转换中,您会丢失精度,最终会出现浮点舍入错误,这会使小数位数超出您的预期

或者,您的服务器正在使用默认本地服务器运行,该本地服务器使用
而不是
作为十进制分隔符

此外,这种技术非常容易受到攻击。通过使用参数化查询,您可以解决所有三个问题(铸造、十进制分隔符和大量安全漏洞):

private string insertQuery = "INSERT INTO `virtualstartupdb`.`item` (`name`, `title`, `description`, `language_id`, `price`, `item_type_id`, `costs`) VALUES ( @name, @title, @description, @language_id, @price, @item_type_id, @costs );";
private string connectionString = "Connection String here";

public void InsertRecord(MyInsertType newData)
{
    using (var cn = new MySqlConnection(connectionString))
    using (var cmd = new MySqlCommand(insertQuery, cn))
    {
        //Guessing at column types and lengths here
        cmd.Parameters.Add("@name", MySqlDbType.VarChar, 20).Value = newData._name;
        cmd.Parameters.Add("@title", MySqlDbType.VarChar, 20).Value = newData._title;
        cmd.Parameters.Add("@description", MySqlDbType.VarString, 1000).Value = newData._description;
        cmd.Parameters.Add("@language_id", MySqlDbType.VarChar, 5).Value = newData._language_id;
        cmd.Parameters.Add("@price", MySqlDbType.Decimal).Value = newData._price;
        cmd.Parameters.Add("@item_type_id", MySqlDbType.Int64).Value = newData._item_type_id;
        cmd.Parameters.Add("@costs", MySqlDbType.Decimal).Value = newData._costs;

        cn.Open();
        cmd.ExecuteNonQuery();
    }
}

193.33
的值不应引起此错误。41.67和193.33听起来像是实际插入了无限小数(如41.66667或193.333333)。你确定你的值真的只有2位小数吗?而且,考虑使用十进制字段来代替精度不高。我不认为是这样。我甚至试过数学。插入前的四舍五入(成本,2),仍然是相同的错误。我将尝试小数加!sql注入漏洞。它烧了我们!嗯,但这种转变不会导致这种情况。会吗?我试过了,但现在我得到了不同的错误:添加mysql行时出错。错误:列计数与第1行的值计数不匹配。我认为问题在于,它以某种方式格式化了我的十进制数,如197,33,而不是197.33“更好的是,使用参数化查询”-如果您只执行一项操作,请执行此操作。直到有人在“描述”字段中输入一个引号。