我想问您在用户插入行或从dataGridView更新行之后,如何在更新表或将数据插入表之前将字符串转换为小数。
例如,我将一个十进制值2.2
放入价格列,然后将其保存到数据库,然后刷新表,该值是2
,而不是2.2
,或添加2.8
,然后该表向我们显示了3
,而不是2.8
。
在我的情况下,我希望价格列为小数,我按如下方式进行操作,但它不起作用,请帮助,谢谢。
在form1.css中:
..............
//after a user click the save button
private void btnSave_Click(object sender, EventArgs e)
{
Infor.UpdateDataSet((DataSet)dataGridView1.DataSource);
}
.........
信息库
pInsert[3] = new SqlParameter("@p4", SqlDbType.Decimal, 40,
"price");
pUpdate[2] = new SqlParameter("@p4", SqlDbType.Decimal, 40,
"price");
.........
public static void UpdateDataSet(DataSet ds)
{
SqlConnection cnn = new SqlConnection(strConn);
string sqlInsert, sqlUpdate, sqlDelete;
sqlInsert = "insert into customers(customerid,companyname,
contactname,price) values(@p1,@p2,@p3,@p4)";
sqlUpdate = "update customers set companyname=@p2,
contactname=@p3,price=@p4 where customerid=@p1";
sqlDelete = "delete from customers where customerid=@p1";
SqlParameter[] pInsert = new SqlParameter[4];
SqlParameter[] pUpdate = new SqlParameter[4];
SqlParameter[] pDelete = new SqlParameter[1];
pInsert[0] = new SqlParameter("@p1", SqlDbType.VarChar, 5,
"CustomerID");
pInsert[1] = new SqlParameter("@p2", SqlDbType.VarChar, 40,
"CompanyName");
pInsert[2] = new SqlParameter("@p3", SqlDbType.VarChar, 40,
"ContactName");
pInsert[3] = new SqlParameter("@p4", SqlDbType.Decimal, 40,
"price");
pUpdate[0] = new SqlParameter("@p2", SqlDbType.VarChar, 40,
"CompanyName");
pUpdate[1] = new SqlParameter("@p3", SqlDbType.VarChar, 40,
"ContactName");
pUpdate[2] = new SqlParameter("@p4", SqlDbType.Decimal, 40,
"price");
pUpdate[3] = new SqlParameter("@p1", SqlDbType.VarChar, 5,
"CustomerID");
pDelete[0] = new SqlParameter("@p1", SqlDbType.VarChar, 5,
"CustomerID");
SqlCommand cmdInsert = new SqlCommand(sqlInsert,cnn);
SqlCommand cmdUpdate = new SqlCommand(sqlUpdate,cnn);
SqlCommand cmdDelete = new SqlCommand(sqlDelete,cnn);
cmdInsert.Parameters.AddRange(pInsert);
cmdUpdate.Parameters.AddRange(pUpdate);
cmdDelete.Parameters.AddRange(pDelete);
SqlDataAdapter da = new SqlDataAdapter();
da.InsertCommand = cmdInsert;
da.UpdateCommand = cmdUpdate;
da.DeleteCommand = cmdDelete;
da.Update(ds, "customers");
ds.AcceptChanges();
}
最佳答案
小数有两个因素,比例和精度。
精度是数字可以包含的位数。
小数位数是小数位数。
例子
1111.111(精度:7,等级3)
11.11111(精度:7,等级5)
创建参数时,您没有表示比例,只是精度(编辑:您实际上是在构造函数中以字节为单位指定大小,而不是精度)。您需要显式设置Precision和Scale属性以达到您想要的结果。
例
取自http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparameter.scale.aspx。
SqlParameter parameter = new SqlParameter("Price", SqlDbType.Decimal);
parameter.Value = 3.1416;
parameter.Precision = 8;
parameter.Scale = 4;
以上来源的相关说明:
如果未明确显示Scale属性,则数据可能会被截断
指定并且服务器上的数据不适合小数位数0(
默认)。
表中的列定义同样适用,还必须指定精度和小数位,并且当然要匹配。 (在@ OlivierJacot-Descombes的评论之后添加)