在更新表或将数据插入表之前将字符串转换为十进制

时间:2012-12-30 08:10:08

标签: c# sql winforms ado.net

我想问你如何在更新表或将数据插入表之后,在用户插入行或从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); 
          }
.........

Infor.css

  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();
   }

1 个答案:

答案 0 :(得分:4)

小数有两个因素,即比例和精度。

精确度是数字可以包含的位数。

比例是小数位数。

实施例

  • 1111. 111 (精确度:7,比例 3
  • 11. 11111 (精确度:7,比例 5

创建参数时没有表示比例,只有精度(编辑:你实际上是在构造函数中指定字节大小,而不是精度)。您需要明确设置“精度”和“缩放”属性以获得您的目标。

实施例

取自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;

上述来源的相关说明:

  

如果未明确显示“缩放”属性,则可能会截断数据   指定并且服务器上的数据不适合0级(   默认值)。

同样适用于表中的列定义,还必须指定精度和比例,当然还要匹配。 (来自@ OlivierJacot-Descombes的以下评论)