さて、プログラムで更新されたプライベート メンバーをアクセス データベースに送信しようとしています。ただし、プログラムを実行して保存ボタンを押すたびに、「条件式のデータ型が一致しません」という例外がスローされます。
これが私が使用しているコードスニペットです。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 が問題ではないと信じるようになりました。また、パラメーターのサイズをいじってみましたが、どちらもうまくいきませんでした。
私はこれをできる限り説明しようとしましたが、この問題を解決するのに役立つ何かが他にあれば提供します.