如何在 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了解详情。
我有下面显示的代码,我试图根据用户输入将某些值插入数据库。我需要验证用户输入,这就是我使用 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了解详情。