【问题标题】:How to insert value into primary key identity column in SQL through C#?如何通过 C# 将值插入 SQL 中的主键标识列?
【发布时间】:2013-12-03 13:51:46
【问题描述】:

(我的问题解决了。几乎每个人都说我必须删除 @OB_ID 并将其留给 SQL 来分配值。)

我想通过 C# 代码向 SQL 数据库中的表中插入一条新记录。主键是身份。如何让 Visual Studio 理解该列是标识,因此 SQL Server 必须设置该值。相关代码如下:

SqlConnection sqlc = new SqlConnection();
sqlc.ConnectionString = "Data Source=. ; Database=LDatabase; Integrated Security=true;";

SqlCommand cmd2 = new SqlCommand("INSERT INTO Order_Book VALUES(@OB_ID, @OB_Title, @OB_Author, @OB_TranslatedBy, @OB_Publisher)", sqlc);//@OB_ID is indentity primary key
            cmd2.Parameters.AddWithValue("@OB_ID", );//What should I assign to it?
            cmd2.Parameters.AddWithValue("@OB_Title", "%" + txtboxbook.Text + "%");
            cmd2.Parameters.AddWithValue("@OB_Author", "%" + txtboxAuthor.Text + "%");
            cmd2.Parameters.AddWithValue("@OB_TranslatedBy", "%" + txtboxTranslator.Text + "%");
            cmd2.Parameters.AddWithValue("@OB_Publisher", "%" + txtboxPublisher.Text + "%");
            sqlc.Open();
            cmd2.ExecuteNonQuery();
            sqlc.Close();

任何帮助将不胜感激。

【问题讨论】:

  • 你不需要添加任何东西。删除@OB_ID,SQL Server 将知道按顺序添加下一个键。
  • 我这样做了。这是我收到的错误:“必须声明标量变量“@OB_ID””
  • 从 SQL 命令文本中删除@OB_ID
  • 正如@Steve 所说,您需要删除对它的所有引用。 SQL Server 会处理它。例如,请参阅我的答案。
  • 附带说明一下,在 INSERT 语句中使用 % 通配符的目的是什么?

标签: c# asp.net sql-server ado.net


【解决方案1】:

您可以忽略IDENTITY 列,因为它将插入by default

试试这个

SqlConnection sqlc = new SqlConnection();
sqlc.ConnectionString = "Data Source=. ; Database=LDatabase; Integrated Security=true;";
SqlCommand cmd2 = new SqlCommand("INSERT INTO Order_Book VALUES(@OB_Title, @OB_Author, @OB_TranslatedBy, @OB_Publisher)", sqlc);//@OB_ID is indentity primary key

cmd2.Parameters.AddWithValue("@OB_Title", "%" + txtboxbook.Text + "%");
cmd2.Parameters.AddWithValue("@OB_Author", "%" + txtboxAuthor.Text + "%");
cmd2.Parameters.AddWithValue("@OB_TranslatedBy", "%" + txtboxTranslator.Text + "%");
cmd2.Parameters.AddWithValue("@OB_Publisher", "%" + txtboxPublisher.Text + "%");
sqlc.Open();
cmd2.ExecuteNonQuery();
sqlc.Close();

【讨论】:

    【解决方案2】:

    您无需添加任何内容,因为 SQL Server 会自动递增并分配 Identity 字段。因此,只需删除@OB_ID,SQL Server 就会知道按顺序添加下一个键,所以...

    SqlConnection sqlc = new SqlConnection();
    sqlc.ConnectionString = "Data Source=. ; Database=LDatabase; Integrated Security=true;";
    
    SqlCommand cmd2 = new SqlCommand("INSERT INTO Order_Book VALUES(@OB_Title, @OB_Author,     @OB_TranslatedBy, @OB_Publisher)", sqlc);
            cmd2.Parameters.AddWithValue("@OB_Title", "%" + txtboxbook.Text + "%");
            cmd2.Parameters.AddWithValue("@OB_Author", "%" + txtboxAuthor.Text + "%");
            cmd2.Parameters.AddWithValue("@OB_TranslatedBy", "%" + txtboxTranslator.Text + "%");
            cmd2.Parameters.AddWithValue("@OB_Publisher", "%" + txtboxPublisher.Text + "%");
            sqlc.Open();
            cmd2.ExecuteNonQuery();
            sqlc.Close();
    

    【讨论】:

      【解决方案3】:

      您没有将 id 放入您的请求中。 SQLServer 将在插入时添加良好的标识。

      SqlConnection sqlc = new SqlConnection();
      sqlc.ConnectionString = "Data Source=. ; Database=LDatabase; Integrated Security=true;";
      
      SqlCommand cmd2 = new SqlCommand("INSERT INTO Order_Book VALUES( @OB_Title,    @OB_Author, @OB_TranslatedBy, @OB_Publisher)", sqlc);//@OB_ID is indentity primary key
              cmd2.Parameters.AddWithValue("@OB_Title", "%" + txtboxbook.Text + "%");
              cmd2.Parameters.AddWithValue("@OB_Author", "%" + txtboxAuthor.Text + "%");
              cmd2.Parameters.AddWithValue("@OB_TranslatedBy", "%" + txtboxTranslator.Text +  "%");
              cmd2.Parameters.AddWithValue("@OB_Publisher", "%" + txtboxPublisher.Text + "%");
              sqlc.Open();
              cmd2.ExecuteNonQuery();
              sqlc.Close();
      

      【讨论】:

        【解决方案4】:

        替换关注

        SqlCommand cmd2 = new SqlCommand("INSERT INTO Order_Book VALUES( @OB_Title,    @OB_Author, @OB_TranslatedBy, @OB_Publisher)", sqlc);
        //@OB_ID is indentity primary key
        


        SqlCommand cmd2 = new SqlCommand("SET IDENTITY_INSERT Order_Book ON;INSERT INTO Order_Book VALUES( @OB_Title,    @OB_Author, @OB_TranslatedBy, @OB_Publisher);SET IDENTITY_INSERT Order_Book OFF;", sqlc);
         //@OB_ID is indentity primary key
        

        【讨论】:

        • 谢谢。我的问题解决了。但我将您的解决方案牢记在心。看起来很方便。
        猜你喜欢
        • 1970-01-01
        • 2018-07-11
        • 2018-07-01
        • 1970-01-01
        • 2013-05-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-14
        相关资源
        最近更新 更多