在SqlDataAdapter

时间:2018-03-28 17:38:35

标签: c# sql-server type-conversion

我试图从SQL中检索金额。

我有一个表tbVendas,其中ValorTotalVendas列的数据类型为DECIMAL

我有以下选择查询

SELECT IdVendas AS 'Venda' 
FROM tbVendas 
WHERE ValorTotalVendas = '@valorTotal'

低于我的命令

SqlCommand comando = new SqlCommand(strSql, conn);
comando.Parameters.Add("@valorTotal", SqlDbType.Decimal);
comando.Parameters["@valorTotal"].Value = Convert.ToDecimal(txbValorFiltro.Text);

DataTable vendas = new DataTable();

conn.Open();

SqlDataAdapter sqdDA = new SqlDataAdapter(strSql, conn);
sqdDA.Fill(vendas);

但是我收到了这个错误:

  

将数据类型varchar转换为数字

时出错

有人可以帮助我吗?

4 个答案:

答案 0 :(得分:1)

您的select语句如下所示:

SELECT IdVendas AS 'Venda' FROM tbVendas WHERE ValorTotalVendas = '@valorTotal'

清楚地看一下'@valorTotal'。在任何sql语句中,''用于将值传递给任何列左右。但是当你使用'@'时,它意味着你正在传递一个列/单元格的参数,以便将来可以将其用于多个操作。

所以基本的问题是,你想要传递一个参数,但是你把它作为一个值传递。所以你要传递一个值或一个参数:

  SELECT IdVendas AS 'Venda' FROM tbVendas WHERE ValorTotalVendas = 'YourValueHere'

 ///Or

 SELECT IdVendas AS 'Venda' FROM tbVendas WHERE ValorTotalVendas = @parameterHere

希望你明白。

答案 1 :(得分:0)

试试这个

SELECT IdVendas AS 'Venda' FROM tbVendas WHERE ValorTotalVendas = @valorTotal

由于'@valorTotal',您正面临错误,将其更改为@valorTotal

后,您将不会再遇到此问题

答案 2 :(得分:0)

圣拉斐尔

您必须删除查询的单引号:

"SELECT IdVendas AS 'Venda' FROM tbVendas WHERE ValorTotalVendas = @valorTotal"

SQL Server将'@valorTotal'解释为VARCHAR而不是DECIMAL。

感谢。

答案 3 :(得分:0)

您可以尝试添加如下所示的安全机制,以防止潜在的基于bata的未来错误:

decimal amount;
bool checkValue = Decimal.TryParse(txbValorFiltro.Text, out amount);

if(checkValue)
   comando.Parameters["@valorTotal"].Value = amount;
else
   comando.Parameters["@valorTotal"].Value = -1; //or null, if field is nullable