0

私は、ユーザー入力に基づいて特定の値をデータベースに挿入しようとしているところで、次のコードを表示しています。私はユーザーの入力を検証する必要があるので、挿入のためにSQLコマンドを使用します。SQL commnadのcmdパラメータ内でサブクエリを使用するにはどうすればよいですか?

私は新たなんだ:

問題.....私は、SQLアダプタを使用して、これを実行することができますが、それdoesntのは、私は、ユーザー入力のための検証の多くを作成する必要があるため効率的な方法であるように見えますこのC#には、cmdパラメータでサブクエリを使用する方法がわかりません。誰も私に以下のコードを動作させる方法を教えてもらえますか?

if (MessageBox.Show("Do you really want to Insert these values?", "Confirm Insert", MessageBoxButtons.YesNo) == DialogResult.Yes) 
{ 
    SqlCommand cmd = new SqlCommand(@"Insert INTO " + schemaName + "[TableLogic] (Logic_Formula,Logic_InputsCount,Logic_Inputs,Logic_ConvFactorID) VALUES (@formula, @inputscount, @inputs, @conversionfac)", con); 

    cmd.Parameters.Add("@formula", SqlDbType.NVarChar, 160).Value = textBox_Formula.Text; 
    cmd.Parameters.Add("@inputscount", SqlDbType.Int).Value = numeric_inputscount.Text; 
    cmd.Parameters.Add("@inputs", SqlDbType.NVarChar, 160).Value = textBox_Inputs.Text; 
    cmd.Parameters.Add("@conversionfac", SqlDbType.Int).Value = "(Select ConversionFactorID FROM " + schemaName + "[ConversionFactors] WHERE [conversionFactor_CF] =" + comboBox_ConfacValue.Text + " AND [ConversionFactor_Desc] = '" + combobox_conversionDescription.Text + "')"; 

    int rows = cmd.ExecuteNonQuery(); 
    MessageBox.Show("New Rule is Inserted Successfully."); 
} 
+0

SQL Serverの場合、ストアドプロシージャを使用してください! –

+0

ADO.NETとC#の使い方をよく見てください。そこに記事を投稿する方法や、例を続ける方法がたくさんあります。照会方法の基本を理解したら、クラス内に 'conversionfac'の値を取得して' @ conversionfac'パラメータの値として設定できる新しいメソッドを記述してください。 IE。問題を小さな部分に分割してください。 – Igor

+0

@Igor私はあなたのコメントに同意します...私は "@conversionfac"の値を取得し、コードでそれを使用するSQLコマンドを作成することができます...私は唯一の方法であることを探求するwnatですか?その問題を解消して、コードの行を増やしてください。 –

答えて

2

できません。実際にそうすることができれば、それはあなたのコードを大量のSQL Injectionの脆弱性まで開くことになります。これはまた、どのSQLクエリでもユーザー入力を直接使用しないようにする理由です(言い換えれば、コマンドパラメータを使用している理由はすべてこのようなことを避けることです)。

あなたが代わりにMarciejロス suggestsとして、これは、ストアドプロシージャであることを変換することができますが、迅速かつ汚い何かを探しているなら、これは同様に動作するはず

SqlCommand cmd = new SqlCommand(
    @"DECLARE @conversionfac INT;" + 
    @"SELECT @conversionfac = [ConversionFactorID] FROM " + schemaName + "[ConversionFactors] WHERE [conversionFactor_CF] = @conversionFactor_CF AND [ConversionFactor_Desc] = @combobox_conversionDesc;" + 
    @"INSERT INTO " + schemaName + "[TableLogic] (Logic_Formula,Logic_InputsCount,Logic_Inputs,Logic_ConvFactorID) VALUES (@formula, @inputscount, @inputs, @conversionfac)", con); 

cmd.Parameters.Add("@formula", SqlDbType.NVarChar, 160).Value = textBox_Formula.Text; 
cmd.Parameters.Add("@inputscount", SqlDbType.Int).Value = numeric_inputscount.Text; 
cmd.Parameters.Add("@inputs", SqlDbType.NVarChar, 160).Value = textBox_Inputs.Text; 
cmd.Parameters.Add("@conversionFactor_CF", SqlDbType.Int).Value = comboBox_ConfacValue.Text; 
cmd.Parameters.Add("@combobox_conversionDesc", SqlDbType.Int).Value = combobox_conversionDescription.Text; 
int rows = cmd.ExecuteNonQuery(); 
MessageBox.Show("New Rule is Inserted Successfully."); 
2

あなたはでそれを行うことはできませんINSERT INTOのフォームを使用しています。あなたは、次の

string query = @"INSERT INTO tablelogic 
    (Logic_Formula,Logic_InputsCount,Logic_Inputs,Logic_ConvFactorID) 
    SELECT @formula, @inputscount, @inputs, ConversionFactorID 
    FROM conversionfactors 
    WHERE conversionfactor_cf = @cfcf and conversionfactor_desc = @cfdesc" 

SqlCommand cmd = new SqlCommand(query, con); 

cmd.Parameters.Add("@formula", SqlDbType.NVarChar, 160).Value = textBox_Formula.Text; 
cmd.Parameters.Add("@inputscount", SqlDbType.Int).Value = numeric_inputscount.Text; 
cmd.Parameters.Add("@inputs", SqlDbType.NVarChar, 160).Value = textBox_Inputs.Text; 
cmd.Parameters.Add("@cfcf", SqlDbType.Int).Value = comboBox_ConfacValue.Text; 
cmd.Parameters.Add("@cfdesc", SqlDbType.NVarChar, 160).Value = combobox_conversionDescription.Text; 

これはあなたが別のテーブルからテーブルに挿入されるように、あなたのデータを選択することができますselect文のための別の形態であるようなものを使用することができます。詳細はthisをご覧ください。

関連する問題