0

Excel を使用して出席シートを準備しようとしています。ファイルを .csv 形式でさらに保存したいのですが、これを mysql とリンクします。jdbc プログラムを使用してテーブル名を動的に作成するにはどうすればよいですか。どんな助けでも大歓迎です。

4

2 に答える 2

2

「文字列バッシング」でSQLを生成する必要があります。例えば:

   String tableName = ...
   String createTableSQL = "Create table " + tableName;
   Statement statement = connection.createStatement(createTableSQL);
   statememt.execute();

等々。

警告: このアプローチにはリスクがあります。特に、ユーザーが入力したり、スプレッドシートや CSV などから読み取った文字列に基づいてテーブル名を生成すると、実際には SQL ステートメントである文字列を入力する可能性があります。最終的な結果として、プログラムをだましてデータベースに対して有害な SQL を実行させる可能性があります。

これに対する通常の防御策は、PreparedStatement を使用し、SQL でユーザーが指定したすべての詳細にプレースホルダーを使用することです。残念ながら、これは SQL 値を注入する場合にのみ機能します。テーブル名、列名、その他のさまざまなものではこれを行うことはできません。

于 2013-08-03T07:49:38.877 に答える
1

とを使用して.sql+shellスクリプトを作成できます。mysql command-line-clientmysql-dataloader

スケルトンは次のようになります。

  • .csvアプリケーションを使用して名前が付けられたファイルを生成attendence_dd_mm_yyyy.csvします。
  • 'Shell Command': いくつかのロジック (例) に基づいて table_name を作成しますattendence_dd_mm_yyyy
  • 「Mysql コマンド」: を使用しmysql -u usename -ppassword -e <Create table tablename> <fixed columns>ます。
  • 'Data-loader':mysql -u usename -ppassword -e LOAD DATA INFILE ...新しく作成されたテーブルに csv をロードするために使用します。

私はまだこのオプションを提案しているトピックから少し外れていることを知っています。

  • データローダーは非常に高速で、すぐに利用できます。
  • テーブルの作成後に行わなければならないデータのロードの問題を解決します。
  • DDL permissionアプリケーション コードに与える必要はありません。コードが入っinfinite loopたり、似たようなものがあると、問題が発生する可能性があります。
  • 問題はpropagate to DB、接続されている他のアプリケーション (存在する場合) にも影響します。
  • あなたのアプリケーションが Web アプリケーションまたは類似のアプリケーションである場合、それがあなたのアプローチに適していますSQL-InjectionHUGE CONCERN

他のデータベースを使用している場合は、同様の行で作業してください。

于 2013-08-03T07:54:23.633 に答える