如何解决sql server中的数据类型转换?

ct2axkht  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(411)

我无法将数据插入数据库。我使用以下数据模型在visualstudio上创建了一个webapi

public long ProductId { get; set; }
public string ProductName { get; set; }
public double Price { get; set; }
public string Url { get; set; }

我正在使用postman测试以下post请求

{
    "ProductID": null,
    "ProductName": "ProductA",
    "Price": 100.1,
    "Url":"https://productA.com"
}

调试时,我得到 error converting data type varchar to float . 这可以在下图中看到。我不知道如何解决这个问题,我想问题出在第74行

我通过运行以下查询创建了数据库

CREATE TABLE dbo.ProductInfo 
(
    ProductID bigint IDENTITY(1,1) NOT NULL,
    ProductName varchar(1000), 
    Price float,
    Url varchar (1000)
)
ny6fqffe

ny6fqffe1#

你没有使用参数。您只需将变量插入字符串中。
在您的值中,实际上是将其作为varchar插入,因为您通过

... '" + prod.Price + "' ...

这将导致实际的查询字符串

Values('ProductA', '100.1', 'https://productA.com')

所以SQLServer现在尝试通过将varchar转换为float来为您转换这些值。它应该还能做到。
你得到的错误是它不能这样做。我注意到您还插入了prod.price,而不是var price变量。你确定产品价格格式正确吗?
因为屏幕上显示的是,由于自动铸造,var价格应该有效。我猜prod.price可能是逗号分隔的十进制而不是点分隔的。这将导致SQLServer抛出错误。
显示错误的sql server端示例:

DECLARE @floatVariable FLOAT = 100.1 
/* Proper float value, so no problems */
SELECT @floatVariable

DECLARE @floatVariable2 FLOAT = '100.1' 
/* A valid float, but as varchar so autocasted */
SELECT @floatVariable2

DECLARE @floatVariable3 FLOAT = '100,1' 
/* A varchar with improper float values, autocasted but doesn't succeed */
SELECT @floatVariable3

或者简单地对查询使用适当的sql参数化。而不是将所有内容都包含在一个字符串中(像这样注入sql总是很有趣的)。
编辑:
因此,测试了应用程序中的转换。在一个简单的c#控制台应用程序中,使用以逗号分隔的小数作为约定的区域设置/区域性,在将double“添加”到字符串时,它会自动转换为逗号分隔。
示例代码:

static void Main(string[] args)
    {

        double a = 10.1;

        Console.WriteLine(@"Double value: " + a + " .");

        Console.ReadLine();
    }

价值输出:
双倍值:10,1。

相关问题