0

csv ファイルをデータベースへの一連の挿入ステートメントに変換する小さなプログラムを作成しています。プログラムはデータベースの知識を持たないため、記述されたステートメントは 1 回限りのものであり、動的にすることはできません。

現在、各データセットには独自の GUID があり、その名前に基づいてデータセットが存在するかどうかを判断するために、ステートメントでデータベースにクエリを実行させたいと考えています。ので、私は持っています:

sw.WriteLine("-- Determine if dataset exists from school name");
sw.WriteLine(string.Format(
"INSERT INTO DataSets (Guid, DataSets ) VALUES ('{0}', '{1}') WHERE NOT EXISTS (SELECT * FROM DataSets WHERE DataSetName = '{1}')",
Guid,
DataSetName 
));

(間違っている場合は訂正してください。SQL は私の得意分野ではありません) さて、次の問題は、データセットの Guid が次のような他のいくつかのテーブルで使用されていることです。

string sql = string.Format(
                    "INSERT INTO Table1 VALUES ('{0}', '{1}', '{2}', {3}, '{4}');",
                    object.value1
                    object.value1
                    object.value1
                    object.value1
                    Guid

ただし、'Guid' は c# の変数として使用できません。新しい Guid ('datasets' がデータベースに存在しない場合) または既存の GUID ('datasets' が存在する場合は、既存の GUID を取得します) のいずれかです。

だから私は次のようなものが必要になります:

string sql = string.Format(
                    "INSERT INTO Table1 (Data1, Data2, Data3, Data4) VALUES ('{0}', '{1}', '{2}', {3});",
                    object.value1
                    object.value1
                    object.value1
                    object.value1
string sql2 = string.Format("INSERT INTO Table1 (Data5) VALUES (SELECT Guid FROM Datasets WHERE DataSetName = '{0}');
                    Guid
                    );

これは、これを行うための良い (有効な?) 方法ですか?

4

1 に答える 1

2

まず第一に、他の人が指摘したように、SQL インジェクションに対してオープンであるため、SqlCommand のパラメーターを使用する方が良い選択です。多くの例を見つけることができます。

ただし、コードがcsvを挿入に変換するためだけのものであり、誰かがプログラムをハッキングしようとする可能性が非常に低い場合は、問題ないと思います.

基本的に、あなたが説明したことは問題ありません。しかし

   string sql2 = string.Format("INSERT INTO Table1 (Data5) VALUES (SELECT Guid FROM Datasets WHERE DataSetName = '{0}');
                Guid
                );

最初にそれがguidまたはnullを返すかどうかを確認する必要があります

   SELECT Guid FROM Datasets WHERE DataSetName = '{0}'

次に、新しい GUID を作成して挿入するかどうかを決定します。

一度だけインポートする場合は、GUID が存在するかどうかを確認する必要さえありません。コードから GUID を作成し、SQL に挿入します。それはguidだからです。理論的にはゼロではありませんが、1回のバッチで同じguidを作成する確率は非常に小さいです。

  • データベースに既にどの GUID があるかを知る必要がない場合は、データベースに接続する必要はありません (つまり、一度インポートするだけで済みます)。使用したトラックすべての GUID のリストを使用できます。
于 2012-12-04T23:34:21.090 に答える