0

我正在使用 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')"
4

2 回答 2

2

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

这会将您的值解释为框架代码的工作,您不必担心如何在字符串中正确表示它们(更不用说整个 Sql 注入问题),并且您的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 字段引起的。我认为您应该将它们添加到您的查询中

于 2013-11-02T14:10:03.717 回答
2

看起来您正在欧洲(?)语言环境中运行,该语言环境使用逗号,作为小数分隔符 - 在 SQL 字符串中,您得到'0,991735537190083'的不是'0.991735537190083'. 现在,您可以更改为使用ToString()on的重载realPrice来指定要使用的语言环境,或者您可以更改为参数化整个查询,这也可以防止 SQL 注入攻击。

于 2013-11-02T14:23:36.240 回答