query = 1中的列数,表中的列数= 2

时间:2012-01-02 11:52:41

标签: c# .net sql-server windows

我试图在数据库中的表(RamResults)中插入一个int值,db结构如下:

表格列:
ID(主键)
结果(int类型)

在C#中,我尝试在Results列中插入一个值:

// Retrieve the connection string from the settings file.
string conString = Properties.Settings.Default.MyDBConnectionString;

// Open the connection using the connection string.
using (SqlCeConnection con = new SqlCeConnection(conString))
{
    con.Open();

    // Insert into the SqlCe table. ExecuteNonQuery is best for inserts.
    int num = 5;
    using (SqlCeCommand com = new SqlCeCommand(
                              "INSERT INTO RamResults VALUES(@num)", con))
    {
        com.Parameters.AddWithValue("@num", num);
        com.ExecuteNonQuery();
    }
}

但是我收到以下错误:

  

查询和表中的列数必须匹配。 [数量   query = 1中的列数,表中的列数= 2]

我的印象是主键(ID)不需要插入任何数据,因为它会自动在该列中分配一个ID号?

修改

假设我需要自动增加PK,我在VS 2010中编辑表模式时看不到如何执行此操作:

enter image description here

9 个答案:

答案 0 :(得分:2)

作为主键的ID 不会自动插入值,除非您将其设置为AutoIncrement。

<强>更新

根据架构,ID的数据类型为 UniqueIdentifier ,请尝试将其更改为整数 Int ,您可以将Is Identity设置为 True

答案 1 :(得分:1)

这是完全正确的。你的消息告诉你pk没有自动生成。

查找Identity columns。创建一个自动或提供值。

答案 2 :(得分:1)

在您的情况下该ID的标识不是IDENTITY 自动递增值,您应该明确指定其值

INSERT INTO RamResults(Id, Results) VALUES(@Id, @num)

当然,你应该手动提供@id参数的值

应将DEFAULT放置在您的案例中的Id列 - 或NEWID()NEWSEQUENTIALID()

在这种情况下,您的查询应如下所示:

INSERT INTO RamResults(Id, Results) VALUES(DEFAULT, @num)
没有DEFAULT约束的

OR

INSERT INTO RamResults(Id, Results) VALUES(NEWID(), @num)

答案 3 :(得分:1)

在INSERT查询中指定列

INSERT INTO table_name (column1, column2, column3,...)
VALUES (value1, value2, value3,...)

参考: http://www.w3schools.com/sql/sql_insert.asp

答案 4 :(得分:1)

在表设计器中将ID列设置为“Identity”。这样做会自动插入增量ID。

答案 5 :(得分:0)

您只需在identity时插入primekey(Id)列值。它不是默认的。

答案 6 :(得分:0)

也许,如果你明确指定列?

INSERT INTO RamResults
(Results)
VALUES (@num)

答案 7 :(得分:0)

Do not specify the column Id if it is primary key and Identity is true, then it will work fine
private void btn_submit_Click(object sender, EventArgs e)   
    {
        con.Open();
        SqlCeCommand com = new SqlCeCommand("insert into Result(Name,RollNo,Age,Trade,Marks) values(@name,@rollno,@age,@trade,@marks)", con);
        com.CommandType = CommandType.Text;
        com.Parameters.AddWithValue("@name", name_txt.Text);
        com.Parameters.AddWithValue("@rollno", roll_txt.Text);
        com.Parameters.AddWithValue("@age", age_txt.Text);
        com.Parameters.AddWithValue("@trade", trade_txt.Text);
        com.Parameters.AddWithValue("@marks", marks_txt.Text);
        com.ExecuteNonQuery();
        MessageBox.Show("Submitted");
    }

答案 8 :(得分:0)

query = 1中的列数,表中的列数= 2如果您想将结果参数传递给查询,则必须自动增加DB中的Id字段并将ID的类型更改为int

<强>建议 我建议您使用实体框架和使用存储过程来查询数据库,而不是在使用存储过程时在C#中键入代码,这样可以增强应用程序的安全性和代码的重用能力。您还可以选择使用简单的Linq查询来访问数据库,并调用简单的add方法来添加。