0

さて、プログラムで更新されたプライベート メンバーをアクセス データベースに送信しようとしています。ただし、プログラムを実行して保存ボタンを押すたびに、「条件式のデータ型が一致しません」という例外がスローされます。

これが私が使用しているコードスニペットです。da.Update コマンドで例外をスローしています。したがって、更新コマンドまたはパラメーターと関係があることはわかっています。問題を絞り込もうとしてきたので、繰り返しの部分もコメントアウトしました。

OleDbConnection conn = 新しい OleDbConnection(ConnString);

        string sql = @" SELECT * FROM Account where AccountID = '" + accountName + @"'";

        string update = @" UPDATE Account SET
                        Cash = '@Cash'";/*, PaidInCapital = '@PaidInCapital',
                        TotalRetainedEarnings = '@TotalRetainedEarnings',
                        StockholdersEquity = '@StockholdersEquity',
                        CommonStock = '@CommonStock', PreferredStock = '@PreferredStock',
                        TreasuryStock = '@TreasuryStock', CashDividends = '@CashDividends',
                        StockDividends = '@StockDividends', @"TotalNumberPreferred = '@TotalNumberPreferred',
                        PreferredMarketPrice = '@PreferredMarketPrice', PreferredPar = '@PreferredPar',
                        Cumulative = '@Cumulative', TotalNumberCommon = '@TotalNumberCommon',
                        CommonMarketPrice = '@CommonMarketPrice', CommonPar = '@CommonPar',
                        NumberTransactTreasuryStock = '@NumberTransactTreasuryStock',
                        AvgPriceTreasury = '@AvgPriceTreasury'";*/


        try
        {
            OleDbDataAdapter da = new OleDbDataAdapter();

            da.SelectCommand = new OleDbCommand(sql, conn);

            AccountDatabaseDataSet ds = new AccountDatabaseDataSet();

            da.Fill(ds, "Account");

            DataTable dt = ds.Tables["Account"];

            dt.Rows[0][1] = cash;
            /*dt.Rows[0][2] = paidInCapital;
            dt.Rows[0][3] = totalRetainedEarnings;
            dt.Rows[0][4] = stockholdersEquity;
            dt.Rows[0][5] = commonStock;
            dt.Rows[0][6] = preferredStock;
            dt.Rows[0][7] = treasuryStock;
            dt.Rows[0][8] = cashDividends;
            dt.Rows[0][9] = stockDividends;
            dt.Rows[0][10] = totalNumberPreferred;
            dt.Rows[0][11] = preferredMarketPrice;
            dt.Rows[0][12] = preferredPar;
            dt.Rows[0][13] = preferredRate;
            dt.Rows[0][14] = cumulative;
            dt.Rows[0][15] = totalNumberCommon;
            dt.Rows[0][16] = commonMarketPrice;
            dt.Rows[0][17] = commonPar;
            dt.Rows[0][18] = numberTransactTreasury;
            dt.Rows[0][19] = avgPriceTreasury;*/

            OleDbCommand cmd = new OleDbCommand(update, conn);

            cmd.Parameters.Add("@Cash", OleDbType.Decimal, 18, "Cash");
            /*cmd.Parameters.Add("@PaidInCapital", OleDbType.Decimal, 18, "PaidInCapital");
            cmd.Parameters.Add("@TotalRetainedEarnings", OleDbType.Decimal, 18, "TotalRetainedEarnings");
            cmd.Parameters.Add("@StockholdersEquity", OleDbType.Decimal, 18, "StockholdersEquity");
            cmd.Parameters.Add("@CommonStock", OleDbType.Decimal, 18, "CommonStock");
            cmd.Parameters.Add("@PreferredStock", OleDbType.Decimal, 18, "PreferredStock");
            cmd.Parameters.Add("@TreasuryStock", OleDbType.Decimal, 18, "TreasuryStock");
            cmd.Parameters.Add("@CashDividends", OleDbType.Decimal, 18, "CashDividends");
            cmd.Parameters.Add("@StockDividends", OleDbType.Decimal, 18, "StockDividends");
            cmd.Parameters.Add("@TotalNumberPreferred", OleDbType.Integer, 16, "TotalNumberPreferred");
            cmd.Parameters.Add("@PreferredMarketPrice", OleDbType.Decimal, 10, "PreferredMarketPrice");
            cmd.Parameters.Add("@PreferredPar", OleDbType.Decimal, 10, "PreferredPar");
            cmd.Parameters.Add("@PreferredRate", OleDbType.Decimal, 5, "PreferredRate");
            cmd.Parameters.Add("@Cumulative", OleDbType.Boolean, 2, "Cumulative");
            cmd.Parameters.Add("@TotalNumberCommon", OleDbType.Integer, 16, "TotalNumberCommon");
            cmd.Parameters.Add("@CommonMarketPrice", OleDbType.Decimal, 10, "CommonMarketPrice");
            cmd.Parameters.Add("@CommonPar", OleDbType.Decimal, 10, "CommonPar");
            cmd.Parameters.Add("@NumberTransactTreasuryStock", OleDbType.Integer, 16, "NumberTransactTreasuryStock");
            cmd.Parameters.Add("@AvgPriceTreasury", OleDbType.Decimal, 10, "AvgPriceTreasury");*/


            da.UpdateCommand = cmd;
            da.Update(ds, "Account");

コメント部分を抜き出すと、本質的にこれに絞り込まれます。

OleDbConnection conn = new OleDbConnection(ConnString);

        string sql = @" SELECT * FROM Account where AccountID = '" + accountName + @"'";

        string update = @" UPDATE Account SET
                        Cash = '@Cash'";
        try{
            OleDbDataAdapter da = new OleDbDataAdapter();

            da.SelectCommand = new OleDbCommand(sql, conn);

            AccountDatabaseDataSet ds = new AccountDatabaseDataSet();

            da.Fill(ds, "Account");

            DataTable dt = ds.Tables["Account"];

            dt.Rows[0][1] = cash;

            OleDbCommand cmd = new OleDbCommand(update, conn);

            cmd.Parameters.Add("@Cash", OleDbType.Decimal, 18, "Cash");

            da.UpdateCommand = cmd;
            da.Update(ds, "Account");
         }

したがって、基本的に私が持っているのは、2番目の[1]列を10進数型のプライベートメンバー変数「現金」に等しく設定したい「アカウント」テーブルです。次に、OleDbType が Decimal、サイズが 18、アクセス データベースの列が「Cash」である「@Cash」パラメーターのパラメーターを設定します。最後に、この値で「アカウント」テーブルを更新します。

今、oledbtype の .Decimal をリスト内の可能なすべての型に変更しようとしましたが、機能しないようで、一部の例外でさえ、たとえば「DateTime に変換できない Decimal 型」と記載されています。したがって、oledbtype が問題ではないと信じるようになりました。また、パラメーターのサイズをいじってみましたが、どちらもうまくいきませんでした。

私はこれをできる限り説明しようとしましたが、この問題を解決するのに役立つ何かが他にあれば提供します.

4

3 に答える 3

0

データベースの行を更新する必要がある場合は、以下を試してください

using (OleDbConnection conn = new OleDbConnection(ConnString))
 {
       conn.Open();
       using (var cmd = conn.CreateCommand())
       {
            cmd.CommandText = "UPDATE Account SET Cash=? WHERE AccountID =?";
            cmd.Parameters.Add("@p1", OleDbType.Decimal).Value = 3.1416;
            cmd.Parameters.Add("@p2", OleDbType.Integer).Value = accountName;
            cmd.ExecuteNonQuery();
       }
 }
  • パラメーターを使用しないと、SQL インジェクション攻撃に対してクエリが開かれます
  • OLE DB.NET Framework データ プロバイダーは、名前付きパラメーターの代わりに、疑問符 (?) でマークされた位置パラメーターを使用します。
于 2013-04-22T03:46:13.333 に答える