在包含外键的表中插入数据

时间:2019-01-17 18:39:35

标签: c# asp.net sql-server

我正在用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+"')

这项工作有用吗?

2 个答案:

答案 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进行参数化。