【解決方法】System.data.sqlclient.sqlException: ‘列名または指定された値の数がテーブル定義と一致しません。’


インターフェイスを通じて値を追加しようとすると、次のエラーが発生します: System.Data.SqlClient.SqlException: ‘列名または指定された値の数がテーブル定義と一致しません。’

私が試したこと:

C#
private void button1_Click(object sender, EventArgs e)
{
    SqlConnection con = new SqlConnection("Data Source=OPCOSQL\\OPCOSQL;Initial Catalog=OPCO-SQL;Integrated Security=True;Pooling=False");
    con.Open();
    SqlCommand cmd = new SqlCommand("insert into [Table] values(@Utilizador,@Nome,@Disco,@Processador,@Memória,@Tipo,@Localização)", con);
    cmd.Parameters.AddWithValue("@Utilizador", textBox1.Text);
    cmd.Parameters.AddWithValue("@Nome", textBox2.Text);
    cmd.Parameters.AddWithValue("@Disco", textBox3.Text);
    cmd.Parameters.AddWithValue("@Processador", textBox4.Text);
    cmd.Parameters.AddWithValue("@Memória", textBox5.Text);
    cmd.Parameters.AddWithValue("@Tipo", textBox6.Text);
    cmd.Parameters.AddWithValue("@Localização", textBox7.Text);
    cmd.ExecuteNonQuery();
    con.Close();
}
SQL
CREATE TABLE [dbo].[Table] (
    [AssetNumber] INT           NOT NULL IDENTITY,
    [Utilizador]        VARCHAR(50) NULL,
    [Nome]        VARCHAR(50)    NULL,
    [Disco]       VARCHAR(50)           NULL,
    [Processador] VARCHAR(50)  NULL,
    [Memória]     VARCHAR(50)           NULL,
    [Tipo]        VARCHAR(50)    NULL,
    [Localização] VARCHAR(50)    NULL, 
    CONSTRAINT [PK_Table] PRIMARY KEY ([AssetNumber])
);

解決策 2

INSERT コマンドに列名をリストしません。

SQL
INSERT INTO MyTable VALUES ( ... )

したがって、すべての列に値が必要です。これは、エンジンが最後に実行された CREATE または ALTER テーブルの列順序で値を挿入しようとすることを意味します。
後続の ALTER TABLE ステートメントによってそれが変更され、データベースの整合性が損なわれる可能性があるため、これは悪い考えです。
この場合、最初の列が IDENTITY 列であり、そこにまったく書き込むことができないため、状況はさらに悪くなります。

パラメーターが指定される順序で列をリストすると、機能し、将来の保証になります。

SQL
INSERT INTO MyTable (Column1, Column2, ... ) VALUES ( ... )

新しいコードを提供した後:

SSMS でコードを試してみると:

SQL
CREATE TABLE [dbo].[Table] (
    [AssetNumber] INT           NOT NULL IDENTITY,
    [Utilizador]        VARCHAR(50) NULL,
    [Nome]        VARCHAR(50)    NULL,
    [Disco]       VARCHAR(50)           NULL,
    [Processador] VARCHAR(50)  NULL,
    [Memória]     VARCHAR(50)           NULL,
    [Tipo]        VARCHAR(50)    NULL,
    [Localização] VARCHAR(50)    NULL, 
    CONSTRAINT [PK_Table] PRIMARY KEY ([AssetNumber])
SQL
insert into dbo.[Table] ([Utilizador], [Nome], [Disco], [Processador], [Memória], [Tipo], [Localização]) values ('@Utilizador', '@Nome', '@Disco', '@Processador', '@Memória', '@Tipo', '@Localização')

その後、完全に挿入され、その後テーブルにクエリを実行すると、期待どおりのものが得られます。

1	@Utilizador	@Nome	@Disco	@Processador	@Memória	@Tipo	@Localização

それで…SSMSから始めて、正しいDB、正しいテーブルを使用していること、そして列があなたが示したCREATEステートメントと一致していることを確認してください。

解決策 1

8 つの列を持つテーブルに 7 つの値を挿入しようとしています。

ただし、最初の列に値を挿入することはできません。 IDENTITY 桁。

変更してください INSERT ステートメントを使用して、挿入先の列を明示的に指定します。

SQL
insert into [Table] ([Utilizador], [Nome], [Disco], [Processador], [Memória], [Tipo], [Localização]) values (@Utilizador, @Nome, @Disco, @Processador, @Memória, @Tipo, @Localização)

コメント

タイトルとURLをコピーしました