我正在用C#编写应用程序,因此我想在包含来自另一个表的外键的表中插入数据。
例如,假设您在商品表的类别表中有外键(category_id),则可以使用这种方式插入数据。
INSERT INTO articles( article_name, article_content, category_id, img, url )
VALUES( '"+textbox1+"','"+textbox2+"' , ( SELECT category_id FROM categories WHERE categories.category_id = '"+textbox5+"') ,"+textbox3+"' , '"+textbox4+"')
这项工作有用吗?
答案 0 :(得分:0)
您会这样做。
INSERT INTO articles( article_name, article_content, category_id, img, url )
SELECT '"+textbox1+"', '"+textbox2+"', category_id, "+textbox3+"' , '"+textbox4+"'
FROM categories
WHERE categories.category_id = '"+textbox5+"'
尽管我不确定为什么您会有categories.category_id = '"+textbox5+"'
并在select的输出中使用categories.category_id
。为什么不只使用似乎已经拥有的categoryId?
但是我在这里看到的主要问题是,似乎您没有使用参数。如果您使用的是ado.net(即SqlConnection,SqlCommand等),则应该传递参数而不创建串联的字符串。参见How can I add user-supplied input to an SQL statement?
答案 1 :(得分:0)
永远不要连接字符串以在您的身体上生成查询此纹身的东西。 这是您的代码和查询应与SQL Server交互的方式。
private int InsertRecord(string articleName, string articleContent, string cId, string img, string url)
{
int rA;
using (var con = new SqlConnection(@"YOUR CONNECTION STRING GOES HERE"))
{
using(var cmd = new SqlCommand("INSERT INTO Articles (article_name, article_content, category_id, img, url) values (@aName, @aContent, (SELECT category_id FROM categories WHERE categories.category_id = @cId), @img, @url)", con))
{
cmd.Parameters.AddWithValue("@aName", articleName);
cmd.Parameters.AddWithValue("@aContent", articleContent);
cmd.Parameters.AddWithValue("@cId", cId);
cmd.Parameters.AddWithValue("@img", img);
cmd.Parameters.AddWithValue("@url", url);
con.Open();
rA = cmd.ExecuteNonQuery();
con.Close();
}
}
return rA;
}
如果通过查询的字符串串联操作, ADO.NET
极易受到SQL Injections
的攻击。
另一件事是再次对SQL使用Stored Procedures
,这也将基于对SqlCommand
进行参数化。