3

ユーザーが行を挿入した後、またはdataGridViewから行を更新した後、テーブルを更新する前、またはテーブルにデータを挿入する前に、文字列を10進数に変換する方法を教えてください。

たとえば、price列に10 進数の値2.2を入力し、それをデータベースに保存してから、テーブルを更新します。22.22.832.8

私の場合、価格の列を10進数にしたいので、次のようにしますが、うまくいきません。助けてください、ありがとう。

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

1 に答える 1

4

小数には位取りと精度の 2 つの要素があります。

精度は、数値に含めることができる桁数です。

スケールは小数点以下の桁数です。

  • 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 からの次のコメントを追加)

于 2012-12-30T15:55:18.267 に答える