插入自增字段

4

我有一个名为Insert()的方法。除了自增外,一切都按预期工作。以下是代码:

public void Insert(string m1,int y1,int new_count)
    {
        string query = "INSERT INTO page_counter (id,month,year,page_count) VALUES('','"+m1+"',"+y1+","+new_count+")";

            //create command and assign the query and connection from the constructor
            MySqlCommand cmd = new MySqlCommand(query, connection);

            //Execute command
            cmd.ExecuteNonQuery();

            //close connection
            this.CloseConnection();
    }  

我的ID列是自动递增的。那么我的问题是,如何将值插入数据库并使表中的ID继续自动递增?

6个回答

4

只需不指定id的值:

string query = "INSERT INTO page_counter (month,year,page_count) VALUES('"+m1+"',"+y1+","+new_count+")";

请考虑更好的方法,使用参数化查询代替连接查询字符串。


3

您只需要在插入时排除自增的IDENTITY列即可。

将您的query更改为:

//NOTE: We leave the "id" column out of the insert, SQL Server will handle this automatically
string query = "INSERT INTO page_counter (month, year, page_count) VALUES (@Month, @Year, @PageCount)";

SQL会处理ID字段。

您可能注意到我在查询中使用了Scalar变量。您可以(也应该)在命令中分配这些变量,以避免SQL注入的可能性:

由于这是来自MySql.Data.MySqlClient PRE 4.0,因此进行编辑

MySqlCommand cmd = new MySqlCommand(query, connection);

cmd.Parameters.Add(new MySqlParameter("@Month", m1));
cmd.Parameters.Add(new MySqlParameter("@Year", y1));
cmd.Parameters.Add(new MySqlParameter("@PageCount", new_count));

//Execute the INSERT
cmd.ExecuteNonQuery();

关于SQL注入的背景知识,我建议阅读以下内容:

  1. W3Schools上的SQL注入
  2. SO上为什么要使用参数化SQL

你能逻辑地告诉我,我的方法和使用@符号之间实际上有什么区别吗? - Ren
在你的方法中,有人可以直接将恶意代码注入到值m1y1中。考虑一下如果他们把这个写进了你获取m1的任何地方:'; DROP TABLE USERS; 因为恶意用户附加了文本到你的字符串,你的代码会直接在服务器上执行那段代码。使用参数化SQL可以确保没有人可以直接插入SQL命令到查询中。你把查询从字符串文字中拿出来,并将数据视为数据而不是文本。 - Evan L
@Ren 上面的内容应该会给你一些见解,并且我在我的回答中添加了一些链接。虽然需要打更多字,但是总的来说,使用参数化SQL可以避免安全问题和许多语法/数据类型错误,特别是当你开始使用更复杂的INSERTS/UPDATES时。 此外,SQL注入甚至可能发生在最无害的查询中,比如: SELECT customer_id FROM customer 等等... - Evan L
它应该放在 MySqlCommand cmd = new MySqlCommand 块下面,但在 cmd.ExecuteNonQuery 之前。语法如下:cmd.Parameters.AddWithValue("@MyParameter", theValueIWantToAssign); 确保在 @Parameter 周围加上引号。如果您直接复制/粘贴我的代码,它应该可以工作。 - Evan L
"MySql.Data.MySqlClient.MySqlParameterCollection"没有定义"AddWithValue",也没有找到接受类型为"MySql.Data.MySqlClient.MySqlParameterCollection"的第一个参数的扩展方法"AddWithValue"(是否缺少使用指令或程序集引用?) - Ren
显示剩余5条评论

3

使用自增

未指定AUTO_INCREMENT列的值,因此MySQL会自动分配序列号。

string query = "INSERT INTO page_counter (month,year,page_count)
VALUES('"+m1+"',"+y1+","+new_count+")";

您可以始终使用参数化查询来避免SQL注入

string query = "INSERT INTO page_counter (month,year,page_count)
VALUES(@month,@year,@page_count)";

cmd.Parameters.AddWithValue("@month",Value1);
cmd.Parameters.AddWithValue("@year", Value2);
cmd.Parameters.AddWithValue("@page_count", Value3);

1

1
您可以在数据库中更改id的身份。
"INSERT INTO page_counter (month,year,page_count) VALUES('"+m1+"',"+y1+","+new_count+")"

1

从这里不要指定ID:

如果您使用的是SQL Server,请按以下方式创建DB中的ID字段:

ID int IDENTITY(1,1) PRIMARY KEY

如果使用MySQL,则:

ID int NOT NULL AUTO_INCREMENT

请参阅以下链接: http://www.w3schools.com/sql/sql_autoincrement.asp


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接