0

エラーが発生しています:

"入力文字列は、正しい形式ではありませんでした。"

注:行 182 を引用符で囲まれた実際の数字 (つまり、「3」または「875」) に変更し、行 171 をコメントアウトすると、このコードは完全に正常に動作します。ただし、174 行目の "{7}" は、自動インクリメントするはずのフィールドですが、そうではありません。そのため、171 行目で「数値」を取得しようとしています。これは、行数 + 1 を使用して auto-=increment を実行します。

これに乗る人はいますか?:-)

171   string rowCount = string.Format("SELECT COUNT(*) FROM Log WHERE Location is NULL");

173   string sql = string.Format("insert into Log values " +
174         "('{0}','{1}',{2},{3},'{4}',#{5}#,'{6}','{7}')",
175         comboBox1.Text,
176         comboBox2.Text,
177         float.Parse(textBox1.Text),
178         float.Parse(comboBox3.Text),
179         textBox3.Text,
180         textBox2.Text,
181         addRemove,
182         int.Parse(rowCount) 
183         );
4

5 に答える 5

15

そのコードの使用をすぐに中止し、代わりにパラメーター化された SQL を使用してください。そうしないと、SQL インジェクション攻撃に対して脆弱になり、データ型変換の問題が発生する可能性があります。

次に、あなたが実際に手に入れたものについて考えてみてくださいrowCount。これは整数を表す文字列ではなく、何らかの SQL です。それを解析しようとしてint.Parseもうまくいきませんよね?最初にクエリを実行するか、挿入ステートメント内でサブクエリを使用する必要があります。正直なところ、それが自動インクリメント フィールドであることが意図されている場合、競合状態に対して脆弱になるコードをいじるよりも、それを機能させることに専念したいと思います。

于 2012-03-28T16:38:02.830 に答える
2

int.Parse(rowCount)文字列を数値に変換します。たとえば、「100500」を 100500 に変換します。ただし、文字列には数値が含まれていますが"SELECT COUNT(*) FROM Log WHERE Location is NULL"、これは数値ではありません。

于 2012-03-28T16:37:53.703 に答える
2

string.FormatSQL コマンドを実行するつもりはありません。これはもちろん、数値の 10 進表現ではありませんint.Parse"SELECT COUNT(*) FROM Log WHERE Location is NULL"

于 2012-03-28T16:38:08.803 に答える
0

実質的にすべてのデータベースは、自動インクリメント列をネイティブでサポートしています。int 列を使用して自分でインクリメントしようとしないでください。インクリメント列を非常に堅牢にするためには、あらゆる種類の競合状態、パフォーマンスの問題などがあり、データベース設計者はすでにそれらすべてを処理しています。

于 2012-03-28T16:49:57.250 に答える
0

おそらく、この特定の投稿に関する問題を解決する答えを探しているでしょう。投稿された回答は、それを行うのに役立ちます。
他のアプローチを検討する必要があります。コマンド オブジェクトを使用し、パラメーターを使用します (@JonSkeet が推奨)
自動インクリメント カラムがどのように機能するかについて調査します。これは、データベース ベンダーによって異なります。Microsoft Access を使用している可能性があります。MS Sql Server の場合、自動インクリメント カラムは ID カラムであり、Oracle ではメカニズムが少し異なり、シーケンスを使用します。基本的に、自動インクリメント列の値は指定せず、データベース エンジンに処理させます。(以前のポスターでも言及されています)
また、テキスト ボックスの値を変数に割り当て、insert ステートメントまたはパラメーターを挿入する前にデータの検証を行うことをお勧めします。防御的にプログラミングしてみてください。

于 2012-03-28T17:38:53.900 に答える