2017-05-13 16 views
0

私は答えを探しましたが、私が見つけた解決策はSQLiteではうまくいきませんでした。 テーブルを作成するユーザーによって定義された名前と列を使用して、SQLiteデータベースに異なるテーブルを作成したいとします。SQLiteは、C#で変数名のテーブルを作成します

私は、後でテストできるリストを作成することで、ユーザーが言語に関する知識をテストできるプロジェクトに取り組んでいます。リストはデータベースに別のテーブルとして保存する必要があります。

Image of the UI

だから私は「txtNaamLijst.Text」テキストボックスに等しいテーブル名とデータベース内の各リストを保存したいです。 それに加えて、ユーザーが定義したように、列に "txtTaal1.Text" en "txtTaal2.Text"という名前を付けるようにします。

私が書いたスクリプトは機能しません。ウェブ上で見つけたスクリプトもうまくいきませんでした。あなたは、テーブル名のパラメータとして@naamを使用し、両方のクエリで

protected void btnSave_Click(object sender, EventArgs e) 
{ 
    using (System.Data.SQLite.SQLiteConnection conn = new System.Data.SQLite.SQLiteConnection("Data Source=C:/Users/elias/Documents/Visual Studio 2017/WebSites/WebSite7/App_Data/overhoren.db")) 
    { 
     using (System.Data.SQLite.SQLiteCommand cmd = new System.Data.SQLite.SQLiteCommand(conn)) 
     { 
      string naam = txtNaamLijst.Text; 
      string taal1 = txtTaal1.Text; 
      string taal2 = txtTaal2.Text; 
      string veld1 = txtVeld1.Text; 
      string veld1v2 = txtVeld1v2.Text; 
      string veld2 = txtVeld2.Text; 
      string veld2v2 = txtVeld2v2.Text; 
      string veld3 = txtVeld3.Text; 
      string veld3v2 = txtVeld3v2.Text; 
      string veld4 = txtVeld4.Text; 
      string veld4v2 = txtVeld4v2.Text; 
      string veld5 = txtVeld5.Text; 
      string veld5v2 = txtVeld5v2.Text; 
      string veld6 = txtVeld6.Text; 
      string veld6v2 = txtVeld6v2.Text; 

      conn.Open(); 
      cmd.CommandType = System.Data.CommandType.Text; 
      cmd.Parameters.AddWithValue("@naam", naam); 
      cmd.Parameters.AddWithValue("@taal1", taal1); 
      cmd.Parameters.AddWithValue("@taal2", taal2); 
      cmd.Parameters.AddWithValue("@veld1", veld1); 
      cmd.Parameters.AddWithValue("@veld1v2", veld1v2); 
      cmd.Parameters.AddWithValue("@veld2", veld2); 
      cmd.Parameters.AddWithValue("@veld2v2", veld2v2); 
      cmd.Parameters.AddWithValue("@veld3", veld3); 
      cmd.Parameters.AddWithValue("@veld3v2", veld3v2); 
      cmd.Parameters.AddWithValue("@veld4", veld4); 
      cmd.Parameters.AddWithValue("@veld4v2", veld4v2); 
      cmd.Parameters.AddWithValue("@veld5", veld5); 
      cmd.Parameters.AddWithValue("@veld5v2", veld5v2); 
      cmd.Parameters.AddWithValue("@veld6", veld6); 
      cmd.Parameters.AddWithValue("@veld6v2", veld6v2); 

      cmd.CommandText = "CREATE TABLE IF NOT EXISTS @naam (@taal1 VARCHAR(50), @taal2, VARCHAR(50))"; 
      cmd.CommandText = "INSERT INTO @naam (@taal1, @taal2) SELECT @veld1 , @veld1v2 UNION ALL SELECT @veld2 , @veld2v2 UNION ALL SELECT @veld3 , @veld3v2 UNION ALL SELECT @veld4 , @veld4v2 UNION ALL SELECT @veld5 , @veld5v2 UNION ALL SELECT @veld6 , @veld6v2"; 

      cmd.Connection = conn; 
      cmd.ExecuteNonQuery(); 
      conn.Close();` 
     } 
    } 
} 
+0

パラメータを使用してテーブル名とカラム名を表すことはできません。 – Steve

+0

意図した結果の代わりに何が起こっていますか? – stybl

+0

@Styそれは "@naam"の近くにあります:構文エラー... – ielaajez

答えて

1

:私は、私はC#のを使用しているため、単一の行で私のSQLiteのコマンドを記述する必要があります。

cmd.CommandText = "CREATE TABLE IF NOT EXISTS @naam..." 
cmd.CommandText = "INSERT INTO @naam..." 
cmd.Parameters.AddWithValue("@naam", naam); 

残念ながら、テーブル名をパラメータ化することはできません。ユーザーSoner Gönülthis答えによく入れてください。彼はかなりの情報しか持っていませんが、その要点は次のとおりです。

テーブル名、列名、またはその他のデータオブジェクトをパラメータ化することはできません。値のパラメータ化のみが可能です。今

、それが変数テーブル名を持つように書式設定/昔ながらの文字列の濃度を使用する可能ですが、それはSQL injectionに対して脆弱あなたを残しているが、良いアイデアではありません。

+0

変数名と列を持つ表を作成する場合、ユーザーがリスト用の表を作成できるようにするにはどうすればよいでしょうか? – ielaajez

+0

一般的に、それは良い考えではないので不可能です。これはセキュリティ上の悪夢ですが、サポートの努力は恐ろしいものになります。あらかじめ定義されたカスタムフィールドのようなものを見てください。 (すなわち、CustomString1、CustomString2、CustomString3、CustomMoney1など)、またはEntity-Attribute-Value(EAV)のようなものです。 –

+0

努力したい場合は、文字列メソッドを使用して、独自の入力をサニタイズすることができます(SQLインジェクションの例と予防についての豊富な資料、[Bobby Tables](http://bobby-tables.com /) 頭に浮かぶ)。 – stybl

関連する問題