1

自動識別が設定された主キーであるIDという列を持つ単純なテストデータベースがあります。

sqladapter を使用して作成したデータテーブルに新しい行を追加しようとしています

新しい行の ID 列を空のままにしておくと、SQL がそれを追加すると考えて、次のエラーが表示されます。

"Column "ID" doesn't not allow nulls

私はそれを解決しましたが、IDに次のような値を与えますdr["ID"] = 99999

そしてそれはうまくいきましたが、SQLデータベースは値を無視して正しい番号を与えるだけですが、データテーブルには99999のIDがあり、混乱を招き、別のレコードを挿入しようとするとエラーが発生する可能性があります

どうすればこの問題を解決できますか?

申し訳ありません:

            DataRow dr = dt.NewRow();
            dr["Name"] = "fds";//E.Name;
            dr["Age"] = 12;// E.Age;
            dr["DateOfBirth"] = "1-1-1999";// E.DoB;
            //dr["ID"] = 99999;
            dt.Rows.InsertAt(dr, dt.Rows.Count - 1);
            DBOperations.UpdateTable(dt);
            MessageBox.Show("Record added successfully");

    static internal void UpdateTable(DataTable dt)
    {
        SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString);
        SqlDataAdapter Adapter = new SqlDataAdapter();
        Adapter.SelectCommand = new SqlCommand("select * from Emp",con); 
        Adapter.UpdateCommand = new SqlCommandBuilder(Adapter).GetUpdateCommand();
        Adapter.InsertCommand = new SqlCommandBuilder(Adapter).GetInsertCommand();
        Adapter.DeleteCommand = new SqlCommandBuilder(Adapter).GetDeleteCommand();
        Adapter.Update(dt);
    }

DB スクリプト:

USE [HR]
GO
/****** Object:  Table [dbo].[Emp]    Script Date: 2/12/2013 8:10:49 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Emp](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](max) NOT NULL,
    [Age] [int] NOT NULL,
    [DateOfBirth] [date] NOT NULL,
 CONSTRAINT [PK_Emp] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

スクリーンショット: ここに画像の説明を入力

4

2 に答える 2

3

次の 3 つの点を確認してください。

1)あなたは試すことができます

dt.Rows.Add(dr);

それ以外の

dt.Rows.InsertAt(dr, dt.Rows.Count - 1);

2) テーブルに対して INSERT ステートメントを実行すると、SQL Server は新しい ID を作成し、エラーなしでステートメントを完了しますか? お気に入り

INSERT INTO tb_mytable (Name, Age) VALUES ('fds', 12) 

そうでない場合は、ID フィールドに問題がある可能性があります。

3) アダプターの (作成された) 挿入コマンドが正しいことを確認しましたか?

編集: また、CommandBuilder を使用する代わりに、このように Insert コマンドを手動で作成してみて、何が起こるかを確認することもできます。これが正常に機能している場合は、CommandBuilder に問題があります。

string sql  = "INSERT INTO [dbo].[emp] ";
sql += "(Name, Age, DateOfBirth) ";
sql += "Values (@Name, @Age, @DateOfBirth)";

SqlCommand insertCommand = new SqlCommand();
insertCommand.CommandText = sql;

SqlParameter paramName = new SqlParameter();
paramName.ParameterName = "@Name";
paramName.DbType = DbType.AnsiString;
paramName.SqlDbType = SqlDbType.NVarChar;
paramName.SourceVersion = DataRowVersion.Current;
paramName.SourceColumn = "Name";

SqlParameter paramAge = new SqlParameter();
paramAge.ParameterName = "@Age";
paramAge.DbType = DbType.Int32;
paramAge.SqlDbType = SqlDbType.Int;
paramAge.SourceVersion = DataRowVersion.Current;
paramAge.SourceColumn = "Age";

SqlParameter paramDoB = new SqlParameter();
paramDoB.ParameterName = "@DateOfBirth";
paramDoB.DbType = DbType.Date;
paramDoB.SqlDbType = SqlDbType.Date;
paramDoB.SourceVersion = DataRowVersion.Current;
paramDoB.SourceColumn = "DateOfBirth";

insertCommand.Parameters.Add(paramName);
insertCommand.Parameters.Add(paramAge);
insertCommand.Parameters.Add(paramDoB);

Adapter.InsertCommand = insertCommand;
于 2013-02-12T18:22:39.093 に答える
1

エラーは、データベースからではなく、DataAdapter から発生していると確信しています。http://msdn.microsoft.com/en-us/library/ms971502.aspxを参照して ください。

于 2013-02-12T18:59:25.270 に答える