C#double进入MySql db double不能正常工作

时间:2013-11-02 14:05:00

标签: c# mysql double

我正在使用C#将网上商店系统转换为另一个系统。这是从DB到DB之间的一些转换。

我在C#中有这段代码:

Double proPriceTmp = Double.Parse(productPrice);
Double realPrice = ((proPriceTmp / 121) * 100);

string insertProduct = "INSERT INTO `" + ocPrefix + "product` ( `product_id`, `model`, `quantity`, `stock_status_id`, `image`, `manufacturer_id`, `shipping`, `price`, `tax_class_id`,`date_available`, `weight`, `weight_class_id`, `length`, `width`, `height`,`length_class_id`,`subtract`,`minimum`,`sort_order`,`status`,`date_added`,`date_modified`,`viewed`) VALUES ('" + product_id + "', @param_model, '" + product_quantity + "', '" + stock_status_id + "', '" + image + "', '" + manufacturer_id + "', '" + shipping + "', '" + realPrice + "', '" + numericUpDown1.Value + "', '" + date_available + "', '" + product_weight + "', '" + weigth_class_id + "', '" + product_length + "',  '" + product_width + "', '" + product_height + "', '" + length_class_id + "', '" + substracting + "', '" + minimum + "', '" + sort_order + "', '" + status + "', '" + product_created + "', '" + product_modified + "', '" + viewed + "')";
MySqlCommand cmdInsertProduct = new MySqlCommand(insertProduct, connOc);
cmdInsertProduct.CommandText = insertProduct;
cmdInsertProduct.Parameters.AddWithValue("@param_model", product_name);
cmdInsertProduct.ExecuteNonQuery();
cmdInsertProduct.Dispose();

这是价格变量的值(感谢调试器):

productPrice = "1,20000";
proPriceTmp = 1.2;
realPrice = 0.99173553719008256;

但数据库中的价格为0.0000。我已经尝试手动插入信息,这样做(使用那么长的数字),这样就可以了。

表格如下:

CREATE TABLE `oc_product` (
  `product_id` int(11) NOT NULL AUTO_INCREMENT,
  `model` varchar(64) NOT NULL,
  `sku` varchar(64) NOT NULL,
  `upc` varchar(12) NOT NULL,
  `ean` varchar(14) NOT NULL,
  `jan` varchar(13) NOT NULL,
  `isbn` varchar(13) NOT NULL,
  `mpn` varchar(64) NOT NULL,
  `location` varchar(128) NOT NULL,
  `quantity` int(4) NOT NULL DEFAULT '0',
  `stock_status_id` int(11) NOT NULL,
  `image` varchar(255) DEFAULT NULL,
  `manufacturer_id` int(11) NOT NULL,
  `shipping` tinyint(1) NOT NULL DEFAULT '1',
  `price` decimal(15,4) NOT NULL DEFAULT '0.0000',
  `points` int(8) NOT NULL DEFAULT '0',
  `tax_class_id` int(11) NOT NULL,
  `date_available` date NOT NULL,
  `weight` decimal(15,8) NOT NULL DEFAULT '0.00000000',
  `weight_class_id` int(11) NOT NULL DEFAULT '0',
  `length` decimal(15,8) NOT NULL DEFAULT '0.00000000',
  `width` decimal(15,8) NOT NULL DEFAULT '0.00000000',
  `height` decimal(15,8) NOT NULL DEFAULT '0.00000000',
  `length_class_id` int(11) NOT NULL DEFAULT '0',
  `subtract` tinyint(1) NOT NULL DEFAULT '1',
  `minimum` int(11) NOT NULL DEFAULT '1',
  `sort_order` int(11) NOT NULL DEFAULT '0',
  `status` tinyint(1) NOT NULL DEFAULT '0',
  `date_added` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `date_modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `viewed` int(5) NOT NULL DEFAULT '0',
  PRIMARY KEY (`product_id`)
) ENGINE=MyISAM AUTO_INCREMENT=52 DEFAULT CHARSET=utf8;

那么有谁知道为什么这不像它应该做的那样工作?即使向正确的方向推进也足够了......

修改

如有疑问,这是insertProduct的价值。你可以看到,价格是否合适......

"INSERT INTO `oc_product` ( `product_id`, `model`, `quantity`, `stock_status_id`, `image`, `manufacturer_id`, `shipping`, `price`, `tax_class_id`,`date_available`, `weight`, `weight_class_id`, `length`, `width`, `height`,`length_class_id`,`subtract`,`minimum`,`sort_order`,`status`,`date_added`,`date_modified`,`viewed`) VALUES ('51', @param_model, '999999999', '7', 'data/old/letter_trein.jpg', '0', '1', '0,991735537190083', '11', '2013-06-09', '600,000', '1', '0,000',  '0,000', '0,000', '1', '0', '0', '0', '1', '2013-01-09 12:26:02', '2013-10-24 10:23:47', '0')"

2 个答案:

答案 0 :(得分:2)

在您的查询中,您将每个值视为字符串。实际上,当您需要编写数字字段时,不要在值周围使用单引号。例如,在插入product_id字段的值时,不应使用它周围的引号。如果使用参数化查询,可以避免所有这些混乱。

这样就可以将你的值解释为Framework代码了,你不必担心如何在字符串中正确表示它们(更不用说整个Sql Injection问题)和你的insertProduct字符串将更具可读性。

您的查询中已经有一个参数,将其扩展到每个值 但要注意数值。例如,'product_id'变量应该是数字而不是字符串。

string insertProduct = "INSERT INTO `" + ocPrefix + "product` ( `product_id`, `model`, " + 
                       "`quantity`, `stock_status_id`, `image`, `manufacturer_id`, " + 
                       "`shipping`, `price`, `tax_class_id`,`date_available`, `weight`, " + 
                       "`weight_class_id`, `length`, `width`, " + 
                       "`height`,`length_class_id`,`subtract`,`minimum`,`sort_order`," + 
                       "`status`,`date_added`,`date_modified`,`viewed`) " + 
                       "VALUES (@pid, @param_model, @qty, @stk, @img, @mid, @ship, " + 
                       "@price, @num, @date', @weight,@classid, @length, @width," + 
                       "@height,@lenid,@sub,@min, @sort,@status,@created,@modified,@view)";
 MySqlCommand cmdInsertProduct = new MySqlCommand(insertProduct, connOc);
 cmdInsertProduct.Parameters.AddWithValue("@pid", product_id);
 cmdInsertProduct.Parameters.AddWithValue("@param_model", product_name);
 ...... 

在此之后我认为你可能会遇到没有表达DEFAULT的NOT NULL字段引起的其他问题。我认为你应该将它们添加到你的查询

答案 1 :(得分:2)

看起来你在欧洲(?)语言环境中运行,使用逗号,作为小数分隔符 - 在SQL字符串中,你有'0,991735537190083'而不是{{ 1}}。现在,您可以更改为使用'0.991735537190083'上的ToString()重载来指定要使用的区域设置,或者您可以更改为参数化整个查询,这也可以保护反对SQL注入攻击。