我正在使用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')"
答案 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注入攻击。