0

データ グリッドを含む win フォームがあり、それに行を追加し、この行をデータベースに挿入したいのですが、各行には独自の ID があるため、このクエリを作成してこれを実行しようとしましたが、特にしようとしたときにエラーが発生しました各行に最大 ID +1 を挿入してください。このクエリを正しく書くのを手伝ってください。

これが私のクエリです:

for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
    OracleConnection CN = new OracleConnection(ConnectionString);
    string Query = 
           "insert into EMP_HASM_DET " +
           "(MAXID,EMPID,GHYAB,TAGMEE3,GZA) " +
           "  (SELECT 1 + coalesce((SELECT max(MAXID) FROM EMP_HASM_DET)), 1),'" + 
           this.dataGridView1.Rows[i].Cells[0].Value + "','" + 
           this.dataGridView1.Rows[i].Cells[1].Value + "','" + 
           this.dataGridView1.Rows[i].Cells[2].Value + "','" + 
           this.dataGridView1.Rows[i].Cells[3].Value + "'";
    OracleCommand cmd = new OracleCommand(Query, CN);
    CN.Open();
    cmd.ExecuteNonQuery();
    CN.Close();
}
4

1 に答える 1

0

いくつかの考え...

  • SQL に VALUES 句がありません。これが問題の一部である可能性があります。
  • 質問にMySQLのタグを付けましたが、コードサンプルでOracle接続を参照しています...それはどれですか?
  • 行ごとに接続を開いたり閉じたりしています。これは多くのオーバーヘッドです。一度開いて、コマンドを発行してから閉じます。

質問とは直接関係ありませんが、以下に示すように、コードを再フォーマットして String.Format を使用することを検討してください。これにより、内容が少し読みやすくなります。特に、単一引用符を常に追加しているわけではないためです。私が持っているように Debug.WriteLine ステートメントをコードに入れ、それが何を出力するかをお知らせください...これにより、問題がより明確になり、より良い支援が可能になります。

-- テストされていないコードが続きます --

string sqlTemplate = "INSERT INTO EMP_HASM_DET(MAXID,EMPID,GHYAB,TAGMEE3,GZA) VALUES ({0}, '{1}', '{2}', '{3}', '{4}')";
string sqlSubquery = "(SELECT COALESCE(max(MAXID)+1, 1) FROM EMP_HASM_DET)";

OracleConnection CN = new OracleConnection(ConnectionString);
CN.Open();
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
  string Query = String.Format(sqlTemplate, 
        sqlSubquery,
        this.dataGridView1.Rows[i].Cells[0].Value,
        this.dataGridView1.Rows[i].Cells[1].Value,
        this.dataGridView1.Rows[i].Cells[2].Value,
        this.dataGridView1.Rows[i].Cells[3].Value);

  Debug.WriteLine(Query);

  OracleCommand cmd = new OracleCommand(Query, CN);
  cmd.ExecuteNonQuery();
}
CN.Close();
于 2013-09-04T14:22:25.003 に答える