如何在 SQL 命令中使用 cmd 参数中的子查询?

How to use subquery inside cmd parameters in SQL commnad?

我有下面显示的代码,我试图根据用户输入将某些值插入数据库。我需要验证用户输入,这就是我使用 SQL 命令插入的原因。

我可以 运行 使用 SQL 适配器,但这似乎不是有效的方法,因为我需要对用户输入进行大量验证.....

问题:

我是这个 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.");
}

你不能。事实上,如果可以的话,那将使您的代码面临大量 SQL Injection 漏洞。这也是为什么你不应该在任何 SQL 查询中直接使用任何用户输入的原因(换句话说,你使用命令参数的全部原因是为了避免这种事情)。

您可以将其转换为存储过程,而不是 Marciej Los 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.");

你不能用你现在使用的 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 语句的另一种形式,您可以在其中 select 将数据插入另一个 table 的 table 中。查看this了解详情。